select_pokemon.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. scene_manager_previous_scene(pokemon_fap->scene_manager);
  42. consumed = true;
  43. break;
  44. /* Move back one through the pokedex listing */
  45. case InputKeyLeft:
  46. if(selected_pokemon == 0)
  47. selected_pokemon = 150;
  48. else
  49. selected_pokemon--;
  50. consumed = true;
  51. break;
  52. /* Move back ten through the pokemon listing, wrap to max pokemon on
  53. * underflow.
  54. */
  55. case InputKeyDown:
  56. if(selected_pokemon >= 10)
  57. selected_pokemon -= 10;
  58. else
  59. selected_pokemon = 150;
  60. consumed = true;
  61. break;
  62. /* Move forward one through the pokedex listing */
  63. case InputKeyRight:
  64. if(selected_pokemon == 150)
  65. selected_pokemon = 0;
  66. else
  67. selected_pokemon++;
  68. consumed = true;
  69. break;
  70. /* Move forward ten through the pokemon listing, wrap to min pokemon on
  71. * overflow.
  72. */
  73. case InputKeyUp:
  74. if(selected_pokemon <= 140)
  75. selected_pokemon += 10;
  76. else
  77. selected_pokemon = 0;
  78. consumed = true;
  79. break;
  80. default:
  81. // Do Nothing
  82. break;
  83. }
  84. with_view_model(
  85. pokemon_fap->select_view,
  86. struct select_model * model,
  87. { model->curr_pokemon = selected_pokemon; },
  88. true);
  89. return consumed;
  90. }
  91. void select_pokemon_enter_callback(void* context) {
  92. PokemonFap* pokemon_fap = (PokemonFap*)context;
  93. with_view_model(
  94. pokemon_fap->select_view,
  95. struct select_model * model,
  96. {
  97. model->curr_pokemon = (uint8_t)pokemon_fap->curr_pokemon;
  98. model->pokemon_table = pokemon_fap->pokemon_table;
  99. },
  100. true);
  101. }
  102. View* select_pokemon_alloc(PokemonFap* pokemon_fap) {
  103. View* view;
  104. view = view_alloc();
  105. view_set_context(view, pokemon_fap);
  106. view_allocate_model(view, ViewModelTypeLockFree, sizeof(struct select_model));
  107. view_set_draw_callback(view, select_pokemon_render_callback);
  108. view_set_input_callback(view, select_pokemon_input_callback);
  109. view_set_enter_callback(view, select_pokemon_enter_callback);
  110. return view;
  111. }
  112. void select_pokemon_free(PokemonFap* pokemon_fap) {
  113. furi_assert(pokemon_fap);
  114. view_free_model(pokemon_fap->select_view);
  115. view_free(pokemon_fap->select_view);
  116. }