select_pokemon.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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. bool consumed = false;
  22. furi_assert(context);
  23. /* We only handle InputTypePress at the moment */
  24. if(event->type != InputTypePress) return consumed;
  25. switch(event->key) {
  26. /* Advance to next view with the selected pokemon */
  27. case InputKeyOk:
  28. view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewTrade);
  29. consumed = true;
  30. break;
  31. /* Return to the previous view */
  32. case InputKeyBack:
  33. view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, VIEW_NONE);
  34. consumed = true;
  35. break;
  36. /* Move back one through the pokedex listing */
  37. case InputKeyLeft:
  38. if(pokemon_fap->curr_pokemon == 0)
  39. pokemon_fap->curr_pokemon = 150;
  40. else
  41. pokemon_fap->curr_pokemon--;
  42. consumed = true;
  43. break;
  44. /* Move back ten through the pokemon listing, wrap to max pokemon on
  45. * underflow.
  46. */
  47. case InputKeyDown:
  48. if(pokemon_fap->curr_pokemon >= 10)
  49. pokemon_fap->curr_pokemon -= 10;
  50. else
  51. pokemon_fap->curr_pokemon = 150;
  52. consumed = true;
  53. break;
  54. /* Move forward one through the pokedex listing */
  55. case InputKeyRight:
  56. if(pokemon_fap->curr_pokemon == 150)
  57. pokemon_fap->curr_pokemon = 0;
  58. else
  59. pokemon_fap->curr_pokemon++;
  60. consumed = true;
  61. break;
  62. /* Move forward ten through the pokemon listing, wrap to min pokemon on
  63. * overflow.
  64. */
  65. case InputKeyUp:
  66. if(pokemon_fap->curr_pokemon <= 140)
  67. pokemon_fap->curr_pokemon += 10;
  68. else
  69. pokemon_fap->curr_pokemon = 0;
  70. consumed = true;
  71. break;
  72. default:
  73. // Do Nothing
  74. break;
  75. }
  76. return consumed;
  77. }
  78. void select_pokemon_enter_callback(void* context) {
  79. furi_assert(context);
  80. UNUSED(context);
  81. }
  82. bool select_pokemon_custom_callback(uint32_t event, void* context) {
  83. PokemonFap* pokemon_fap = (PokemonFap*)context;
  84. UNUSED(event);
  85. furi_assert(context);
  86. view_dispatcher_send_custom_event(pokemon_fap->view_dispatcher, 0);
  87. return true;
  88. }
  89. void select_pokemon_exit_callback(void* context) {
  90. furi_assert(context);
  91. UNUSED(context);
  92. }
  93. View* select_pokemon_alloc(PokemonFap* pokemon_fap) {
  94. View* view;
  95. view = view_alloc();
  96. view_set_context(view, pokemon_fap);
  97. view_allocate_model(view, ViewModelTypeLockFree, sizeof(PokemonFap**));
  98. with_view_model_cpp(
  99. view, PokemonFap**, model_fap, { *model_fap = pokemon_fap; }, false);
  100. view_set_draw_callback(view, select_pokemon_render_callback);
  101. view_set_input_callback(view, select_pokemon_input_callback);
  102. view_set_enter_callback(view, select_pokemon_enter_callback);
  103. view_set_custom_callback(view, select_pokemon_custom_callback);
  104. view_set_exit_callback(view, select_pokemon_exit_callback);
  105. return view;
  106. }
  107. void select_pokemon_free(PokemonFap* pokemon_fap) {
  108. furi_assert(pokemon_fap);
  109. view_free(pokemon_fap->select_view);
  110. }
  111. View* select_pokemon_get_view(PokemonFap* pokemon_fap) {
  112. furi_assert(pokemon_fap);
  113. return pokemon_fap->select_view;
  114. }