select_move1.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "../pokemon_app.h"
  2. #include "select_move1.hpp"
  3. static void select_move1_render_callback(Canvas* canvas, void* context) {
  4. canvas_clear(canvas);
  5. SelectPokemonModel* model = (SelectPokemonModel*)context;
  6. const uint8_t current_index = model->current_move;
  7. char move_num[5];
  8. snprintf(move_num, sizeof(move_num), "#%03d", current_index + 1);
  9. canvas_set_font(canvas, FontPrimary);
  10. canvas_draw_str_aligned(
  11. canvas, 55, 54 / 2, AlignLeft, AlignTop, move_table[current_index].name);
  12. canvas_set_font(canvas, FontSecondary);
  13. canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, move_num);
  14. canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
  15. canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
  16. canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Move #1");
  17. canvas_set_font(canvas, FontPrimary);
  18. elements_button_center(canvas, "OK");
  19. }
  20. static bool select_move1_input_callback(InputEvent* event, void* context) {
  21. furi_assert(context);
  22. SelectMove1* select_move1 = (SelectMove1*)context;
  23. bool consumed = false;
  24. if(event->type == InputTypePress && event->key == InputKeyOk) {
  25. with_view_model_cpp(
  26. select_move1->view,
  27. SelectPokemonModel*,
  28. model,
  29. {
  30. select_move1->app->current_move = model->current_move;
  31. select_move1->app->move1_hex_code = move_table[model->current_move].hex;
  32. },
  33. false);
  34. view_dispatcher_switch_to_view(select_move1->app->view_dispatcher, AppViewSelectMove2);
  35. consumed = true;
  36. } else if(event->type == InputTypePress && event->key == InputKeyBack) {
  37. view_dispatcher_switch_to_view(select_move1->app->view_dispatcher, AppViewSelectStats);
  38. consumed = true;
  39. } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
  40. with_view_model_cpp(
  41. select_move1->view,
  42. SelectPokemonModel*,
  43. model,
  44. {
  45. if(model->current_move == 0) {
  46. model->current_move = 165;
  47. } else {
  48. model->current_move--;
  49. }
  50. },
  51. true);
  52. consumed = true;
  53. } else if(event->type == InputTypePress && event->key == InputKeyDown) {
  54. with_view_model_cpp(
  55. select_move1->view,
  56. SelectPokemonModel*,
  57. model,
  58. {
  59. if(model->current_move >= 10) {
  60. model->current_move -= 10;
  61. } else {
  62. model->current_move = 165;
  63. }
  64. },
  65. true);
  66. consumed = true;
  67. } else if(event->type == InputTypePress && event->key == InputKeyRight) {
  68. with_view_model_cpp(
  69. select_move1->view,
  70. SelectPokemonModel*,
  71. model,
  72. {
  73. if(model->current_move == 165) {
  74. model->current_move = 0;
  75. } else {
  76. model->current_move++;
  77. }
  78. },
  79. true);
  80. consumed = true;
  81. } else if(event->type == InputTypePress && event->key == InputKeyUp) {
  82. with_view_model_cpp(
  83. select_move1->view,
  84. SelectPokemonModel*,
  85. model,
  86. {
  87. if(model->current_move <= 155) {
  88. model->current_move += 10;
  89. } else {
  90. model->current_move = 0;
  91. ;
  92. }
  93. },
  94. true);
  95. consumed = true;
  96. }
  97. return consumed;
  98. }
  99. void select_move1_enter_callback(void* context) {
  100. furi_assert(context);
  101. SelectMove1* select_move1 = (SelectMove1*)context;
  102. with_view_model_cpp(
  103. select_move1->view,
  104. SelectPokemonModel*,
  105. model,
  106. {
  107. model->current_pokemon = select_move1->app->current_pokemon;
  108. model->pokemon_hex_code = select_move1->app->pokemon_hex_code;
  109. model->current_level = select_move1->app->current_level;
  110. model->current_stats = select_move1->app->current_stats;
  111. model->move1_hex_code = select_move1->app->move1_hex_code;
  112. },
  113. true);
  114. }
  115. bool select_move1_custom_callback(uint32_t event, void* context) {
  116. UNUSED(event);
  117. furi_assert(context);
  118. SelectMove1* select_move1 = (SelectMove1*)context;
  119. view_dispatcher_send_custom_event(select_move1->app->view_dispatcher, 0);
  120. return true;
  121. }
  122. void select_move1_exit_callback(void* context) {
  123. furi_assert(context);
  124. UNUSED(context);
  125. }
  126. SelectMove1* select_move1_alloc(App* app) {
  127. SelectMove1* select_move1 = (SelectMove1*)malloc(sizeof(SelectMove1));
  128. select_move1->app = app;
  129. select_move1->view = view_alloc();
  130. view_set_context(select_move1->view, select_move1);
  131. view_allocate_model(select_move1->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
  132. with_view_model_cpp(
  133. select_move1->view,
  134. SelectPokemonModel*,
  135. model,
  136. {
  137. model->current_move = app->current_move;
  138. model->move1_hex_code = app->move1_hex_code;
  139. },
  140. true);
  141. view_set_draw_callback(select_move1->view, select_move1_render_callback);
  142. view_set_input_callback(select_move1->view, select_move1_input_callback);
  143. view_set_enter_callback(select_move1->view, select_move1_enter_callback);
  144. view_set_custom_callback(select_move1->view, select_move1_custom_callback);
  145. view_set_exit_callback(select_move1->view, select_move1_exit_callback);
  146. return select_move1;
  147. }
  148. void select_move1_free(App* app) {
  149. furi_assert(app->select_move1);
  150. view_free(app->select_move1->view);
  151. free(app->select_move1);
  152. }
  153. View* select_move1_get_view(App* app) {
  154. furi_assert(app->select_move1);
  155. return app->select_move1->view;
  156. }