From 01690e22b65da7cafe160e3c8f90c16e6083a4e0 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Thu, 3 Aug 2023 00:25:07 +0200 Subject: [PATCH] Add start menu to mass storage --- .../external/mass_storage/mass_storage_app.c | 8 +++- .../mass_storage/mass_storage_app_i.h | 5 ++- .../scenes/mass_storage_scene_config.h | 1 + .../scenes/mass_storage_scene_file_select.c | 3 -- .../scenes/mass_storage_scene_start.c | 38 +++++++++++++++++++ 5 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 applications/external/mass_storage/scenes/mass_storage_scene_start.c diff --git a/applications/external/mass_storage/mass_storage_app.c b/applications/external/mass_storage/mass_storage_app.c index 3612d8c07..18520fb92 100644 --- a/applications/external/mass_storage/mass_storage_app.c +++ b/applications/external/mass_storage/mass_storage_app.c @@ -55,12 +55,16 @@ MassStorageApp* mass_storage_app_alloc(char* arg) { MassStorageAppViewWork, mass_storage_get_view(app->mass_storage_view)); + app->submenu = submenu_alloc(); + view_dispatcher_add_view( + app->view_dispatcher, MassStorageAppViewSubmenu, submenu_get_view(app->submenu)); + view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); if(storage_file_exists(app->fs_api, furi_string_get_cstr(app->file_path))) { scene_manager_next_scene(app->scene_manager, MassStorageSceneWork); } else { - scene_manager_next_scene(app->scene_manager, MassStorageSceneFileSelect); + scene_manager_next_scene(app->scene_manager, MassStorageSceneStart); } return app; @@ -72,6 +76,8 @@ void mass_storage_app_free(MassStorageApp* app) { // Views view_dispatcher_remove_view(app->view_dispatcher, MassStorageAppViewWork); mass_storage_free(app->mass_storage_view); + view_dispatcher_remove_view(app->view_dispatcher, MassStorageAppViewSubmenu); + submenu_free(app->submenu); // View dispatcher view_dispatcher_free(app->view_dispatcher); diff --git a/applications/external/mass_storage/mass_storage_app_i.h b/applications/external/mass_storage/mass_storage_app_i.h index 9867c11b6..4920a6472 100644 --- a/applications/external/mass_storage/mass_storage_app_i.h +++ b/applications/external/mass_storage/mass_storage_app_i.h @@ -8,11 +8,10 @@ #include #include #include -#include #include #include -#include #include +#include #include #include "views/mass_storage_view.h" @@ -27,6 +26,7 @@ struct MassStorageApp { NotificationApp* notifications; DialogsApp* dialogs; Widget* widget; + Submenu* submenu; FuriString* file_path; File* file; @@ -39,4 +39,5 @@ struct MassStorageApp { typedef enum { MassStorageAppViewError, MassStorageAppViewWork, + MassStorageAppViewSubmenu, } MassStorageAppView; diff --git a/applications/external/mass_storage/scenes/mass_storage_scene_config.h b/applications/external/mass_storage/scenes/mass_storage_scene_config.h index 2ce2d41e9..f7fe889e3 100644 --- a/applications/external/mass_storage/scenes/mass_storage_scene_config.h +++ b/applications/external/mass_storage/scenes/mass_storage_scene_config.h @@ -1,2 +1,3 @@ +ADD_SCENE(mass_storage, start, Start) ADD_SCENE(mass_storage, file_select, FileSelect) ADD_SCENE(mass_storage, work, Work) diff --git a/applications/external/mass_storage/scenes/mass_storage_scene_file_select.c b/applications/external/mass_storage/scenes/mass_storage_scene_file_select.c index 8b078086d..1f37f028c 100644 --- a/applications/external/mass_storage/scenes/mass_storage_scene_file_select.c +++ b/applications/external/mass_storage/scenes/mass_storage_scene_file_select.c @@ -23,18 +23,15 @@ void mass_storage_scene_file_select_on_enter(void* context) { scene_manager_next_scene(mass_storage->scene_manager, MassStorageSceneWork); } else { scene_manager_previous_scene(mass_storage->scene_manager); - view_dispatcher_stop(mass_storage->view_dispatcher); } } bool mass_storage_scene_file_select_on_event(void* context, SceneManagerEvent event) { UNUSED(context); UNUSED(event); - // MassStorageApp* mass_storage = context; return false; } void mass_storage_scene_file_select_on_exit(void* context) { UNUSED(context); - // MassStorageApp* mass_storage = context; } diff --git a/applications/external/mass_storage/scenes/mass_storage_scene_start.c b/applications/external/mass_storage/scenes/mass_storage_scene_start.c new file mode 100644 index 000000000..df4286f88 --- /dev/null +++ b/applications/external/mass_storage/scenes/mass_storage_scene_start.c @@ -0,0 +1,38 @@ +#include "../mass_storage_app_i.h" + +static void mass_storage_scene_start_submenu_callback(void* context, uint32_t index) { + MassStorageApp* app = context; + scene_manager_next_scene(app->scene_manager, index); +} + +void mass_storage_scene_start_on_enter(void* context) { + MassStorageApp* app = context; + Submenu* submenu = app->submenu; + + submenu_add_item( + submenu, + "Emulate Image", + MassStorageSceneFileSelect, + mass_storage_scene_start_submenu_callback, + app); + + submenu_set_header(submenu, "USB Mass Storage"); + + view_dispatcher_switch_to_view(app->view_dispatcher, MassStorageAppViewSubmenu); +} + +bool mass_storage_scene_start_on_event(void* context, SceneManagerEvent event) { + UNUSED(context); + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + } + + return consumed; +} + +void mass_storage_scene_start_on_exit(void* context) { + MassStorageApp* app = context; + submenu_reset(app->submenu); +}