pof_scene_main.c 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "../portal_of_flipper_i.h"
  2. #include "../pof_token.h"
  3. enum SubmenuIndex {
  4. SubmenuIndexLoad = POF_TOKEN_LIMIT,
  5. };
  6. void pof_scene_main_submenu_callback(void* context, uint32_t index) {
  7. PoFApp* pof = context;
  8. view_dispatcher_send_custom_event(pof->view_dispatcher, index);
  9. }
  10. void pof_scene_main_on_update(void* context) {
  11. PoFApp* pof = context;
  12. VirtualPortal* virtual_portal = pof->virtual_portal;
  13. Submenu* submenu = pof->submenu;
  14. submenu_reset(pof->submenu);
  15. FuriString* token_name = furi_string_alloc();
  16. if(pof->pof_usb) {
  17. int count = 0;
  18. for(int i = 0; i < POF_TOKEN_LIMIT; i++) {
  19. if(virtual_portal->tokens[i]->loaded) {
  20. PoFToken* pof_token = virtual_portal->tokens[i];
  21. furi_string_reset(token_name);
  22. //TODO: only do if debug mode
  23. furi_string_cat_printf(token_name, "%d: %s", i, pof_token->dev_name);
  24. // Unload figure
  25. submenu_add_item(
  26. submenu,
  27. furi_string_get_cstr(token_name),
  28. i,
  29. pof_scene_main_submenu_callback,
  30. pof);
  31. count++;
  32. }
  33. }
  34. if(count < POF_TOKEN_LIMIT) {
  35. submenu_add_item(
  36. submenu, "<Load figure>", SubmenuIndexLoad, pof_scene_main_submenu_callback, pof);
  37. }
  38. submenu_set_selected_item(
  39. submenu, scene_manager_get_scene_state(pof->scene_manager, PoFSceneMain));
  40. } else {
  41. submenu_add_item(
  42. submenu, "Failed to start", SubmenuIndexLoad, pof_scene_main_submenu_callback, pof);
  43. }
  44. furi_string_free(token_name);
  45. view_dispatcher_switch_to_view(pof->view_dispatcher, PoFViewSubmenu);
  46. }
  47. void pof_scene_main_on_enter(void* context) {
  48. pof_scene_main_on_update(context);
  49. }
  50. bool pof_scene_main_on_event(void* context, SceneManagerEvent event) {
  51. PoFApp* pof = context;
  52. VirtualPortal* virtual_portal = pof->virtual_portal;
  53. bool consumed = false;
  54. if(event.type == SceneManagerEventTypeCustom) {
  55. if(event.event == SubmenuIndexLoad) {
  56. if(pof->pof_usb) {
  57. // Explicitly save state so that the correct item is
  58. // reselected if the user cancels loading a file.
  59. scene_manager_set_scene_state(pof->scene_manager, PoFSceneMain, SubmenuIndexLoad);
  60. scene_manager_next_scene(pof->scene_manager, PoFSceneFileSelect);
  61. }
  62. consumed = true;
  63. } else {
  64. scene_manager_set_scene_state(pof->scene_manager, PoFSceneMain, event.event);
  65. pof_token_clear(virtual_portal->tokens[event.event], true);
  66. pof_scene_main_on_update(context);
  67. }
  68. } else if(event.type == SceneManagerEventTypeBack) {
  69. scene_manager_stop(pof->scene_manager);
  70. view_dispatcher_stop(pof->view_dispatcher);
  71. consumed = true;
  72. }
  73. return consumed;
  74. }
  75. void pof_scene_main_on_exit(void* context) {
  76. PoFApp* pof = context;
  77. submenu_reset(pof->submenu);
  78. }