#include #include #include #include #include "flipp_pomodoro_info_view.h" // Auto-compiled icons #include "flipp_pomodoro_icons.h" enum { ViewInputConsumed = true, ViewInputNotConusmed = false, }; struct FlippPomodoroInfoView { View *view; FlippPomodoroInfoViewUserActionCb resume_timer_cb; void *user_action_cb_ctx; }; typedef struct { uint8_t pomodoros_completed; FlippPomodoroInfoViewMode mode; } FlippPomodoroInfoViewModel; static void flipp_pomodoro_info_view_draw_statistics(Canvas *canvas, FlippPomodoroInfoViewModel *model) { FuriString *stats_string = furi_string_alloc(); furi_string_printf(stats_string, "So Long,\nand Thanks for All the Focus...\nand for completing\n\e#%i\e# pomodoro(s)", model->pomodoros_completed); const char *stats_string_formatted = furi_string_get_cstr(stats_string); elements_text_box( canvas, 0, 0, canvas_width(canvas), canvas_height(canvas) - 10, AlignCenter, AlignCenter, stats_string_formatted, true); furi_string_free(stats_string); elements_button_left(canvas, "Guide"); } static void flipp_pomodoro_info_view_draw_about(Canvas *canvas, FlippPomodoroInfoViewModel *model) { UNUSED(model); canvas_draw_icon(canvas, 0, 0, &I_flipp_pomodoro_learn_50x128); elements_button_left(canvas, "Stats"); } static void flipp_pomodoro_info_view_draw_callback(Canvas *canvas, void *_model) { if (!_model) { return; }; FlippPomodoroInfoViewModel *model = _model; canvas_clear(canvas); if (model->mode == FlippPomodoroInfoViewModeStats) { flipp_pomodoro_info_view_draw_statistics(canvas, model); } else { flipp_pomodoro_info_view_draw_about(canvas, model); } elements_button_right(canvas, "Resume"); } void flipp_pomodoro_info_view_set_mode(View *view, FlippPomodoroInfoViewMode desired_mode) { with_view_model( view, FlippPomodoroInfoViewModel * model, { model->mode = desired_mode; }, false); } void flipp_pomodoro_info_view_toggle_mode(FlippPomodoroInfoView *info_view) { with_view_model( flipp_pomodoro_info_view_get_view(info_view), FlippPomodoroInfoViewModel * model, { flipp_pomodoro_info_view_set_mode( flipp_pomodoro_info_view_get_view(info_view), (model->mode == FlippPomodoroInfoViewModeStats) ? FlippPomodoroInfoViewModeAbout : FlippPomodoroInfoViewModeStats); }, true); } bool flipp_pomodoro_info_view_input_callback(InputEvent *event, void *ctx) { FlippPomodoroInfoView *info_view = ctx; if (event->type == InputTypePress) { if (event->key == InputKeyRight && info_view->resume_timer_cb != NULL) { info_view->resume_timer_cb(info_view->user_action_cb_ctx); return ViewInputConsumed; } else if (event->key == InputKeyLeft) { flipp_pomodoro_info_view_toggle_mode(info_view); return ViewInputConsumed; } } return ViewInputNotConusmed; } FlippPomodoroInfoView *flipp_pomodoro_info_view_alloc() { FlippPomodoroInfoView *info_view = malloc(sizeof(FlippPomodoroInfoView)); info_view->view = view_alloc(); view_allocate_model(flipp_pomodoro_info_view_get_view(info_view), ViewModelTypeLockFree, sizeof(FlippPomodoroInfoViewModel)); view_set_context(flipp_pomodoro_info_view_get_view(info_view), info_view); view_set_draw_callback(flipp_pomodoro_info_view_get_view(info_view), flipp_pomodoro_info_view_draw_callback); view_set_input_callback(flipp_pomodoro_info_view_get_view(info_view), flipp_pomodoro_info_view_input_callback); return info_view; } View *flipp_pomodoro_info_view_get_view(FlippPomodoroInfoView *info_view) { return info_view->view; } void flipp_pomodoro_info_view_free(FlippPomodoroInfoView *info_view) { furi_assert(info_view); view_free(info_view->view); free(info_view); } void flipp_pomodoro_info_view_set_pomodoros_completed(View *view, uint8_t pomodoros_completed) { with_view_model( view, FlippPomodoroInfoViewModel * model, { model->pomodoros_completed = pomodoros_completed; }, false); } void flipp_pomodoro_info_view_set_resume_timer_cb(FlippPomodoroInfoView *info_view, FlippPomodoroInfoViewUserActionCb user_action_cb, void *user_action_cb_ctx) { info_view->resume_timer_cb = user_action_cb; info_view->user_action_cb_ctx = user_action_cb_ctx; }