|
|
@@ -10,53 +10,48 @@
|
|
|
// Auto-compiled icons
|
|
|
#include "flipp_pomodoro_icons.h"
|
|
|
|
|
|
-enum
|
|
|
-{
|
|
|
+enum {
|
|
|
ViewInputConsumed = true,
|
|
|
ViewInputNotConusmed = false,
|
|
|
};
|
|
|
|
|
|
-struct FlippPomodoroTimerView
|
|
|
-{
|
|
|
- View *view;
|
|
|
+struct FlippPomodoroTimerView {
|
|
|
+ View* view;
|
|
|
FlippPomodoroTimerViewInputCb right_cb;
|
|
|
FlippPomodoroTimerViewInputCb ok_cb;
|
|
|
- void *callback_context;
|
|
|
+ void* callback_context;
|
|
|
};
|
|
|
|
|
|
-typedef struct
|
|
|
-{
|
|
|
- IconAnimation *icon;
|
|
|
- FlippPomodoroState *state;
|
|
|
+typedef struct {
|
|
|
+ IconAnimation* icon;
|
|
|
+ FlippPomodoroState* state;
|
|
|
size_t scroll_counter;
|
|
|
- char *current_hint;
|
|
|
+ char* current_hint;
|
|
|
} FlippPomodoroTimerViewModel;
|
|
|
|
|
|
-static const Icon *stage_background_image[] = {
|
|
|
+static const Icon* stage_background_image[] = {
|
|
|
[FlippPomodoroStageFocus] = &A_flipp_pomodoro_focus_64,
|
|
|
[FlippPomodoroStageRest] = &A_flipp_pomodoro_rest_64,
|
|
|
[FlippPomodoroStageLongBreak] = &A_flipp_pomodoro_rest_64,
|
|
|
};
|
|
|
|
|
|
-static void flipp_pomodoro_view_timer_draw_countdown(Canvas *canvas, TimeDifference remaining_time)
|
|
|
-{
|
|
|
+static void
|
|
|
+ flipp_pomodoro_view_timer_draw_countdown(Canvas* canvas, TimeDifference remaining_time) {
|
|
|
canvas_set_font(canvas, FontBigNumbers);
|
|
|
const uint8_t right_border_margin = 1;
|
|
|
|
|
|
const uint8_t countdown_box_height = canvas_height(canvas) * 0.4;
|
|
|
const uint8_t countdown_box_width = canvas_width(canvas) * 0.5;
|
|
|
- const uint8_t countdown_box_x = canvas_width(canvas) - countdown_box_width - right_border_margin;
|
|
|
+ const uint8_t countdown_box_x =
|
|
|
+ canvas_width(canvas) - countdown_box_width - right_border_margin;
|
|
|
const uint8_t countdown_box_y = 15;
|
|
|
|
|
|
- elements_bold_rounded_frame(canvas,
|
|
|
- countdown_box_x,
|
|
|
- countdown_box_y,
|
|
|
- countdown_box_width,
|
|
|
- countdown_box_height);
|
|
|
+ elements_bold_rounded_frame(
|
|
|
+ canvas, countdown_box_x, countdown_box_y, countdown_box_width, countdown_box_height);
|
|
|
|
|
|
- FuriString *timer_string = furi_string_alloc();
|
|
|
+ FuriString* timer_string = furi_string_alloc();
|
|
|
furi_string_printf(timer_string, "%02u:%02u", remaining_time.minutes, remaining_time.seconds);
|
|
|
- const char *remaining_stage_time_string = furi_string_get_cstr(timer_string);
|
|
|
+ const char* remaining_stage_time_string = furi_string_get_cstr(timer_string);
|
|
|
canvas_draw_str_aligned(
|
|
|
canvas,
|
|
|
countdown_box_x + (countdown_box_width / 2),
|
|
|
@@ -69,38 +64,24 @@ static void flipp_pomodoro_view_timer_draw_countdown(Canvas *canvas, TimeDiffere
|
|
|
};
|
|
|
|
|
|
static void draw_str_with_drop_shadow(
|
|
|
- Canvas *canvas, uint8_t x,
|
|
|
+ Canvas* canvas,
|
|
|
+ uint8_t x,
|
|
|
uint8_t y,
|
|
|
Align horizontal,
|
|
|
Align vertical,
|
|
|
- const char *str)
|
|
|
-{
|
|
|
+ const char* str) {
|
|
|
canvas_set_color(canvas, ColorWhite);
|
|
|
- for (int x_off = -2; x_off <= 2; x_off++)
|
|
|
- {
|
|
|
- for (int y_off = -2; y_off <= 2; y_off++)
|
|
|
- {
|
|
|
- canvas_draw_str_aligned(
|
|
|
- canvas,
|
|
|
- x + x_off,
|
|
|
- y + y_off,
|
|
|
- horizontal,
|
|
|
- vertical,
|
|
|
- str);
|
|
|
+ for(int x_off = -2; x_off <= 2; x_off++) {
|
|
|
+ for(int y_off = -2; y_off <= 2; y_off++) {
|
|
|
+ canvas_draw_str_aligned(canvas, x + x_off, y + y_off, horizontal, vertical, str);
|
|
|
}
|
|
|
}
|
|
|
canvas_set_color(canvas, ColorBlack);
|
|
|
- canvas_draw_str_aligned(
|
|
|
- canvas,
|
|
|
- x,
|
|
|
- y,
|
|
|
- horizontal,
|
|
|
- vertical,
|
|
|
- str);
|
|
|
+ canvas_draw_str_aligned(canvas, x, y, horizontal, vertical, str);
|
|
|
}
|
|
|
|
|
|
-static void flipp_pomodoro_view_timer_draw_current_stage_label(Canvas *canvas, FlippPomodoroState *state)
|
|
|
-{
|
|
|
+static void
|
|
|
+ flipp_pomodoro_view_timer_draw_current_stage_label(Canvas* canvas, FlippPomodoroState* state) {
|
|
|
canvas_set_font(canvas, FontPrimary);
|
|
|
draw_str_with_drop_shadow(
|
|
|
canvas,
|
|
|
@@ -111,13 +92,12 @@ static void flipp_pomodoro_view_timer_draw_current_stage_label(Canvas *canvas, F
|
|
|
flipp_pomodoro__current_stage_label(state));
|
|
|
}
|
|
|
|
|
|
-static void flipp_pomodoro_view_timer_draw_hint(Canvas *canvas, FlippPomodoroTimerViewModel *model)
|
|
|
-{
|
|
|
+static void
|
|
|
+ flipp_pomodoro_view_timer_draw_hint(Canvas* canvas, FlippPomodoroTimerViewModel* model) {
|
|
|
size_t MAX_SCROLL_COUNTER = 300;
|
|
|
uint8_t SCROLL_DELAY_FRAMES = 3;
|
|
|
|
|
|
- if (model->scroll_counter >= MAX_SCROLL_COUNTER || model->current_hint == NULL)
|
|
|
- {
|
|
|
+ if(model->scroll_counter >= MAX_SCROLL_COUNTER || model->current_hint == NULL) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -127,23 +107,21 @@ static void flipp_pomodoro_view_timer_draw_hint(Canvas *canvas, FlippPomodoroTim
|
|
|
uint8_t hint_x = canvas_width(canvas) - hint_width - 6;
|
|
|
uint8_t hint_y = 35;
|
|
|
|
|
|
- FuriString *displayed_hint_string = furi_string_alloc();
|
|
|
+ FuriString* displayed_hint_string = furi_string_alloc();
|
|
|
|
|
|
- furi_string_printf(
|
|
|
- displayed_hint_string,
|
|
|
- "%s",
|
|
|
- model->current_hint);
|
|
|
+ furi_string_printf(displayed_hint_string, "%s", model->current_hint);
|
|
|
|
|
|
size_t perfect_duration = furi_string_size(displayed_hint_string) * 1.5;
|
|
|
|
|
|
- if (model->scroll_counter > perfect_duration)
|
|
|
- {
|
|
|
+ if(model->scroll_counter > perfect_duration) {
|
|
|
model->scroll_counter = MAX_SCROLL_COUNTER;
|
|
|
furi_string_free(displayed_hint_string);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- size_t scroll_offset = (model->scroll_counter < SCROLL_DELAY_FRAMES) ? 0 : model->scroll_counter - SCROLL_DELAY_FRAMES;
|
|
|
+ size_t scroll_offset = (model->scroll_counter < SCROLL_DELAY_FRAMES) ?
|
|
|
+ 0 :
|
|
|
+ model->scroll_counter - SCROLL_DELAY_FRAMES;
|
|
|
|
|
|
canvas_set_color(canvas, ColorWhite);
|
|
|
canvas_draw_box(canvas, hint_x, hint_y, hint_width + 3, hint_height);
|
|
|
@@ -163,24 +141,20 @@ static void flipp_pomodoro_view_timer_draw_hint(Canvas *canvas, FlippPomodoroTim
|
|
|
model->scroll_counter++;
|
|
|
}
|
|
|
|
|
|
-static void flipp_pomodoro_view_timer_draw_callback(Canvas *canvas, void *_model)
|
|
|
-{
|
|
|
- if (!_model)
|
|
|
- {
|
|
|
+static void flipp_pomodoro_view_timer_draw_callback(Canvas* canvas, void* _model) {
|
|
|
+ if(!_model) {
|
|
|
return;
|
|
|
};
|
|
|
|
|
|
- FlippPomodoroTimerViewModel *model = _model;
|
|
|
+ FlippPomodoroTimerViewModel* model = _model;
|
|
|
|
|
|
canvas_clear(canvas);
|
|
|
- if (model->icon)
|
|
|
- {
|
|
|
+ if(model->icon) {
|
|
|
canvas_draw_icon_animation(canvas, 0, 0, model->icon);
|
|
|
}
|
|
|
|
|
|
flipp_pomodoro_view_timer_draw_countdown(
|
|
|
- canvas,
|
|
|
- flipp_pomodoro__stage_remaining_duration(model->state));
|
|
|
+ canvas, flipp_pomodoro__stage_remaining_duration(model->state));
|
|
|
|
|
|
flipp_pomodoro_view_timer_draw_current_stage_label(canvas, model->state);
|
|
|
|
|
|
@@ -191,21 +165,18 @@ static void flipp_pomodoro_view_timer_draw_callback(Canvas *canvas, void *_model
|
|
|
flipp_pomodoro_view_timer_draw_hint(canvas, model);
|
|
|
};
|
|
|
|
|
|
-bool flipp_pomodoro_view_timer_input_callback(InputEvent *event, void *ctx)
|
|
|
-{
|
|
|
+bool flipp_pomodoro_view_timer_input_callback(InputEvent* event, void* ctx) {
|
|
|
furi_assert(ctx);
|
|
|
furi_assert(event);
|
|
|
- FlippPomodoroTimerView *timer = ctx;
|
|
|
+ FlippPomodoroTimerView* timer = ctx;
|
|
|
|
|
|
const bool is_press_event = event->type == InputTypePress;
|
|
|
|
|
|
- if (!is_press_event)
|
|
|
- {
|
|
|
+ if(!is_press_event) {
|
|
|
return ViewInputNotConusmed;
|
|
|
}
|
|
|
|
|
|
- switch (event->key)
|
|
|
- {
|
|
|
+ switch(event->key) {
|
|
|
case InputKeyRight:
|
|
|
timer->right_cb(timer->callback_context);
|
|
|
return ViewInputConsumed;
|
|
|
@@ -217,14 +188,12 @@ bool flipp_pomodoro_view_timer_input_callback(InputEvent *event, void *ctx)
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-View *flipp_pomodoro_view_timer_get_view(FlippPomodoroTimerView *timer)
|
|
|
-{
|
|
|
+View* flipp_pomodoro_view_timer_get_view(FlippPomodoroTimerView* timer) {
|
|
|
furi_assert(timer);
|
|
|
return timer->view;
|
|
|
};
|
|
|
|
|
|
-void flipp_pomodoro_view_timer_display_hint(View *view, char *hint)
|
|
|
-{
|
|
|
+void flipp_pomodoro_view_timer_display_hint(View* view, char* hint) {
|
|
|
with_view_model(
|
|
|
view,
|
|
|
FlippPomodoroTimerViewModel * model,
|
|
|
@@ -235,14 +204,12 @@ void flipp_pomodoro_view_timer_display_hint(View *view, char *hint)
|
|
|
true);
|
|
|
}
|
|
|
|
|
|
-void flipp_pomodoro_view_timer_assign_animation(View *view)
|
|
|
-{
|
|
|
+void flipp_pomodoro_view_timer_assign_animation(View* view) {
|
|
|
with_view_model(
|
|
|
view,
|
|
|
FlippPomodoroTimerViewModel * model,
|
|
|
{
|
|
|
- if (model->icon)
|
|
|
- {
|
|
|
+ if(model->icon) {
|
|
|
icon_animation_free(model->icon);
|
|
|
}
|
|
|
model->icon = icon_animation_alloc(
|
|
|
@@ -253,12 +220,14 @@ void flipp_pomodoro_view_timer_assign_animation(View *view)
|
|
|
true);
|
|
|
}
|
|
|
|
|
|
-FlippPomodoroTimerView *flipp_pomodoro_view_timer_alloc()
|
|
|
-{
|
|
|
- FlippPomodoroTimerView *timer = malloc(sizeof(FlippPomodoroTimerView));
|
|
|
+FlippPomodoroTimerView* flipp_pomodoro_view_timer_alloc() {
|
|
|
+ FlippPomodoroTimerView* timer = malloc(sizeof(FlippPomodoroTimerView));
|
|
|
timer->view = view_alloc();
|
|
|
|
|
|
- view_allocate_model(flipp_pomodoro_view_timer_get_view(timer), ViewModelTypeLockFree, sizeof(FlippPomodoroTimerViewModel));
|
|
|
+ view_allocate_model(
|
|
|
+ flipp_pomodoro_view_timer_get_view(timer),
|
|
|
+ ViewModelTypeLockFree,
|
|
|
+ sizeof(FlippPomodoroTimerViewModel));
|
|
|
|
|
|
view_set_context(flipp_pomodoro_view_timer_get_view(timer), timer);
|
|
|
view_set_draw_callback(timer->view, flipp_pomodoro_view_timer_draw_callback);
|
|
|
@@ -267,37 +236,37 @@ FlippPomodoroTimerView *flipp_pomodoro_view_timer_alloc()
|
|
|
with_view_model(
|
|
|
flipp_pomodoro_view_timer_get_view(timer),
|
|
|
FlippPomodoroTimerViewModel * model,
|
|
|
- {
|
|
|
- model->scroll_counter = 0;
|
|
|
- },
|
|
|
+ { model->scroll_counter = 0; },
|
|
|
false);
|
|
|
|
|
|
return timer;
|
|
|
};
|
|
|
|
|
|
-void flipp_pomodoro_view_timer_set_callback_context(FlippPomodoroTimerView *timer, void *callback_ctx)
|
|
|
-{
|
|
|
+void flipp_pomodoro_view_timer_set_callback_context(
|
|
|
+ FlippPomodoroTimerView* timer,
|
|
|
+ void* callback_ctx) {
|
|
|
furi_assert(timer);
|
|
|
furi_assert(callback_ctx);
|
|
|
timer->callback_context = callback_ctx;
|
|
|
}
|
|
|
|
|
|
-void flipp_pomodoro_view_timer_set_on_right_cb(FlippPomodoroTimerView *timer, FlippPomodoroTimerViewInputCb right_cb)
|
|
|
-{
|
|
|
+void flipp_pomodoro_view_timer_set_on_right_cb(
|
|
|
+ FlippPomodoroTimerView* timer,
|
|
|
+ FlippPomodoroTimerViewInputCb right_cb) {
|
|
|
furi_assert(timer);
|
|
|
furi_assert(right_cb);
|
|
|
timer->right_cb = right_cb;
|
|
|
};
|
|
|
|
|
|
-void flipp_pomodoro_view_timer_set_on_ok_cb(FlippPomodoroTimerView *timer, FlippPomodoroTimerViewInputCb ok_kb)
|
|
|
-{
|
|
|
+void flipp_pomodoro_view_timer_set_on_ok_cb(
|
|
|
+ FlippPomodoroTimerView* timer,
|
|
|
+ FlippPomodoroTimerViewInputCb ok_kb) {
|
|
|
furi_assert(ok_kb);
|
|
|
furi_assert(timer);
|
|
|
timer->ok_cb = ok_kb;
|
|
|
}
|
|
|
|
|
|
-void flipp_pomodoro_view_timer_set_state(View *view, FlippPomodoroState *state)
|
|
|
-{
|
|
|
+void flipp_pomodoro_view_timer_set_state(View* view, FlippPomodoroState* state) {
|
|
|
furi_assert(view);
|
|
|
furi_assert(state);
|
|
|
with_view_model(
|
|
|
@@ -311,15 +280,12 @@ void flipp_pomodoro_view_timer_set_state(View *view, FlippPomodoroState *state)
|
|
|
flipp_pomodoro_view_timer_assign_animation(view);
|
|
|
};
|
|
|
|
|
|
-void flipp_pomodoro_view_timer_free(FlippPomodoroTimerView *timer)
|
|
|
-{
|
|
|
+void flipp_pomodoro_view_timer_free(FlippPomodoroTimerView* timer) {
|
|
|
furi_assert(timer);
|
|
|
with_view_model(
|
|
|
timer->view,
|
|
|
FlippPomodoroTimerViewModel * model,
|
|
|
- {
|
|
|
- icon_animation_free(model->icon);
|
|
|
- },
|
|
|
+ { icon_animation_free(model->icon); },
|
|
|
false);
|
|
|
view_free(timer->view);
|
|
|
|