select_level.cpp 5.5 KB

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