alloc.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. // Function to allocate resources for the FlipWorldApp
  14. FlipWorldApp *flip_world_app_alloc()
  15. {
  16. FlipWorldApp *app = (FlipWorldApp *)malloc(sizeof(FlipWorldApp));
  17. Gui *gui = furi_record_open(RECORD_GUI);
  18. // Allocate ViewDispatcher
  19. if (!easy_flipper_set_view_dispatcher(&app->view_dispatcher, gui, app))
  20. {
  21. return NULL;
  22. }
  23. view_dispatcher_set_custom_event_callback(app->view_dispatcher, flip_world_custom_event_callback);
  24. // Main view
  25. if (!easy_flipper_set_view(&app->view_loader, FlipWorldViewLoader, flip_world_loader_draw_callback, NULL, callback_to_submenu, &app->view_dispatcher, app))
  26. {
  27. return NULL;
  28. }
  29. flip_world_loader_init(app->view_loader);
  30. if (!easy_flipper_set_widget(&app->widget_result, FlipWorldViewWidgetResult, "", callback_to_submenu, &app->view_dispatcher))
  31. {
  32. return NULL;
  33. }
  34. // Submenu
  35. if (!easy_flipper_set_submenu(&app->submenu, FlipWorldViewSubmenu, VERSION_TAG, callback_exit_app, &app->view_dispatcher))
  36. {
  37. return NULL;
  38. }
  39. submenu_add_item(app->submenu, "Play", FlipWorldSubmenuIndexRun, callback_submenu_choices, app);
  40. submenu_add_item(app->submenu, "About", FlipWorldSubmenuIndexAbout, callback_submenu_choices, app);
  41. submenu_add_item(app->submenu, "Settings", FlipWorldSubmenuIndexSettings, callback_submenu_choices, app);
  42. //
  43. // Switch to the main view
  44. view_dispatcher_switch_to_view(app->view_dispatcher, FlipWorldViewSubmenu);
  45. return app;
  46. }
  47. // Function to free the resources used by FlipWorldApp
  48. void flip_world_app_free(FlipWorldApp *app)
  49. {
  50. if (!app)
  51. {
  52. FURI_LOG_E(TAG, "FlipWorldApp is NULL");
  53. return;
  54. }
  55. // Free Submenu(s)
  56. if (app->submenu)
  57. {
  58. view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewSubmenu);
  59. submenu_free(app->submenu);
  60. }
  61. // Free Widget(s)
  62. if (app->widget_result)
  63. {
  64. view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewWidgetResult);
  65. widget_free(app->widget_result);
  66. }
  67. // Free View(s)
  68. if (app->view_loader)
  69. {
  70. view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewLoader);
  71. flip_world_loader_free_model(app->view_loader);
  72. view_free(app->view_loader);
  73. }
  74. free_all_views(app, true, true);
  75. // free the view dispatcher
  76. view_dispatcher_free(app->view_dispatcher);
  77. // close the gui
  78. furi_record_close(RECORD_GUI);
  79. // free the app
  80. if (app)
  81. free(app);
  82. }