flipp_pomodoro_info_view.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include <furi.h>
  2. #include <gui/gui.h>
  3. #include <gui/elements.h>
  4. #include <gui/view.h>
  5. #include "flipp_pomodoro_info_view.h"
  6. // Auto-compiled icons
  7. #include "flipp_pomodoro_icons.h"
  8. enum {
  9. ViewInputConsumed = true,
  10. ViewInputNotConusmed = false,
  11. };
  12. struct FlippPomodoroInfoView {
  13. View* view;
  14. FlippPomodoroInfoViewUserActionCb resume_timer_cb;
  15. void* user_action_cb_ctx;
  16. };
  17. typedef struct {
  18. uint8_t pomodoros_completed;
  19. FlippPomodoroInfoViewMode mode;
  20. } FlippPomodoroInfoViewModel;
  21. static void
  22. flipp_pomodoro_info_view_draw_statistics(Canvas* canvas, FlippPomodoroInfoViewModel* model) {
  23. FuriString* stats_string = furi_string_alloc();
  24. furi_string_printf(
  25. stats_string,
  26. "So Long,\nand Thanks for All the Focus...\nand for completing\n\e#%i\e# pomodoro(s)",
  27. model->pomodoros_completed);
  28. const char* stats_string_formatted = furi_string_get_cstr(stats_string);
  29. elements_text_box(
  30. canvas,
  31. 0,
  32. 0,
  33. canvas_width(canvas),
  34. canvas_height(canvas) - 10,
  35. AlignCenter,
  36. AlignCenter,
  37. stats_string_formatted,
  38. true);
  39. furi_string_free(stats_string);
  40. elements_button_left(canvas, "Guide");
  41. }
  42. static void
  43. flipp_pomodoro_info_view_draw_about(Canvas* canvas, FlippPomodoroInfoViewModel* model) {
  44. UNUSED(model);
  45. canvas_draw_icon(canvas, 0, 0, &I_flipp_pomodoro_learn_50x128);
  46. elements_button_left(canvas, "Stats");
  47. }
  48. static void flipp_pomodoro_info_view_draw_callback(Canvas* canvas, void* _model) {
  49. if(!_model) {
  50. return;
  51. };
  52. FlippPomodoroInfoViewModel* model = _model;
  53. canvas_clear(canvas);
  54. if(model->mode == FlippPomodoroInfoViewModeStats) {
  55. flipp_pomodoro_info_view_draw_statistics(canvas, model);
  56. } else {
  57. flipp_pomodoro_info_view_draw_about(canvas, model);
  58. }
  59. elements_button_right(canvas, "Resume");
  60. }
  61. void flipp_pomodoro_info_view_set_mode(View* view, FlippPomodoroInfoViewMode desired_mode) {
  62. with_view_model(
  63. view, FlippPomodoroInfoViewModel * model, { model->mode = desired_mode; }, false);
  64. }
  65. void flipp_pomodoro_info_view_toggle_mode(FlippPomodoroInfoView* info_view) {
  66. with_view_model(
  67. flipp_pomodoro_info_view_get_view(info_view),
  68. FlippPomodoroInfoViewModel * model,
  69. {
  70. flipp_pomodoro_info_view_set_mode(
  71. flipp_pomodoro_info_view_get_view(info_view),
  72. (model->mode == FlippPomodoroInfoViewModeStats) ? FlippPomodoroInfoViewModeAbout :
  73. FlippPomodoroInfoViewModeStats);
  74. },
  75. true);
  76. }
  77. bool flipp_pomodoro_info_view_input_callback(InputEvent* event, void* ctx) {
  78. FlippPomodoroInfoView* info_view = ctx;
  79. if(event->type == InputTypePress) {
  80. if(event->key == InputKeyRight && info_view->resume_timer_cb != NULL) {
  81. info_view->resume_timer_cb(info_view->user_action_cb_ctx);
  82. return ViewInputConsumed;
  83. } else if(event->key == InputKeyLeft) {
  84. flipp_pomodoro_info_view_toggle_mode(info_view);
  85. return ViewInputConsumed;
  86. }
  87. }
  88. return ViewInputNotConusmed;
  89. }
  90. FlippPomodoroInfoView* flipp_pomodoro_info_view_alloc() {
  91. FlippPomodoroInfoView* info_view = malloc(sizeof(FlippPomodoroInfoView));
  92. info_view->view = view_alloc();
  93. view_allocate_model(
  94. flipp_pomodoro_info_view_get_view(info_view),
  95. ViewModelTypeLockFree,
  96. sizeof(FlippPomodoroInfoViewModel));
  97. view_set_context(flipp_pomodoro_info_view_get_view(info_view), info_view);
  98. view_set_draw_callback(
  99. flipp_pomodoro_info_view_get_view(info_view), flipp_pomodoro_info_view_draw_callback);
  100. view_set_input_callback(
  101. flipp_pomodoro_info_view_get_view(info_view), flipp_pomodoro_info_view_input_callback);
  102. return info_view;
  103. }
  104. View* flipp_pomodoro_info_view_get_view(FlippPomodoroInfoView* info_view) {
  105. return info_view->view;
  106. }
  107. void flipp_pomodoro_info_view_free(FlippPomodoroInfoView* info_view) {
  108. furi_assert(info_view);
  109. view_free(info_view->view);
  110. free(info_view);
  111. }
  112. void flipp_pomodoro_info_view_set_pomodoros_completed(View* view, uint8_t pomodoros_completed) {
  113. with_view_model(
  114. view,
  115. FlippPomodoroInfoViewModel * model,
  116. { model->pomodoros_completed = pomodoros_completed; },
  117. false);
  118. }
  119. void flipp_pomodoro_info_view_set_resume_timer_cb(
  120. FlippPomodoroInfoView* info_view,
  121. FlippPomodoroInfoViewUserActionCb user_action_cb,
  122. void* user_action_cb_ctx) {
  123. info_view->resume_timer_cb = user_action_cb;
  124. info_view->user_action_cb_ctx = user_action_cb_ctx;
  125. }