Skip to content

Commit 925ebc6

Browse files
authored
feat: animated stage background (#39)(#32)
* wip encapsulate current stage mechanism * add animations for stages * fix incorrect documentation commit * remove duplications in view * enable re-render after animation is assigned
1 parent 70e3a71 commit 925ebc6

12 files changed

+79
-13
lines changed

flipp_pomodoro_app.c

+8-2
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,22 @@ static bool flipp_pomodoro_app_custom_event_callback(void *ctx, uint32_t event)
3030
{
3131
case FlippPomodoroAppCustomEventStageSkip:
3232
flipp_pomodoro__toggle_stage(app->state);
33+
view_dispatcher_send_custom_event(
34+
app->view_dispatcher,
35+
FlippPomodoroAppCustomEventStateUpdated);
3336
return CustomEventConsumed;
3437
case FlippPomodoroAppCustomEventStageComplete:
35-
if (app->state->stage == Work)
38+
if (flipp_pomodoro__get_stage(app->state) == Work)
3639
{
3740
// REGISTER a deed on work stage complete to get an acheivement
3841
DOLPHIN_DEED(DolphinDeedPluginGameWin);
3942
};
4043

4144
flipp_pomodoro__toggle_stage(app->state);
42-
notification_message(app->notification_app, stage_start_notification_sequence_map[app->state->stage]);
45+
notification_message(app->notification_app, stage_start_notification_sequence_map[flipp_pomodoro__get_stage(app->state)]);
46+
view_dispatcher_send_custom_event(
47+
app->view_dispatcher,
48+
FlippPomodoroAppCustomEventStateUpdated);
4349
return CustomEventConsumed;
4450
default:
4551
break;

flipp_pomodoro_app.h

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ typedef enum
1616
FlippPomodoroAppCustomEventStageSkip = 100,
1717
FlippPomodoroAppCustomEventStageComplete, // By Expiration
1818
FlippPomodoroAppCustomEventTimerTick,
19+
FlippPomodoroAppCustomEventStateUpdated,
1920
} FlippPomodoroAppCustomEvent;
2021

2122
typedef struct
1.21 KB
Loading
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1
File renamed without changes.
1.05 KB
Loading
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1

modules/flipp_pomodoro.c

+9-3
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,20 @@ const PomodoroStage default_stage = Work;
1818
void flipp_pomodoro__toggle_stage(FlippPomodoroState *state)
1919
{
2020
furi_assert(state);
21-
state->stage = stage_rotaion_map[state->stage];
21+
state->stage = stage_rotaion_map[flipp_pomodoro__get_stage(state)];
2222
state->started_at_timestamp = time_now();
2323
};
2424

25+
PomodoroStage flipp_pomodoro__get_stage(FlippPomodoroState *state)
26+
{
27+
furi_assert(state);
28+
return state->stage;
29+
};
30+
2531
char *flipp_pomodoro__next_stage_label(FlippPomodoroState *state)
2632
{
2733
furi_assert(state);
28-
return next_stage_label[state->stage];
34+
return next_stage_label[flipp_pomodoro__get_stage(state)];
2935
};
3036

3137
void flipp_pomodoro__destroy(FlippPomodoroState *state)
@@ -41,7 +47,7 @@ uint32_t flipp_pomodoro__current_stage_total_duration(FlippPomodoroState *state)
4147
[Rest] = 5 * TIME_SECONDS_IN_MINUTE,
4248
};
4349

44-
return stage_duration_seconds_map[state->stage];
50+
return stage_duration_seconds_map[flipp_pomodoro__get_stage(state)];
4551
};
4652

4753
uint32_t flipp_pomodoro__stage_expires_timestamp(FlippPomodoroState *state)

modules/flipp_pomodoro.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,19 @@ typedef struct
1818
} FlippPomodoroState;
1919

2020
/// @brief Generates initial state
21-
/// @param state - pointer to the state of pomorodo.
2221
/// @returns A new pre-populated state for pomodoro timer
2322
FlippPomodoroState *flipp_pomodoro__new();
2423

24+
/// @brief Extract current stage of pomodoro
25+
/// @param state - pointer to the state of pomorodo
26+
/// @returns Current stage value
27+
PomodoroStage flipp_pomodoro__get_stage(FlippPomodoroState *state);
28+
2529
/// @brief Destroys state of timer and it's dependencies
2630
void flipp_pomodoro__destroy(FlippPomodoroState *state);
2731

2832
/// @brief Get remaining stage time.
29-
/// @param state - pointer to the state of pomorodo.
33+
/// @param state - pointer to the state of pomorodo
3034
/// @returns Time difference to the end of current stage
3135
TimeDifference flipp_pomodoro__stage_remaining_duration(FlippPomodoroState *state);
3236

scenes/flipp_pomodoro_scene_timer.c

+17-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@ enum
1212

1313
uint8_t ExitSignal = 0;
1414

15+
void flipp_pomodoro_scene_timer_sync_view_state(void *context)
16+
{
17+
furi_assert(context);
18+
19+
FlippPomodoroApp *app = context;
20+
21+
flipp_pomodoro_view_timer_set_state(
22+
flipp_pomodoro_view_timer_get_view(app->timer_view),
23+
app->state);
24+
};
25+
1526
void flipp_pomodoro_scene_timer_on_next_stage(void *ctx)
1627
{
1728
furi_assert(ctx);
@@ -30,9 +41,7 @@ void flipp_pomodoro_scene_timer_on_enter(void *context)
3041
FlippPomodoroApp *app = context;
3142

3243
view_dispatcher_switch_to_view(app->view_dispatcher, FlippPomodoroAppViewTimer);
33-
flipp_pomodoro_view_timer_set_state(
34-
flipp_pomodoro_view_timer_get_view(app->timer_view),
35-
app->state);
44+
flipp_pomodoro_scene_timer_sync_view_state(app);
3645
flipp_pomodoro_view_timer_set_on_right_cb(
3746
app->timer_view,
3847
flipp_pomodoro_scene_timer_on_next_stage,
@@ -47,6 +56,11 @@ void flipp_pomodoro_scene_timer_handle_custom_event(FlippPomodoroApp *app, Flipp
4756
app->view_dispatcher,
4857
FlippPomodoroAppCustomEventStageComplete);
4958
}
59+
60+
if (custom_event == FlippPomodoroAppCustomEventStateUpdated)
61+
{
62+
flipp_pomodoro_scene_timer_sync_view_state(app);
63+
}
5064
};
5165

5266
bool flipp_pomodoro_scene_timer_on_event(void *ctx, SceneManagerEvent event)

views/flipp_pomodoro_timer_view.c

+36-3
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@ struct FlippPomodoroTimerView
2525

2626
typedef struct
2727
{
28+
IconAnimation *icon;
2829
FlippPomodoroState *state;
2930
} FlippPomodoroTimerViewModel;
3031

3132
static const Icon *stage_background_image[] = {
32-
[Work] = &I_flipp_pomodoro_work_64,
33-
[Rest] = &I_flipp_pomodoro_rest_64,
33+
[Work] = &A_flipp_pomodoro_focus_64,
34+
[Rest] = &A_flipp_pomodoro_rest_64,
3435
};
3536

3637
static void flipp_pomodoro_view_timer_draw_countdown(Canvas *canvas, TimeDifference remaining_time)
@@ -73,7 +74,11 @@ static void flipp_pomodoro_view_timer_draw_callback(Canvas *canvas, void *_model
7374
FlippPomodoroTimerViewModel *model = _model;
7475

7576
canvas_clear(canvas);
76-
canvas_draw_icon(canvas, 0, 0, stage_background_image[model->state->stage]);
77+
if (model->icon)
78+
{
79+
canvas_draw_icon_animation(canvas, 0, 0, model->icon);
80+
}
81+
7782
flipp_pomodoro_view_timer_draw_countdown(
7883
canvas,
7984
flipp_pomodoro__stage_remaining_duration(model->state));
@@ -109,6 +114,25 @@ View *flipp_pomodoro_view_timer_get_view(FlippPomodoroTimerView *timer)
109114
return timer->view;
110115
};
111116

117+
void flipp_pomodoro_view_timer_assign_animation(View *view)
118+
{
119+
with_view_model(
120+
view,
121+
FlippPomodoroTimerViewModel * model,
122+
{
123+
furi_assert(model->state);
124+
if (model->icon)
125+
{
126+
icon_animation_free(model->icon);
127+
}
128+
model->icon = icon_animation_alloc(
129+
stage_background_image[flipp_pomodoro__get_stage(model->state)]);
130+
view_tie_icon_animation(view, model->icon);
131+
icon_animation_start(model->icon);
132+
},
133+
true);
134+
}
135+
112136
FlippPomodoroTimerView *flipp_pomodoro_view_timer_alloc()
113137
{
114138
FlippPomodoroTimerView *timer = malloc(sizeof(FlippPomodoroTimerView));
@@ -141,11 +165,20 @@ void flipp_pomodoro_view_timer_set_state(View *view, FlippPomodoroState *state)
141165
model->state = state;
142166
},
143167
false);
168+
flipp_pomodoro_view_timer_assign_animation(view);
144169
};
145170

146171
void flipp_pomodoro_view_timer_free(FlippPomodoroTimerView *timer)
147172
{
148173
furi_assert(timer);
174+
with_view_model(
175+
timer->view,
176+
FlippPomodoroTimerViewModel * model,
177+
{
178+
icon_animation_free(model->icon);
179+
},
180+
false);
149181
view_free(timer->view);
182+
150183
free(timer);
151184
};

0 commit comments

Comments
 (0)