alloc.c 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <alloc/alloc.h>
  2. /**
  3. * @brief Navigation callback for exiting the application
  4. * @param context The context - unused
  5. * @return next view id (VIEW_NONE to exit the app)
  6. */
  7. static uint32_t callback_exit_app(void *context)
  8. {
  9. UNUSED(context);
  10. return VIEW_NONE; // Return VIEW_NONE to exit the app
  11. }
  12. // Function to allocate resources for the FlipWorldApp
  13. FlipWorldApp *flip_world_app_alloc()
  14. {
  15. FlipWorldApp *app = (FlipWorldApp *)malloc(sizeof(FlipWorldApp));
  16. Gui *gui = furi_record_open(RECORD_GUI);
  17. // Allocate ViewDispatcher
  18. if (!easy_flipper_set_view_dispatcher(&app->view_dispatcher, gui, app))
  19. {
  20. return NULL;
  21. }
  22. view_dispatcher_set_custom_event_callback(app->view_dispatcher, flip_world_custom_event_callback);
  23. // Main view
  24. if (!easy_flipper_set_view(&app->view_loader, FlipWorldViewLoader, flip_world_loader_draw_callback, NULL, callback_to_submenu, &app->view_dispatcher, app))
  25. {
  26. return NULL;
  27. }
  28. flip_world_loader_init(app->view_loader);
  29. if (!easy_flipper_set_widget(&app->widget_result, FlipWorldViewWidgetResult, "", callback_to_submenu, &app->view_dispatcher))
  30. {
  31. return NULL;
  32. }
  33. // Submenu
  34. if (!easy_flipper_set_submenu(&app->submenu, FlipWorldViewSubmenu, VERSION_TAG, callback_exit_app, &app->view_dispatcher))
  35. {
  36. return NULL;
  37. }
  38. submenu_add_item(app->submenu, "Play", FlipWorldSubmenuIndexRun, callback_submenu_choices, app);
  39. submenu_add_item(app->submenu, "About", FlipWorldSubmenuIndexAbout, callback_submenu_choices, app);
  40. submenu_add_item(app->submenu, "Settings", FlipWorldSubmenuIndexSettings, callback_submenu_choices, app);
  41. //
  42. // Switch to the main view
  43. view_dispatcher_switch_to_view(app->view_dispatcher, FlipWorldViewSubmenu);
  44. return app;
  45. }
  46. // Function to free the resources used by FlipWorldApp
  47. void flip_world_app_free(FlipWorldApp *app)
  48. {
  49. if (!app)
  50. {
  51. FURI_LOG_E(TAG, "FlipWorldApp is NULL");
  52. return;
  53. }
  54. // Free Submenu(s)
  55. if (app->submenu)
  56. {
  57. view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewSubmenu);
  58. submenu_free(app->submenu);
  59. }
  60. // Free Widget(s)
  61. if (app->widget_result)
  62. {
  63. view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewWidgetResult);
  64. widget_free(app->widget_result);
  65. }
  66. // Free View(s)
  67. if (app->view_loader)
  68. {
  69. view_dispatcher_remove_view(app->view_dispatcher, FlipWorldViewLoader);
  70. flip_world_loader_free_model(app->view_loader);
  71. view_free(app->view_loader);
  72. }
  73. free_all_views(app, true, true);
  74. // free the view dispatcher
  75. view_dispatcher_free(app->view_dispatcher);
  76. // close the gui
  77. furi_record_close(RECORD_GUI);
  78. // free the app
  79. free(app);
  80. }