gb_cartridge_scene_menu.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "../gb_cartridge_app.h"
  2. #include <lib/toolbox/value_index.h>
  3. #include <gui/elements.h>
  4. #include <ctype.h>
  5. enum SubmenuIndex {
  6. SubmenuIndexScene1,
  7. SubmenuIndexScene2,
  8. SubmenuIndexScene3,
  9. SubmenuIndexScene4,
  10. SubmenuIndexScene5,
  11. SubmenuIndexSettings,
  12. };
  13. const char* const gameboy_rom_option_text[2] = {
  14. "gb",
  15. "gbc",
  16. };
  17. const uint32_t gameboy_rom_option_value[2] = {
  18. GBCartridgeRomOptionGB,
  19. GBCartridgeRomOptionGBC,
  20. };
  21. void toUpperCase(char *str) {
  22. while (*str) {
  23. *str = toupper((unsigned char)*str);
  24. str++;
  25. }
  26. }
  27. void gb_cartridge_scene_menu_submenu_callback(void* context, uint32_t index) {
  28. GBCartridge* app = context;
  29. view_dispatcher_send_custom_event(app->view_dispatcher, index);
  30. }
  31. static char* rom_option_uppercase(uint32_t index) {
  32. const char *gameboy_rom_option = gameboy_rom_option_text[index];
  33. char *gameboy_rom_option_uppercase = (char*)malloc(strlen(gameboy_rom_option) + 1); // +1 para el carácter nulo
  34. if (gameboy_rom_option_uppercase) {
  35. strcpy(gameboy_rom_option_uppercase, gameboy_rom_option);
  36. toUpperCase(gameboy_rom_option_uppercase);
  37. } else {
  38. // Manejo de error en caso de falta de memoria
  39. return NULL;
  40. }
  41. return gameboy_rom_option_uppercase;
  42. }
  43. static void gameboy_cartridge_set_rom_option(VariableItem* item) {
  44. GBCartridge* app = variable_item_get_context(item);
  45. uint8_t index = variable_item_get_current_value_index(item);
  46. variable_item_set_current_value_text(item, rom_option_uppercase(index));
  47. app->gameboy_rom_option_selected_index = gameboy_rom_option_value[index];
  48. app->gameboy_rom_option_selected_text = (char*)gameboy_rom_option_text[index];
  49. }
  50. void gb_cartridge_scene_menu_on_enter(void* context) {
  51. GBCartridge* app = context;
  52. variable_item_list_add(app->submenu, "Cartridge Information", 1, NULL, NULL);
  53. variable_item_list_add(app->submenu, "Dump ROM Cartridge", 1, NULL, NULL);
  54. variable_item_list_add(app->submenu, "Dump RAM Cartridge", 1, NULL, NULL);
  55. VariableItem* item = variable_item_list_add(
  56. app->submenu,
  57. "Write ROM",
  58. 2,
  59. gameboy_cartridge_set_rom_option,
  60. app);
  61. app->gameboy_rom_option_selected_index = value_index_uint32(app->gameboy_rom_option_selected_index, gameboy_rom_option_value, 2);
  62. variable_item_set_current_value_index(item, app->gameboy_rom_option_selected_index);
  63. variable_item_set_current_value_text(item, rom_option_uppercase(app->gameboy_rom_option_selected_index));
  64. variable_item_list_add(app->submenu, "Write RAM", 1, NULL, NULL);
  65. variable_item_list_set_enter_callback(app->submenu, gb_cartridge_scene_menu_submenu_callback, app);
  66. view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdMenu);
  67. }
  68. bool gb_cartridge_scene_menu_on_event(void* context, SceneManagerEvent event) {
  69. GBCartridge* app = context;
  70. UNUSED(app);
  71. if(event.type == SceneManagerEventTypeBack) {
  72. //exit app
  73. scene_manager_stop(app->scene_manager);
  74. view_dispatcher_stop(app->view_dispatcher);
  75. return true;
  76. } else if(event.type == SceneManagerEventTypeCustom) {
  77. if(event.event == SubmenuIndexScene1) {
  78. scene_manager_set_scene_state(
  79. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene1);
  80. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_1);
  81. return true;
  82. } else if (event.event == SubmenuIndexScene2) {
  83. scene_manager_set_scene_state(
  84. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene2);
  85. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_2);
  86. return true;
  87. } else if (event.event == SubmenuIndexScene3) {
  88. scene_manager_set_scene_state(
  89. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene3);
  90. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_3);
  91. } else if (event.event == SubmenuIndexScene4) {
  92. scene_manager_set_scene_state(
  93. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene4);
  94. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_4);
  95. } else if (event.event == SubmenuIndexSettings) {
  96. scene_manager_set_scene_state(
  97. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexSettings);
  98. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneSettings);
  99. return true;
  100. }
  101. }
  102. return false;
  103. }
  104. void gb_cartridge_scene_menu_on_exit(void* context) {
  105. GBCartridge* app = context;
  106. // submenu_reset(app->submenu);
  107. variable_item_list_set_selected_item(app->submenu, 0);
  108. variable_item_list_reset(app->submenu);
  109. }