select_pokemon.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include <gui/elements.h>
  2. #include <pokemon_icons.h>
  3. #include "../scenes/pokemon_menu.h"
  4. #include "../pokemon_app.h"
  5. struct select_model {
  6. uint8_t curr_pokemon;
  7. const PokemonTable* pokemon_table;
  8. };
  9. static void select_pokemon_render_callback(Canvas* canvas, void* model) {
  10. struct select_model* view_model = model;
  11. uint8_t curr_pokemon = view_model->curr_pokemon;
  12. char pokedex_num[5];
  13. snprintf(pokedex_num, sizeof(pokedex_num), "#%03d", curr_pokemon + 1);
  14. canvas_set_font(canvas, FontPrimary);
  15. canvas_draw_str_aligned(
  16. canvas, 55, 54 / 2, AlignLeft, AlignTop, view_model->pokemon_table[curr_pokemon].name);
  17. canvas_set_font(canvas, FontSecondary);
  18. canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, pokedex_num);
  19. canvas_draw_icon(canvas, 0, 0, view_model->pokemon_table[curr_pokemon].icon);
  20. canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
  21. canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Pokemon");
  22. canvas_set_font(canvas, FontPrimary);
  23. elements_button_center(canvas, "OK");
  24. }
  25. static bool select_pokemon_input_callback(InputEvent* event, void* context) {
  26. PokemonFap* pokemon_fap = (PokemonFap*)context;
  27. bool consumed = false;
  28. uint8_t selected_pokemon;
  29. furi_assert(context);
  30. /* We only handle InputTypePress at the moment */
  31. if(event->type != InputTypePress) return consumed;
  32. with_view_model(
  33. pokemon_fap->select_view,
  34. struct select_model * model,
  35. { selected_pokemon = model->curr_pokemon; },
  36. false);
  37. switch(event->key) {
  38. /* Advance to next view with the selected pokemon */
  39. case InputKeyOk:
  40. pokemon_fap->curr_pokemon = selected_pokemon;
  41. FURI_LOG_D(TAG, "[Select] Selected %s", pokemon_fap->pokemon_table[selected_pokemon].name);
  42. scene_manager_previous_scene(pokemon_fap->scene_manager);
  43. consumed = true;
  44. break;
  45. /* Move back one through the pokedex listing */
  46. case InputKeyLeft:
  47. if(selected_pokemon == 0)
  48. selected_pokemon = 150;
  49. else
  50. selected_pokemon--;
  51. consumed = true;
  52. break;
  53. /* Move back ten through the pokemon listing, wrap to max pokemon on
  54. * underflow.
  55. */
  56. case InputKeyDown:
  57. if(selected_pokemon >= 10)
  58. selected_pokemon -= 10;
  59. else
  60. selected_pokemon = 150;
  61. consumed = true;
  62. break;
  63. /* Move forward one through the pokedex listing */
  64. case InputKeyRight:
  65. if(selected_pokemon == 150)
  66. selected_pokemon = 0;
  67. else
  68. selected_pokemon++;
  69. consumed = true;
  70. break;
  71. /* Move forward ten through the pokemon listing, wrap to min pokemon on
  72. * overflow.
  73. */
  74. case InputKeyUp:
  75. if(selected_pokemon <= 140)
  76. selected_pokemon += 10;
  77. else
  78. selected_pokemon = 0;
  79. consumed = true;
  80. break;
  81. default:
  82. // Do Nothing
  83. break;
  84. }
  85. with_view_model(
  86. pokemon_fap->select_view,
  87. struct select_model * model,
  88. { model->curr_pokemon = selected_pokemon; },
  89. true);
  90. return consumed;
  91. }
  92. void select_pokemon_enter_callback(void* context) {
  93. PokemonFap* pokemon_fap = (PokemonFap*)context;
  94. with_view_model(
  95. pokemon_fap->select_view,
  96. struct select_model * model,
  97. {
  98. model->curr_pokemon = (uint8_t)pokemon_fap->curr_pokemon;
  99. model->pokemon_table = pokemon_fap->pokemon_table;
  100. },
  101. true);
  102. }
  103. View* select_pokemon_alloc(PokemonFap* pokemon_fap) {
  104. View* view;
  105. view = view_alloc();
  106. view_set_context(view, pokemon_fap);
  107. view_allocate_model(view, ViewModelTypeLockFree, sizeof(struct select_model));
  108. view_set_draw_callback(view, select_pokemon_render_callback);
  109. view_set_input_callback(view, select_pokemon_input_callback);
  110. view_set_enter_callback(view, select_pokemon_enter_callback);
  111. return view;
  112. }
  113. void select_pokemon_free(PokemonFap* pokemon_fap) {
  114. furi_assert(pokemon_fap);
  115. view_free_model(pokemon_fap->select_view);
  116. view_free(pokemon_fap->select_view);
  117. }