// Header #include "app.h" // Scenes #include "scenes/auth.h" #include "scenes/mainmenu.h" #include "scenes/overview.h" #include "scenes/view.h" #include "scenes/cred.h" #include "scenes/send.h" #include "scenes/create.h" #include "scenes/type.h" // Handlers void (*const FP_Scene_Enter_Handlers[])(void*) = { FP_Scene_Enter_Auth, FP_Scene_Enter_MainMenu, FP_Scene_Enter_Overview, FP_Scene_Enter_View, FP_Scene_Enter_Cred, FP_Scene_Enter_Send, FP_Scene_Enter_Create, FP_Scene_Enter_Type }; bool (*const FP_Scene_Event_Handlers[])(void*, SceneManagerEvent) = { FP_Scene_Event_Auth, FP_Scene_Event_MainMenu, FP_Scene_Event_Overview, FP_Scene_Event_View, FP_Scene_Event_Cred, FP_Scene_Event_Send, FP_Scene_Event_Create, FP_Scene_Event_Type }; void (*const FP_Scene_Exit_Handlers[])(void*) = { FP_Scene_Exit_Auth, FP_Scene_Exit_MainMenu, FP_Scene_Exit_Overview, FP_Scene_Exit_View, FP_Scene_Exit_Cred, FP_Scene_Exit_Send, FP_Scene_Exit_Create, FP_Scene_Exit_Type }; // Main Handler const SceneManagerHandlers FP_SceneEventHandlers = { .on_enter_handlers = FP_Scene_Enter_Handlers, .on_event_handlers = FP_Scene_Event_Handlers, .on_exit_handlers = FP_Scene_Exit_Handlers, .scene_num = FP_Scene_Count}; // Functions - Private bool FP_SceneManager_Callback_CustomEvent(void* context, uint32_t custom_event) { // Is our context okay? furi_assert(context); // Setting context FP_App* app = context; // Return event return scene_manager_handle_custom_event(app->scene_manager, custom_event); } bool FP_SceneManager_Callback_Navigation(void* context) { // Is our context okay? furi_assert(context); // Setting context FP_App* app = context; // Return navigation return scene_manager_handle_back_event(app->scene_manager); } // Constructors FP_App* fp_app_init() { // Allocate memory for new app variable FP_App* result = malloc(sizeof(FP_App)); // Init Scene Manager result->scene_manager = scene_manager_alloc(&FP_SceneEventHandlers, result); // Init View Dispatcher result->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_enable_queue(result->view_dispatcher); // Allocating all types of views result->varitemlist = variable_item_list_alloc(); result->textinput = text_input_alloc(); result->dialog = dialog_ex_alloc(); result->submenu = submenu_alloc(); result->textbox = text_box_alloc(); result->popup = popup_alloc(); // Event handling view_dispatcher_set_event_callback_context(result->view_dispatcher, result); view_dispatcher_set_custom_event_callback(result->view_dispatcher, FP_SceneManager_Callback_CustomEvent); view_dispatcher_set_navigation_event_callback(result->view_dispatcher, FP_SceneManager_Callback_Navigation); // Adding views to dispatcher view_dispatcher_add_view(result->view_dispatcher, FP_View_VariableItemList, variable_item_list_get_view(result->varitemlist)); view_dispatcher_add_view(result->view_dispatcher, FP_View_TextInput, text_input_get_view(result->textinput)); view_dispatcher_add_view(result->view_dispatcher, FP_View_TextBox, text_box_get_view(result->textbox)); view_dispatcher_add_view(result->view_dispatcher, FP_View_Dialog, dialog_ex_get_view(result->dialog)); view_dispatcher_add_view(result->view_dispatcher, FP_View_Submenu, submenu_get_view(result->submenu)); view_dispatcher_add_view(result->view_dispatcher, FP_View_Popup, popup_get_view(result->popup)); // Return app return result; } // Functions void fp_app_run(FP_App* app) { // Creating GUI Gui* gui = furi_record_open(RECORD_GUI); // Attaching view dispatcher to GUI view_dispatcher_attach_to_gui(app->view_dispatcher, gui, ViewDispatcherTypeFullscreen); // Starting scene scene_manager_next_scene(app->scene_manager, FP_Scene_Auth); // Start view dispatcher view_dispatcher_run(app->view_dispatcher); /* Post Application */ furi_record_close(RECORD_GUI); } void fp_app_free(FP_App* app) { // Freeing stuff from memory manager_free(app->manager); scene_manager_free(app->scene_manager); view_dispatcher_remove_view(app->view_dispatcher, FP_View_VariableItemList); view_dispatcher_remove_view(app->view_dispatcher, FP_View_TextInput); view_dispatcher_remove_view(app->view_dispatcher, FP_View_Submenu); view_dispatcher_remove_view(app->view_dispatcher, FP_View_TextBox); view_dispatcher_remove_view(app->view_dispatcher, FP_View_Dialog); view_dispatcher_remove_view(app->view_dispatcher, FP_View_Popup); view_dispatcher_free(app->view_dispatcher); variable_item_list_free(app->varitemlist); text_input_free(app->textinput); dialog_ex_free(app->dialog); text_box_free(app->textbox); submenu_free(app->submenu); popup_free(app->popup); free(app->keyboard); free(app); }