alloc.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include <alloc/alloc.h>
  2. #include <callback/callback.h>
  3. #include <callback/loader.h>
  4. /**
  5. * @brief Navigation callback for exiting the application
  6. * @param context The context - unused
  7. * @return next view id (VIEW_NONE to exit the app)
  8. */
  9. static uint32_t callback_exit_app(void *context)
  10. {
  11. UNUSED(context);
  12. return VIEW_NONE; // Return VIEW_NONE to exit the app
  13. }
  14. void *global_app;
  15. void flip_world_show_submenu()
  16. {
  17. FlipWorldApp *app = (FlipWorldApp *)global_app;
  18. if (app->submenu)
  19. {
  20. view_dispatcher_switch_to_view(app->view_dispatcher, FlipWorldViewSubmenu);
  21. }
  22. }
  23. bool alloc_view_loader(void *context)
  24. {
  25. FlipWorldApp *app = (FlipWorldApp *)context;
  26. furi_check(app, "FlipWorldApp is NULL");
  27. if (app->view_loader)
  28. {
  29. FURI_LOG_E(TAG, "View loader already allocated");
  30. return false;
  31. }
  32. if (app->widget_result)
  33. {
  34. FURI_LOG_E(TAG, "Widget result already allocated");
  35. return false;
  36. }
  37. view_dispatcher_set_custom_event_callback(app->view_dispatcher, loader_custom_event_callback);
  38. if (!easy_flipper_set_view(&app->view_loader, FlipWorldViewLoader, loader_draw_callback, NULL, callback_to_submenu, &app->view_dispatcher, app))
  39. {
  40. return false;
  41. }
  42. loader_init(app->view_loader);
  43. return easy_flipper_set_widget(&app->widget_result, FlipWorldViewWidgetResult, "", callback_to_submenu, &app->view_dispatcher);
  44. }
  45. void free_view_loader(void *context)
  46. {
  47. FlipWorldApp *app = (FlipWorldApp *)context;
  48. furi_check(app, "FlipWorldApp is NULL");
  49. // Free Widget(s)
  50. if (app->widget_result)
  51. {
  52. view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewWidgetResult);
  53. widget_free(app->widget_result);
  54. app->widget_result = NULL;
  55. }
  56. // Free View(s)
  57. if (app->view_loader)
  58. {
  59. view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewLoader);
  60. loader_free_model(app->view_loader);
  61. view_free(app->view_loader);
  62. app->view_loader = NULL;
  63. }
  64. }
  65. // Function to allocate resources for the FlipWorldApp
  66. FlipWorldApp *flip_world_app_alloc()
  67. {
  68. FlipWorldApp *app = (FlipWorldApp *)malloc(sizeof(FlipWorldApp));
  69. global_app = app;
  70. Gui *gui = furi_record_open(RECORD_GUI);
  71. // Allocate ViewDispatcher
  72. if (!easy_flipper_set_view_dispatcher(&app->view_dispatcher, gui, app))
  73. {
  74. return NULL;
  75. }
  76. // Submenu
  77. if (!easy_flipper_set_submenu(&app->submenu, FlipWorldViewSubmenu, VERSION_TAG, callback_exit_app, &app->view_dispatcher))
  78. {
  79. return NULL;
  80. }
  81. submenu_add_item(app->submenu, "Play", FlipWorldSubmenuIndexGameSubmenu, callback_submenu_choices, app);
  82. submenu_add_item(app->submenu, "About", FlipWorldSubmenuIndexMessage, callback_submenu_choices, app);
  83. submenu_add_item(app->submenu, "Settings", FlipWorldSubmenuIndexSettings, callback_submenu_choices, app);
  84. // Switch to the main view
  85. view_dispatcher_switch_to_view(app->view_dispatcher, FlipWorldViewSubmenu);
  86. return app;
  87. }
  88. // Function to free the resources used by FlipWorldApp
  89. void flip_world_app_free(FlipWorldApp *app)
  90. {
  91. furi_check(app, "FlipWorldApp is NULL");
  92. // Free Submenu(s)
  93. if (app->submenu)
  94. {
  95. view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewSubmenu);
  96. submenu_free(app->submenu);
  97. }
  98. free_all_views(app, true, true, true);
  99. // free the view dispatcher
  100. view_dispatcher_free(app->view_dispatcher);
  101. // close the gui
  102. furi_record_close(RECORD_GUI);
  103. // free the app
  104. if (app)
  105. free(app);
  106. }