loclass.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "loclass.h"
  2. #include <picopass_device.h>
  3. #include <gui/elements.h>
  4. struct Loclass {
  5. View* view;
  6. LoclassCallback callback;
  7. void* context;
  8. };
  9. typedef struct {
  10. FuriString* header;
  11. uint8_t num_macs;
  12. FuriString* subheader;
  13. } LoclassViewModel;
  14. static void loclass_draw_callback(Canvas* canvas, void* model) {
  15. LoclassViewModel* m = model;
  16. char draw_str[32] = {};
  17. canvas_set_font(canvas, FontPrimary);
  18. canvas_draw_str_aligned(canvas, 64, 0, AlignCenter, AlignTop, furi_string_get_cstr(m->header));
  19. canvas_set_font(canvas, FontSecondary);
  20. if(m->num_macs == 255) {
  21. return;
  22. }
  23. float progress = m->num_macs == 0 ? 0 :
  24. (float)(m->num_macs) / (float)(LOCLASS_MACS_TO_COLLECT);
  25. if(progress > 1.0) {
  26. progress = 1.0;
  27. }
  28. snprintf(draw_str, sizeof(draw_str), "%d/%d", m->num_macs, LOCLASS_MACS_TO_COLLECT);
  29. elements_progress_bar_with_text(canvas, 0, 20, 128, progress, draw_str);
  30. canvas_draw_str_aligned(
  31. canvas, 64, 45, AlignCenter, AlignBottom, furi_string_get_cstr(m->subheader));
  32. elements_button_center(canvas, "Skip");
  33. }
  34. static bool loclass_input_callback(InputEvent* event, void* context) {
  35. Loclass* loclass = context;
  36. bool consumed = false;
  37. if(event->type == InputTypeShort && event->key == InputKeyOk) {
  38. if(loclass->callback) {
  39. loclass->callback(loclass->context);
  40. }
  41. consumed = true;
  42. }
  43. return consumed;
  44. }
  45. Loclass* loclass_alloc() {
  46. Loclass* loclass = malloc(sizeof(Loclass));
  47. loclass->view = view_alloc();
  48. view_allocate_model(loclass->view, ViewModelTypeLocking, sizeof(LoclassViewModel));
  49. view_set_draw_callback(loclass->view, loclass_draw_callback);
  50. view_set_input_callback(loclass->view, loclass_input_callback);
  51. view_set_context(loclass->view, loclass);
  52. with_view_model(
  53. loclass->view, LoclassViewModel * model, { model->header = furi_string_alloc(); }, false);
  54. with_view_model(
  55. loclass->view,
  56. LoclassViewModel * model,
  57. { model->subheader = furi_string_alloc(); },
  58. false);
  59. return loclass;
  60. }
  61. void loclass_free(Loclass* loclass) {
  62. furi_assert(loclass);
  63. with_view_model(
  64. loclass->view, LoclassViewModel * model, { furi_string_free(model->header); }, false);
  65. with_view_model(
  66. loclass->view, LoclassViewModel * model, { furi_string_free(model->subheader); }, false);
  67. view_free(loclass->view);
  68. free(loclass);
  69. }
  70. void loclass_reset(Loclass* loclass) {
  71. furi_assert(loclass);
  72. with_view_model(
  73. loclass->view,
  74. LoclassViewModel * model,
  75. {
  76. model->num_macs = 0;
  77. furi_string_reset(model->header);
  78. furi_string_reset(model->subheader);
  79. },
  80. false);
  81. }
  82. View* loclass_get_view(Loclass* loclass) {
  83. furi_assert(loclass);
  84. return loclass->view;
  85. }
  86. void loclass_set_callback(Loclass* loclass, LoclassCallback callback, void* context) {
  87. furi_assert(loclass);
  88. furi_assert(callback);
  89. loclass->callback = callback;
  90. loclass->context = context;
  91. }
  92. void loclass_set_header(Loclass* loclass, const char* header) {
  93. furi_assert(loclass);
  94. furi_assert(header);
  95. with_view_model(
  96. loclass->view, LoclassViewModel * model, { furi_string_set(model->header, header); }, true);
  97. }
  98. void loclass_set_subheader(Loclass* loclass, const char* subheader) {
  99. furi_assert(loclass);
  100. furi_assert(subheader);
  101. with_view_model(
  102. loclass->view,
  103. LoclassViewModel * model,
  104. { furi_string_set(model->subheader, subheader); },
  105. true);
  106. }
  107. void loclass_set_num_macs(Loclass* loclass, uint16_t num_macs) {
  108. furi_assert(loclass);
  109. with_view_model(
  110. loclass->view, LoclassViewModel * model, { model->num_macs = num_macs; }, true);
  111. }