gb_cartridge_scene_menu.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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_add(app->submenu, "Settings", 1, NULL, NULL);
  66. variable_item_list_set_enter_callback(app->submenu, gb_cartridge_scene_menu_submenu_callback, app);
  67. view_dispatcher_switch_to_view(app->view_dispatcher, GBCartridgeViewIdMenu);
  68. }
  69. bool gb_cartridge_scene_menu_on_event(void* context, SceneManagerEvent event) {
  70. GBCartridge* app = context;
  71. UNUSED(app);
  72. if(event.type == SceneManagerEventTypeBack) {
  73. //exit app
  74. scene_manager_stop(app->scene_manager);
  75. view_dispatcher_stop(app->view_dispatcher);
  76. return true;
  77. } else if(event.type == SceneManagerEventTypeCustom) {
  78. if(event.event == SubmenuIndexScene1) {
  79. scene_manager_set_scene_state(
  80. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene1);
  81. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_1);
  82. return true;
  83. } else if (event.event == SubmenuIndexScene2) {
  84. scene_manager_set_scene_state(
  85. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene2);
  86. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_2);
  87. return true;
  88. } else if (event.event == SubmenuIndexScene3) {
  89. scene_manager_set_scene_state(
  90. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene3);
  91. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_3);
  92. } else if (event.event == SubmenuIndexScene4) {
  93. scene_manager_set_scene_state(
  94. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene4);
  95. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_4);
  96. } else if (event.event == SubmenuIndexScene5) {
  97. scene_manager_set_scene_state(
  98. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexScene5);
  99. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneScene_5);
  100. } else if (event.event == SubmenuIndexSettings) {
  101. scene_manager_set_scene_state(
  102. app->scene_manager, GBCartridgeSceneMenu, SubmenuIndexSettings);
  103. scene_manager_next_scene(app->scene_manager, GBCartridgeSceneSettings);
  104. return true;
  105. }
  106. }
  107. return false;
  108. }
  109. void gb_cartridge_scene_menu_on_exit(void* context) {
  110. GBCartridge* app = context;
  111. // submenu_reset(app->submenu);
  112. variable_item_list_set_selected_item(app->submenu, 0);
  113. variable_item_list_reset(app->submenu);
  114. }