progress.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "progress.h"
  2. #include <gui/canvas.h>
  3. #include <gui/elements.h>
  4. #include "video_game_module_tool_icons.h"
  5. struct Progress {
  6. View* view;
  7. };
  8. typedef struct {
  9. FuriString* text;
  10. uint8_t progress;
  11. } ProgressModel;
  12. static void progress_draw_callback(Canvas* canvas, void* _model) {
  13. ProgressModel* model = _model;
  14. canvas_set_font(canvas, FontPrimary);
  15. canvas_draw_str_aligned(canvas, 64, 0, AlignCenter, AlignTop, "INSTALLING");
  16. canvas_draw_icon(canvas, 34, 11, &I_Flashing_module_70x30);
  17. elements_progress_bar_with_text(
  18. canvas, 22, 45, 84, model->progress / 100.f, furi_string_get_cstr(model->text));
  19. }
  20. Progress* progress_alloc() {
  21. Progress* instance = malloc(sizeof(Progress));
  22. instance->view = view_alloc();
  23. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(ProgressModel));
  24. view_set_draw_callback(instance->view, progress_draw_callback);
  25. with_view_model(
  26. instance->view,
  27. ProgressModel * model,
  28. {
  29. model->progress = 0;
  30. model->text = furi_string_alloc_printf("0%%");
  31. },
  32. true);
  33. return instance;
  34. }
  35. void progress_free(Progress* instance) {
  36. with_view_model(
  37. instance->view, ProgressModel * model, { furi_string_free(model->text); }, false);
  38. view_free(instance->view);
  39. free(instance);
  40. }
  41. View* progress_get_view(Progress* instance) {
  42. return instance->view;
  43. }
  44. void progress_set_value(Progress* instance, uint8_t value) {
  45. bool update = false;
  46. with_view_model(
  47. instance->view,
  48. ProgressModel * model,
  49. {
  50. update = model->progress != value;
  51. if(update) {
  52. furi_string_printf(model->text, "%u%%", value);
  53. model->progress = value;
  54. }
  55. },
  56. update);
  57. }
  58. void progress_reset(Progress* instance) {
  59. progress_set_value(instance, 0);
  60. }