select_pokemon.cpp 4.0 KB

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