Просмотр исходного кода

Change Submenu -> VariableItemList

Esteban Fuentealba 2 лет назад
Родитель
Сommit
3296bb9ac2
4 измененных файлов с 82 добавлено и 15 удалено
  1. 5 3
      gb_cartridge_app.c
  2. 10 1
      gb_cartridge_app.h
  3. 61 9
      scenes/gb_cartridge_scene_menu.c
  4. 6 2
      views/gb_cartridge_scene_4.c

+ 5 - 3
gb_cartridge_app.c

@@ -37,9 +37,11 @@ GBCartridge* gb_cartridge_app_app_alloc() {
     view_dispatcher_set_navigation_event_callback(app->view_dispatcher, gb_cartridge_app_navigation_event_callback);
     view_dispatcher_set_navigation_event_callback(app->view_dispatcher, gb_cartridge_app_navigation_event_callback);
     view_dispatcher_set_tick_event_callback(app->view_dispatcher, gb_cartridge_app_tick_event_callback, 100);
     view_dispatcher_set_tick_event_callback(app->view_dispatcher, gb_cartridge_app_tick_event_callback, 100);
     view_dispatcher_set_custom_event_callback(app->view_dispatcher, gb_cartridge_app_custom_event_callback);
     view_dispatcher_set_custom_event_callback(app->view_dispatcher, gb_cartridge_app_custom_event_callback);
-    app->submenu = submenu_alloc();
+    app->submenu = variable_item_list_alloc();
 
 
     // Set defaults, in case no config loaded
     // Set defaults, in case no config loaded
+    app->gameboy_rom_option_selected_index = 0;
+    app->gameboy_rom_option_selected_text = "gb";
     app->haptic = 1;
     app->haptic = 1;
     app->speaker = 1;
     app->speaker = 1;
     app->led = 1;
     app->led = 1;
@@ -55,7 +57,7 @@ GBCartridge* gb_cartridge_app_app_alloc() {
     app->uart = usart_init(app);
     app->uart = usart_init(app);
     app->lp_uart = lp_uart_init(app);
     app->lp_uart = lp_uart_init(app);
     
     
-    view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdMenu, submenu_get_view(app->submenu));
+    view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdMenu, variable_item_list_get_view(app->submenu));
     app->gb_cartridge_startscreen = gb_cartridge_startscreen_alloc();
     app->gb_cartridge_startscreen = gb_cartridge_startscreen_alloc();
     view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdStartscreen, gb_cartridge_startscreen_get_view(app->gb_cartridge_startscreen));
     view_dispatcher_add_view(app->view_dispatcher, GBCartridgeViewIdStartscreen, gb_cartridge_startscreen_get_view(app->gb_cartridge_startscreen));
     app->gb_cartridge_scene_1 = gb_cartridge_scene_1_alloc();
     app->gb_cartridge_scene_1 = gb_cartridge_scene_1_alloc();
@@ -87,7 +89,7 @@ void gb_cartridge_app_app_free(GBCartridge* app) {
     view_dispatcher_remove_view(app->view_dispatcher, GBCartridgeViewIdScene1);
     view_dispatcher_remove_view(app->view_dispatcher, GBCartridgeViewIdScene1);
     view_dispatcher_remove_view(app->view_dispatcher, GBCartridgeViewIdScene2);
     view_dispatcher_remove_view(app->view_dispatcher, GBCartridgeViewIdScene2);
     view_dispatcher_remove_view(app->view_dispatcher, GBCartridgeViewIdSettings);
     view_dispatcher_remove_view(app->view_dispatcher, GBCartridgeViewIdSettings);
-    submenu_free(app->submenu);
+    variable_item_list_free(app->submenu);
 
 
     view_dispatcher_free(app->view_dispatcher);
     view_dispatcher_free(app->view_dispatcher);
     furi_record_close(RECORD_GUI);
     furi_record_close(RECORD_GUI);

+ 10 - 1
gb_cartridge_app.h

@@ -45,7 +45,7 @@ typedef struct {
     Storage* storage;
     Storage* storage;
     NotificationApp* notification;
     NotificationApp* notification;
     ViewDispatcher* view_dispatcher;
     ViewDispatcher* view_dispatcher;
-    Submenu* submenu;
+    VariableItemList* submenu;
     bool need_to_prompt_settings_init;
     bool need_to_prompt_settings_init;
     SceneManager* scene_manager;
     SceneManager* scene_manager;
     VariableItemList* variable_item_list;
     VariableItemList* variable_item_list;
@@ -74,6 +74,9 @@ typedef struct {
 
 
     File* cart_rom;
     File* cart_rom;
     File* cart_ram;
     File* cart_ram;
+
+    uint32_t gameboy_rom_option_selected_index;
+    char* gameboy_rom_option_selected_text;
 } GBCartridge;
 } GBCartridge;
 
 
 
 
@@ -108,3 +111,9 @@ typedef enum {
     GBCartridgeSettingsOn,
     GBCartridgeSettingsOn,
 } GBCartridgeSettingsStoreState;
 } GBCartridgeSettingsStoreState;
 
 
+typedef enum {
+    GBCartridgeRomOptionGB,
+    GBCartridgeRomOptionGBC,
+} GBCartridgeRomOptionState;
+
+

+ 61 - 9
scenes/gb_cartridge_scene_menu.c

@@ -1,7 +1,10 @@
 #include "../gb_cartridge_app.h"
 #include "../gb_cartridge_app.h"
+#include <lib/toolbox/value_index.h>
+#include <gui/elements.h>
+#include <ctype.h>
 
 
 enum SubmenuIndex {
 enum SubmenuIndex {
-    SubmenuIndexScene1 = 10,
+    SubmenuIndexScene1,
     SubmenuIndexScene2,
     SubmenuIndexScene2,
     SubmenuIndexScene3,
     SubmenuIndexScene3,
     SubmenuIndexScene4,
     SubmenuIndexScene4,
@@ -9,22 +12,69 @@ enum SubmenuIndex {
     SubmenuIndexSettings,
     SubmenuIndexSettings,
 };
 };
 
 
+const char* const gameboy_rom_option_text[2] = {
+    "gb",
+    "gbc",
+};
+const uint32_t gameboy_rom_option_value[2] = {
+    GBCartridgeRomOptionGB,
+    GBCartridgeRomOptionGBC,
+};
+
+void toUpperCase(char *str) {
+    while (*str) {
+        *str = toupper((unsigned char)*str);
+        str++;
+    }
+}
+
 void gb_cartridge_scene_menu_submenu_callback(void* context, uint32_t index) {
 void gb_cartridge_scene_menu_submenu_callback(void* context, uint32_t index) {
     GBCartridge* app = context;
     GBCartridge* app = context;
     view_dispatcher_send_custom_event(app->view_dispatcher, index);
     view_dispatcher_send_custom_event(app->view_dispatcher, index);
 }
 }
+static char* rom_option_uppercase(uint32_t index) {
+    const char *gameboy_rom_option = gameboy_rom_option_text[index];
+    char *gameboy_rom_option_uppercase = (char*)malloc(strlen(gameboy_rom_option) + 1); // +1 para el carácter nulo
+
+    if (gameboy_rom_option_uppercase) {
+        strcpy(gameboy_rom_option_uppercase, gameboy_rom_option);
+        toUpperCase(gameboy_rom_option_uppercase);
+    } else {
+        // Manejo de error en caso de falta de memoria
+        return NULL;
+    }
+
+    return gameboy_rom_option_uppercase;
+}
+static void gameboy_cartridge_set_rom_option(VariableItem* item) {
+    GBCartridge* app = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, rom_option_uppercase(index));
+    app->gameboy_rom_option_selected_index = gameboy_rom_option_value[index];
+    app->gameboy_rom_option_selected_text = (char*)gameboy_rom_option_text[index];
+}
 
 
 void gb_cartridge_scene_menu_on_enter(void* context) {
 void gb_cartridge_scene_menu_on_enter(void* context) {
     GBCartridge* app = context;
     GBCartridge* app = context;
 
 
-    submenu_add_item(app->submenu, "Cartridge Information", SubmenuIndexScene1, gb_cartridge_scene_menu_submenu_callback, app);
-    submenu_add_item(app->submenu, "Dump ROM Cartridge", SubmenuIndexScene2, gb_cartridge_scene_menu_submenu_callback, app);
-    submenu_add_item(app->submenu, "Dump RAM Cartridge", SubmenuIndexScene3, gb_cartridge_scene_menu_submenu_callback, app);
-    submenu_add_item(app->submenu, "Write ROM", SubmenuIndexScene4, gb_cartridge_scene_menu_submenu_callback, app);
-    submenu_add_item(app->submenu, "Write RAM", SubmenuIndexSettings, gb_cartridge_scene_menu_submenu_callback, app);
-    submenu_add_item(app->submenu, "Settings", SubmenuIndexSettings, gb_cartridge_scene_menu_submenu_callback, app);
+    variable_item_list_add(app->submenu, "Cartridge Information", 1, NULL, NULL);
+    variable_item_list_add(app->submenu, "Dump ROM Cartridge", 1, NULL, NULL);
+    variable_item_list_add(app->submenu, "Dump RAM Cartridge", 1, NULL, NULL);
+
+    VariableItem* item = variable_item_list_add(
+        app->submenu,
+        "Write ROM",
+        2,
+        gameboy_cartridge_set_rom_option,
+        app);
+    app->gameboy_rom_option_selected_index = value_index_uint32(app->gameboy_rom_option_selected_index, gameboy_rom_option_value, 2);
+    variable_item_set_current_value_index(item, app->gameboy_rom_option_selected_index);
+    variable_item_set_current_value_text(item, rom_option_uppercase(app->gameboy_rom_option_selected_index));
+    
+
+    variable_item_list_add(app->submenu, "Write RAM", 1, NULL, NULL);
 
 
-    submenu_set_selected_item(app->submenu, scene_manager_get_scene_state(app->scene_manager, GBCartridgeSceneMenu));
+    variable_item_list_set_enter_callback(app->submenu, gb_cartridge_scene_menu_submenu_callback, app);
 
 
     view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdMenu);
     view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdMenu);
 }
 }
@@ -68,5 +118,7 @@ bool gb_cartridge_scene_menu_on_event(void* context, SceneManagerEvent event) {
 
 
 void gb_cartridge_scene_menu_on_exit(void* context) {
 void gb_cartridge_scene_menu_on_exit(void* context) {
     GBCartridge* app = context;
     GBCartridge* app = context;
-    submenu_reset(app->submenu);
+    // submenu_reset(app->submenu);
+    variable_item_list_set_selected_item(app->submenu, 0);
+    variable_item_list_reset(app->submenu);
 }
 }

+ 6 - 2
views/gb_cartridge_scene_4.c

@@ -33,6 +33,8 @@ typedef struct {
     
     
     char* cart_dump_rom_filename_sequential;
     char* cart_dump_rom_filename_sequential;
     bool rx_active;
     bool rx_active;
+
+    char* gameboy_rom_option_selected_text;
 } GameBoyCartridgeROMWriteModel;
 } GameBoyCartridgeROMWriteModel;
 
 
 // void dump_rom_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
 // void dump_rom_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
@@ -144,7 +146,7 @@ void gb_cartridge_scene_4_draw(Canvas* canvas, GameBoyCartridgeROMWriteModel* mo
     if(model->total_rom > 0 && model->transfered > 0) {
     if(model->total_rom > 0 && model->transfered > 0) {
         progress = model->transfered * 100 / model->total_rom;
         progress = model->transfered * 100 / model->total_rom;
     }
     }
-    snprintf(progressText, sizeof(progressText), "%d%% Write ROM...", progress);
+    snprintf(progressText, sizeof(progressText), "%d%% Write ROM... GB: %s", progress, model->gameboy_rom_option_selected_text);
     canvas_draw_str_aligned(canvas, 128 / 2, 0, AlignCenter, AlignTop, progressText);
     canvas_draw_str_aligned(canvas, 128 / 2, 0, AlignCenter, AlignTop, progressText);
     canvas_set_font(canvas, FontSecondary);
     canvas_set_font(canvas, FontSecondary);
 
 
@@ -238,7 +240,7 @@ bool gb_cartridge_scene_4_input(InputEvent* event, void* context) {
                         furi_string_set(path, MALVEKE_APP_FOLDER);
                         furi_string_set(path, MALVEKE_APP_FOLDER);
                         DialogsFileBrowserOptions browser_options;
                         DialogsFileBrowserOptions browser_options;
                         dialog_file_browser_set_basic_options(
                         dialog_file_browser_set_basic_options(
-                            &browser_options, ".sav", NULL);
+                            &browser_options, app->gameboy_rom_option_selected_text, NULL);
                         browser_options.base_path = MALVEKE_APP_FOLDER;
                         browser_options.base_path = MALVEKE_APP_FOLDER;
                         browser_options.skip_assets = true;
                         browser_options.skip_assets = true;
 
 
@@ -287,6 +289,8 @@ void gb_cartridge_scene_4_enter(void* context) {
         {
         {
             
             
             UNUSED(model);
             UNUSED(model);
+            gb_cartridge_scene_4_model_init(model);
+            model->gameboy_rom_option_selected_text = app->gameboy_rom_option_selected_text;