select_pokemon.c 3.5 KB

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