write_problems.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "write_problems.h"
  2. #include <gui/elements.h>
  3. #include "nfc_magic_icons.h"
  4. struct WriteProblems {
  5. View* view;
  6. WriteProblemsCallback callback;
  7. void* context;
  8. };
  9. typedef struct {
  10. uint8_t problem_index;
  11. uint8_t problems_total;
  12. FuriString* content;
  13. } WriteProblemsViewModel;
  14. static void write_problems_view_draw_callback(Canvas* canvas, void* _model) {
  15. WriteProblemsViewModel* model = _model;
  16. FuriString* header = furi_string_alloc();
  17. canvas_clear(canvas);
  18. // Header
  19. if(model->problems_total > 1) {
  20. furi_string_printf(
  21. header, "Warnings: %d of %d\n", model->problem_index + 1, model->problems_total);
  22. } else {
  23. furi_string_printf(header, "Warning!");
  24. }
  25. canvas_set_font(canvas, FontPrimary);
  26. canvas_draw_str_aligned(canvas, 64, 0, AlignCenter, AlignTop, furi_string_get_cstr(header));
  27. // Warning message
  28. canvas_set_font(canvas, FontSecondary);
  29. elements_text_box(
  30. canvas, 1, 13, 76, 42, AlignLeft, AlignTop, furi_string_get_cstr(model->content), false);
  31. // Butttons
  32. if(model->problem_index == model->problems_total - 1) {
  33. elements_button_center(canvas, "Skip");
  34. elements_button_left(canvas, "Retry");
  35. } else {
  36. elements_button_center(canvas, "Next");
  37. elements_button_left(canvas, "Back");
  38. }
  39. // Dolphin
  40. canvas_draw_icon(canvas, 83, 22, &I_WarningDolphinFlip_45x42);
  41. furi_string_free(header);
  42. }
  43. static bool write_problems_input_callback(InputEvent* event, void* context) {
  44. WriteProblems* instance = context;
  45. if(event->type == InputTypeShort) {
  46. if(event->key == InputKeyLeft) {
  47. instance->callback(WriteProblemsEventLeftPressed, instance->context);
  48. return true;
  49. } else if(event->key == InputKeyOk) {
  50. instance->callback(WriteProblemsEventCenterPressed, instance->context);
  51. return true;
  52. }
  53. }
  54. return false;
  55. }
  56. WriteProblems* write_problems_alloc() {
  57. WriteProblems* instance = malloc(sizeof(WriteProblems));
  58. instance->view = view_alloc();
  59. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(WriteProblemsViewModel));
  60. view_set_draw_callback(instance->view, write_problems_view_draw_callback);
  61. view_set_input_callback(instance->view, write_problems_input_callback);
  62. view_set_context(instance->view, instance);
  63. with_view_model(
  64. instance->view,
  65. WriteProblemsViewModel * model,
  66. {
  67. model->content = furi_string_alloc();
  68. model->problem_index = 0;
  69. model->problems_total = 0;
  70. },
  71. false);
  72. return instance;
  73. }
  74. void write_problems_free(WriteProblems* instance) {
  75. furi_assert(instance);
  76. with_view_model(
  77. instance->view,
  78. WriteProblemsViewModel * model,
  79. { furi_string_free(model->content); },
  80. false);
  81. view_free(instance->view);
  82. free(instance);
  83. }
  84. void write_problems_reset(WriteProblems* instance) {
  85. furi_assert(instance);
  86. with_view_model(
  87. instance->view,
  88. WriteProblemsViewModel * model,
  89. {
  90. model->problem_index = 0;
  91. model->problems_total = 0;
  92. furi_string_reset(model->content);
  93. },
  94. true);
  95. }
  96. View* write_problems_get_view(WriteProblems* instance) {
  97. furi_assert(instance);
  98. return instance->view;
  99. }
  100. void write_problems_set_callback(
  101. WriteProblems* instance,
  102. WriteProblemsCallback callback,
  103. void* context) {
  104. furi_assert(instance);
  105. instance->callback = callback;
  106. instance->context = context;
  107. }
  108. void write_problems_set_content(WriteProblems* instance, const char* content) {
  109. furi_assert(instance);
  110. furi_assert(content);
  111. with_view_model(
  112. instance->view,
  113. WriteProblemsViewModel * model,
  114. { furi_string_set(model->content, content); },
  115. true);
  116. }
  117. void write_problems_set_problems_total(WriteProblems* instance, uint8_t problems_total) {
  118. furi_assert(instance);
  119. with_view_model(
  120. instance->view,
  121. WriteProblemsViewModel * model,
  122. { model->problems_total = problems_total; },
  123. true);
  124. }
  125. void write_problems_set_problem_index(WriteProblems* instance, uint8_t problem_index) {
  126. furi_assert(instance);
  127. with_view_model(
  128. instance->view,
  129. WriteProblemsViewModel * model,
  130. { model->problem_index = problem_index; },
  131. true);
  132. }