pokemon_item.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include <gui/modules/submenu.h>
  2. #include <gui/scene_manager.h>
  3. #include <stdio.h>
  4. #include <src/include/named_list.h>
  5. #include <src/include/pokemon_app.h>
  6. #include <src/include/pokemon_data.h>
  7. #include <src/scenes/include/pokemon_scene.h>
  8. static void select_item_selected_callback(void* context, uint32_t index) {
  9. PokemonFap* pokemon_fap = (PokemonFap*)context;
  10. uint32_t item = scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneItemSet);
  11. pokemon_stat_set(pokemon_fap->pdata, STAT_HELD_ITEM, item, index);
  12. FURI_LOG_D(
  13. TAG,
  14. "[item] Set item %s",
  15. namedlist_name_get_index(
  16. pokemon_fap->pdata->item_list,
  17. pokemon_stat_get(pokemon_fap->pdata, STAT_HELD_ITEM, item)));
  18. /* Move back to Gen menu. This assumes this submenu is only ever used in Gen II */
  19. view_dispatcher_send_custom_event(
  20. pokemon_fap->view_dispatcher, (PokemonSceneSearch | PokemonSceneGenIITrade));
  21. }
  22. static void select_item_index_callback(void* context, uint32_t index) {
  23. PokemonFap* pokemon_fap = (PokemonFap*)context;
  24. /* Move to next scene */
  25. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneItemSet, index);
  26. view_dispatcher_send_custom_event(pokemon_fap->view_dispatcher, PokemonSceneItemSet);
  27. }
  28. void pokemon_scene_select_item_on_enter(void* context) {
  29. furi_assert(context);
  30. PokemonFap* pokemon_fap = (PokemonFap*)context;
  31. int i;
  32. const char* name;
  33. char letter[2] = {'\0'};
  34. submenu_reset(pokemon_fap->submenu);
  35. /* The item list should always start with No Item, put that at the start
  36. * for quick access.
  37. */
  38. submenu_add_item(
  39. pokemon_fap->submenu,
  40. namedlist_name_get_index(pokemon_fap->pdata->item_list, 0),
  41. 0,
  42. select_item_selected_callback,
  43. pokemon_fap);
  44. for(i = 1;; i++) {
  45. name = namedlist_name_get_pos(pokemon_fap->pdata->item_list, i);
  46. if(name == NULL) break;
  47. if(name[0] != letter[0]) {
  48. letter[0] = name[0];
  49. submenu_add_item(
  50. pokemon_fap->submenu, letter, letter[0], select_item_index_callback, pokemon_fap);
  51. }
  52. }
  53. submenu_set_selected_item(
  54. pokemon_fap->submenu,
  55. scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneItemSet));
  56. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneItemSet, 0);
  57. view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewSubmenu);
  58. }
  59. bool pokemon_scene_select_item_on_event(void* context, SceneManagerEvent event) {
  60. furi_assert(context);
  61. PokemonFap* pokemon_fap = context;
  62. bool consumed = false;
  63. if(event.type == SceneManagerEventTypeCustom) {
  64. if(event.event & PokemonSceneBack)
  65. scene_manager_previous_scene(pokemon_fap->scene_manager);
  66. else if(event.event & PokemonSceneSearch)
  67. scene_manager_search_and_switch_to_previous_scene(
  68. pokemon_fap->scene_manager, (event.event & ~PokemonSceneSearch));
  69. else
  70. scene_manager_next_scene(pokemon_fap->scene_manager, event.event);
  71. consumed = true;
  72. }
  73. return consumed;
  74. }
  75. void pokemon_scene_select_item_on_exit(void* context) {
  76. UNUSED(context);
  77. }
  78. void pokemon_scene_select_item_set_on_enter(void* context) {
  79. PokemonFap* pokemon_fap = (PokemonFap*)context;
  80. int i;
  81. const char* name;
  82. char letter =
  83. (char)scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneItemSet);
  84. /* Populate submenu with all items that start with `letter` */
  85. /* NOTE! Start with pos of 1 in the item list since 0 should always be no item! */
  86. submenu_reset(pokemon_fap->submenu);
  87. for(i = 1;; i++) {
  88. name = namedlist_name_get_pos(pokemon_fap->pdata->item_list, i);
  89. if(name == NULL) break;
  90. if(name[0] == letter &&
  91. (pokemon_fap->pdata->gen & namedlist_gen_get_pos(pokemon_fap->pdata->item_list, i))) {
  92. submenu_add_item(
  93. pokemon_fap->submenu,
  94. name,
  95. namedlist_index_get(pokemon_fap->pdata->item_list, i),
  96. select_item_selected_callback,
  97. pokemon_fap);
  98. }
  99. }
  100. }
  101. bool pokemon_scene_select_item_set_on_event(void* context, SceneManagerEvent event) {
  102. furi_assert(context);
  103. PokemonFap* pokemon_fap = context;
  104. bool consumed = false;
  105. if(event.type == SceneManagerEventTypeCustom) {
  106. if(event.event & PokemonSceneBack)
  107. scene_manager_previous_scene(pokemon_fap->scene_manager);
  108. else if(event.event & PokemonSceneSearch)
  109. scene_manager_search_and_switch_to_previous_scene(
  110. pokemon_fap->scene_manager, (event.event & ~PokemonSceneSearch));
  111. else
  112. scene_manager_next_scene(pokemon_fap->scene_manager, event.event);
  113. consumed = true;
  114. }
  115. return consumed;
  116. }
  117. void pokemon_scene_select_item_set_on_exit(void* context) {
  118. UNUSED(context);
  119. }