select_pokemon.cpp 4.0 KB

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