From b63839865a74f7c3907dcc06745d89f0715e06a4 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Fri, 21 Jul 2023 00:01:10 +0100 Subject: [PATCH] Add main apps from mainmenu editor --- .../scenes/xtreme_app_scene_config.h | 1 + .../xtreme_app_scene_interface_mainmenu_add.c | 94 ++++++++++++------- ...me_app_scene_interface_mainmenu_add_main.c | 55 +++++++++++ applications/main/xtreme_app/xtreme_app.c | 6 ++ applications/main/xtreme_app/xtreme_app.h | 4 + 5 files changed, 128 insertions(+), 32 deletions(-) create mode 100644 applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add_main.c diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h b/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h index 77ba43991..bc72acc33 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h @@ -3,6 +3,7 @@ ADD_SCENE(xtreme_app, interface, Interface) ADD_SCENE(xtreme_app, interface_graphics, InterfaceGraphics) ADD_SCENE(xtreme_app, interface_mainmenu, InterfaceMainmenu) ADD_SCENE(xtreme_app, interface_mainmenu_add, InterfaceMainmenuAdd) +ADD_SCENE(xtreme_app, interface_mainmenu_add_main, InterfaceMainmenuAddMain) ADD_SCENE(xtreme_app, interface_lockscreen, InterfaceLockscreen) ADD_SCENE(xtreme_app, interface_statusbar, InterfaceStatusbar) ADD_SCENE(xtreme_app, interface_filebrowser, InterfaceFilebrowser) diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c index 3333be089..edc4c668e 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c @@ -1,10 +1,11 @@ #include "../xtreme_app.h" -enum FileBrowserResult { - FileBrowserResultOk, +enum SubmenuIndex { + SubmenuIndexMainApp, + SubmenuIndexExternalApp, }; -static bool xtreme_app_scene_interface_mainmenu_add_file_browser_callback( +static bool fap_selector_item_callback( FuriString* file_path, void* context, uint8_t** icon_ptr, @@ -16,52 +17,81 @@ static bool xtreme_app_scene_interface_mainmenu_add_file_browser_callback( return success; } +static void + xtreme_app_scene_interface_mainmenu_add_submenu_callback(void* context, uint32_t index) { + XtremeApp* app = context; + scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneInterfaceMainmenuAdd, index); + + switch(index) { + case SubmenuIndexMainApp: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceMainmenuAddMain); + break; + case SubmenuIndexExternalApp: { + const DialogsFileBrowserOptions browser_options = { + .extension = ".fap", + .icon = &I_unknown_10px, + .skip_assets = true, + .hide_ext = true, + .item_loader_callback = fap_selector_item_callback, + .item_loader_context = app, + .base_path = EXT_PATH("apps"), + }; + FuriString* temp_path = furi_string_alloc_set_str(EXT_PATH("apps")); + if(dialog_file_browser_show(app->dialogs, temp_path, temp_path, &browser_options)) { + CharList_push_back(app->mainmenu_app_exes, strdup(furi_string_get_cstr(temp_path))); + Storage* storage = furi_record_open(RECORD_STORAGE); + flipper_application_load_name_and_icon(temp_path, storage, NULL, temp_path); + furi_record_close(RECORD_STORAGE); + CharList_push_back(app->mainmenu_app_labels, strdup(furi_string_get_cstr(temp_path))); + app->mainmenu_app_index = CharList_size(app->mainmenu_app_labels) - 1; + app->save_mainmenu_apps = true; + app->require_reboot = true; + scene_manager_search_and_switch_to_previous_scene( + app->scene_manager, XtremeAppSceneInterfaceMainmenu); + } + furi_string_free(temp_path); + break; + } + default: + break; + } +} + void xtreme_app_scene_interface_mainmenu_add_on_enter(void* context) { XtremeApp* app = context; - FuriString* string = furi_string_alloc_set_str(EXT_PATH("apps")); + Submenu* submenu = app->submenu; - const DialogsFileBrowserOptions browser_options = { - .extension = ".fap", - .skip_assets = true, - .hide_ext = true, - .item_loader_callback = xtreme_app_scene_interface_mainmenu_add_file_browser_callback, - .item_loader_context = app, - .base_path = EXT_PATH("apps"), - }; + submenu_add_item( + submenu, + "Main App", + SubmenuIndexMainApp, + xtreme_app_scene_interface_mainmenu_add_submenu_callback, + app); - if(dialog_file_browser_show(app->dialogs, string, string, &browser_options)) { - CharList_push_back(app->mainmenu_app_exes, strdup(furi_string_get_cstr(string))); - Storage* storage = furi_record_open(RECORD_STORAGE); - flipper_application_load_name_and_icon(string, storage, NULL, string); - furi_record_close(RECORD_STORAGE); - CharList_push_back(app->mainmenu_app_labels, strdup(furi_string_get_cstr(string))); - app->save_mainmenu_apps = true; - app->require_reboot = true; - } + submenu_add_item( + submenu, + "External App", + SubmenuIndexExternalApp, + xtreme_app_scene_interface_mainmenu_add_submenu_callback, + app); - furi_string_free(string); + submenu_set_header(submenu, "Add Menu App:"); - view_dispatcher_send_custom_event(app->view_dispatcher, FileBrowserResultOk); + view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewSubmenu); } bool xtreme_app_scene_interface_mainmenu_add_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; + UNUSED(context); bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { consumed = true; - switch(event.event) { - case FileBrowserResultOk: - scene_manager_previous_scene(app->scene_manager); - break; - default: - break; - } } return consumed; } void xtreme_app_scene_interface_mainmenu_add_on_exit(void* context) { - UNUSED(context); + XtremeApp* app = context; + submenu_reset(app->submenu); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add_main.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add_main.c new file mode 100644 index 000000000..3467b9c47 --- /dev/null +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add_main.c @@ -0,0 +1,55 @@ +#include "../xtreme_app.h" + +static void + xtreme_app_scene_interface_mainmenu_add_main_submenu_callback(void* context, uint32_t index) { + XtremeApp* app = context; + const char* name = (const char*)index; + + CharList_push_back(app->mainmenu_app_exes, strdup(name)); + CharList_push_back(app->mainmenu_app_labels, strdup(name)); + app->mainmenu_app_index = CharList_size(app->mainmenu_app_labels) - 1; + app->save_mainmenu_apps = true; + app->require_reboot = true; + scene_manager_search_and_switch_to_previous_scene( + app->scene_manager, XtremeAppSceneInterfaceMainmenu); +} + +void xtreme_app_scene_interface_mainmenu_add_main_on_enter(void* context) { + XtremeApp* app = context; + Submenu* submenu = app->submenu; + + for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) { + submenu_add_item( + submenu, + FLIPPER_APPS[i].name, + (uint32_t)FLIPPER_APPS[i].name, + xtreme_app_scene_interface_mainmenu_add_main_submenu_callback, + app); + } + for(size_t i = 0; i < FLIPPER_EXTERNAL_APPS_COUNT; i++) { + submenu_add_item( + submenu, + FLIPPER_EXTERNAL_APPS[i].name, + (uint32_t)FLIPPER_EXTERNAL_APPS[i].name, + xtreme_app_scene_interface_mainmenu_add_main_submenu_callback, + app); + } + + view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewSubmenu); +} + +bool xtreme_app_scene_interface_mainmenu_add_main_on_event(void* context, SceneManagerEvent event) { + UNUSED(context); + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + } + + return consumed; +} + +void xtreme_app_scene_interface_mainmenu_add_main_on_exit(void* context) { + XtremeApp* app = context; + submenu_reset(app->submenu); +} diff --git a/applications/main/xtreme_app/xtreme_app.c b/applications/main/xtreme_app/xtreme_app.c index b5a930ed8..8127cf673 100644 --- a/applications/main/xtreme_app/xtreme_app.c +++ b/applications/main/xtreme_app/xtreme_app.c @@ -185,6 +185,10 @@ XtremeApp* xtreme_app_alloc() { XtremeAppViewVarItemList, variable_item_list_get_view(app->var_item_list)); + app->submenu = submenu_alloc(); + view_dispatcher_add_view( + app->view_dispatcher, XtremeAppViewSubmenu, submenu_get_view(app->submenu)); + app->text_input = text_input_alloc(); view_dispatcher_add_view( app->view_dispatcher, XtremeAppViewTextInput, text_input_get_view(app->text_input)); @@ -299,6 +303,8 @@ void xtreme_app_free(XtremeApp* app) { // Gui modules view_dispatcher_remove_view(app->view_dispatcher, XtremeAppViewVarItemList); variable_item_list_free(app->var_item_list); + view_dispatcher_remove_view(app->view_dispatcher, XtremeAppViewSubmenu); + submenu_free(app->submenu); view_dispatcher_remove_view(app->view_dispatcher, XtremeAppViewTextInput); text_input_free(app->text_input); view_dispatcher_remove_view(app->view_dispatcher, XtremeAppViewPopup); diff --git a/applications/main/xtreme_app/xtreme_app.h b/applications/main/xtreme_app/xtreme_app.h index cce1d1b85..3d6ab0e48 100644 --- a/applications/main/xtreme_app/xtreme_app.h +++ b/applications/main/xtreme_app/xtreme_app.h @@ -7,7 +7,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -37,6 +39,7 @@ typedef struct { SceneManager* scene_manager; ViewDispatcher* view_dispatcher; VariableItemList* var_item_list; + Submenu* submenu; TextInput* text_input; Popup* popup; @@ -72,6 +75,7 @@ typedef struct { typedef enum { XtremeAppViewVarItemList, + XtremeAppViewSubmenu, XtremeAppViewTextInput, XtremeAppViewPopup, } XtremeAppView;