loclass.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. } LoclassViewModel;
  13. static void loclass_draw_callback(Canvas* canvas, void* model) {
  14. LoclassViewModel* m = model;
  15. char draw_str[32] = {};
  16. canvas_set_font(canvas, FontSecondary);
  17. canvas_draw_str_aligned(canvas, 64, 0, AlignCenter, AlignTop, furi_string_get_cstr(m->header));
  18. if(m->num_macs == 255) {
  19. return;
  20. }
  21. float progress = m->num_macs == 0 ? 0 :
  22. (float)(m->num_macs) / (float)(LOCLASS_MACS_TO_COLLECT);
  23. if(progress > 1.0) {
  24. progress = 1.0;
  25. }
  26. snprintf(draw_str, sizeof(draw_str), "%d/%d", m->num_macs, LOCLASS_MACS_TO_COLLECT);
  27. elements_progress_bar_with_text(canvas, 0, 20, 128, progress, draw_str);
  28. elements_button_center(canvas, "Skip");
  29. }
  30. static bool loclass_input_callback(InputEvent* event, void* context) {
  31. Loclass* loclass = context;
  32. bool consumed = false;
  33. if(event->type == InputTypeShort && event->key == InputKeyOk) {
  34. if(loclass->callback) {
  35. loclass->callback(loclass->context);
  36. }
  37. consumed = true;
  38. }
  39. return consumed;
  40. }
  41. Loclass* loclass_alloc() {
  42. Loclass* loclass = malloc(sizeof(Loclass));
  43. loclass->view = view_alloc();
  44. view_allocate_model(loclass->view, ViewModelTypeLocking, sizeof(LoclassViewModel));
  45. view_set_draw_callback(loclass->view, loclass_draw_callback);
  46. view_set_input_callback(loclass->view, loclass_input_callback);
  47. view_set_context(loclass->view, loclass);
  48. with_view_model(
  49. loclass->view, LoclassViewModel * model, { model->header = furi_string_alloc(); }, false);
  50. return loclass;
  51. }
  52. void loclass_free(Loclass* loclass) {
  53. furi_assert(loclass);
  54. with_view_model(
  55. loclass->view, LoclassViewModel * model, { furi_string_free(model->header); }, false);
  56. view_free(loclass->view);
  57. free(loclass);
  58. }
  59. void loclass_reset(Loclass* loclass) {
  60. furi_assert(loclass);
  61. with_view_model(
  62. loclass->view,
  63. LoclassViewModel * model,
  64. {
  65. model->num_macs = 0;
  66. furi_string_reset(model->header);
  67. },
  68. false);
  69. }
  70. View* loclass_get_view(Loclass* loclass) {
  71. furi_assert(loclass);
  72. return loclass->view;
  73. }
  74. void loclass_set_callback(Loclass* loclass, LoclassCallback callback, void* context) {
  75. furi_assert(loclass);
  76. furi_assert(callback);
  77. loclass->callback = callback;
  78. loclass->context = context;
  79. }
  80. void loclass_set_header(Loclass* loclass, const char* header) {
  81. furi_assert(loclass);
  82. furi_assert(header);
  83. with_view_model(
  84. loclass->view, LoclassViewModel * model, { furi_string_set(model->header, header); }, true);
  85. }
  86. void loclass_set_num_macs(Loclass* loclass, uint16_t num_macs) {
  87. furi_assert(loclass);
  88. with_view_model(
  89. loclass->view, LoclassViewModel * model, { model->num_macs = num_macs; }, true);
  90. }