select_stats.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "../pokemon_app.h"
  2. #include "select_stats.hpp"
  3. static void select_stats_render_callback(Canvas* canvas, void* context) {
  4. canvas_clear(canvas);
  5. SelectPokemonModel* model = (SelectPokemonModel*)context;
  6. const uint8_t current_index = model->current_stats;
  7. canvas_set_font(canvas, FontPrimary);
  8. if(current_index == 0) {
  9. canvas_draw_str_aligned(
  10. canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
  11. canvas_draw_str_aligned(
  12. canvas, 55, 38, AlignLeft, AlignTop, "Zero EV");
  13. } else if(current_index == 1) {
  14. canvas_draw_str_aligned(
  15. canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
  16. canvas_draw_str_aligned(
  17. canvas, 55, 38, AlignLeft, AlignTop, "Max EV / Lvl");
  18. } else if(current_index == 2) {
  19. canvas_draw_str_aligned(
  20. canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
  21. canvas_draw_str_aligned(
  22. canvas, 55, 38, AlignLeft, AlignTop, "Max EV");
  23. } else if(current_index == 3) {
  24. canvas_draw_str_aligned(
  25. canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
  26. canvas_draw_str_aligned(
  27. canvas, 55, 38, AlignLeft, AlignTop, "Zero EV");
  28. } else if(current_index == 4) {
  29. canvas_draw_str_aligned(
  30. canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
  31. canvas_draw_str_aligned(
  32. canvas, 55, 38, AlignLeft, AlignTop, "Max EV / Lvl");
  33. } else if(current_index == 5) {
  34. canvas_draw_str_aligned(
  35. canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
  36. canvas_draw_str_aligned(
  37. canvas, 55, 38, AlignLeft, AlignTop, "Max EV");
  38. }
  39. canvas_set_font(canvas, FontSecondary);
  40. canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
  41. canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
  42. canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Stats");
  43. canvas_set_font(canvas, FontPrimary);
  44. elements_button_center(canvas, "OK");
  45. }
  46. static bool select_stats_input_callback(InputEvent* event, void* context) {
  47. furi_assert(context);
  48. SelectStats* select_stats = (SelectStats*)context;
  49. bool consumed = false;
  50. if(event->type == InputTypePress && event->key == InputKeyOk) {
  51. with_view_model_cpp(
  52. select_stats->view,
  53. SelectPokemonModel*,
  54. model,
  55. {
  56. select_stats->app->current_stats = model->current_stats;
  57. },
  58. false);
  59. view_dispatcher_switch_to_view(select_stats->app->view_dispatcher, AppViewSelectMove1);
  60. consumed = true;
  61. } else if(event->type == InputTypePress && event->key == InputKeyBack) {
  62. view_dispatcher_switch_to_view(select_stats->app->view_dispatcher, AppViewSelectLevel);
  63. consumed = true;
  64. } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
  65. with_view_model_cpp(
  66. select_stats->view,
  67. SelectPokemonModel*,
  68. model,
  69. {
  70. if(model->current_stats == 0) {
  71. model->current_stats = 5;
  72. } else {
  73. model->current_stats--;
  74. }
  75. },
  76. true);
  77. consumed = true;
  78. } else if(event->type == InputTypePress && event->key == InputKeyDown) {
  79. with_view_model_cpp(
  80. select_stats->view,
  81. SelectPokemonModel*,
  82. model,
  83. {
  84. if(model->current_stats == 0) {
  85. model->current_stats = 5;
  86. } else {
  87. model->current_stats--;
  88. }
  89. },
  90. true);
  91. consumed = true;
  92. } else if(event->type == InputTypePress && event->key == InputKeyRight) {
  93. with_view_model_cpp(
  94. select_stats->view,
  95. SelectPokemonModel*,
  96. model,
  97. {
  98. if(model->current_stats == 5) {
  99. model->current_stats = 0;
  100. } else {
  101. model->current_stats++;
  102. }
  103. },
  104. true);
  105. consumed = true;
  106. } else if(event->type == InputTypePress && event->key == InputKeyUp) {
  107. with_view_model_cpp(
  108. select_stats->view,
  109. SelectPokemonModel*,
  110. model,
  111. {
  112. if(model->current_stats == 5) {
  113. model->current_stats = 0;
  114. } else {
  115. model->current_stats++;
  116. }
  117. },
  118. true);
  119. consumed = true;
  120. }
  121. return consumed;
  122. }
  123. void select_stats_enter_callback(void* context) {
  124. furi_assert(context);
  125. SelectStats* select_stats = (SelectStats*)context;
  126. with_view_model_cpp(
  127. select_stats->view,
  128. SelectPokemonModel*,
  129. model,
  130. {
  131. model->current_pokemon = select_stats->app->current_pokemon;
  132. model->pokemon_hex_code = select_stats->app->pokemon_hex_code;
  133. model->current_level = select_stats->app->current_level;
  134. model->current_stats = select_stats->app->current_stats;
  135. },
  136. true);
  137. }
  138. bool select_stats_custom_callback(uint32_t event, void* context) {
  139. UNUSED(event);
  140. furi_assert(context);
  141. SelectStats* select_stats = (SelectStats*)context;
  142. view_dispatcher_send_custom_event(select_stats->app->view_dispatcher, 0);
  143. return true;
  144. }
  145. void select_stats_exit_callback(void* context) {
  146. furi_assert(context);
  147. UNUSED(context);
  148. }
  149. SelectStats* select_stats_alloc(App* app) {
  150. SelectStats* select_stats = (SelectStats*)malloc(sizeof(SelectStats));
  151. select_stats->app = app;
  152. select_stats->view = view_alloc();
  153. view_set_context(select_stats->view, select_stats);
  154. view_allocate_model(select_stats->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
  155. with_view_model_cpp(
  156. select_stats->view,
  157. SelectPokemonModel*,
  158. model,
  159. {
  160. model->current_stats = app->current_stats;
  161. },
  162. true);
  163. view_set_draw_callback(select_stats->view, select_stats_render_callback);
  164. view_set_input_callback(select_stats->view, select_stats_input_callback);
  165. view_set_enter_callback(select_stats->view, select_stats_enter_callback);
  166. view_set_custom_callback(select_stats->view, select_stats_custom_callback);
  167. view_set_exit_callback(select_stats->view, select_stats_exit_callback);
  168. return select_stats;
  169. }
  170. void select_stats_free(App* app) {
  171. furi_assert(app->select_stats);
  172. view_free(app->select_stats->view);
  173. free(app->select_stats);
  174. }
  175. View* select_stats_get_view(App* app) {
  176. furi_assert(app->select_stats);
  177. return app->select_stats->view;
  178. }