alloc.c 4.2 KB

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