FlippyPass/project/ui/ui.c

149 lines
No EOL
4.9 KiB
C

// 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);
}