[FL-1908] New animation update scheme (#737)
* Assets: update desktop animation frame rate and cleanup. * Power: update ViewPort only if changed. * Gui: tie IconAnimation with View, new update event generation scheme. Desktop: update IconAnimation usage. Co-authored-by: DrZlo13 <who.just.the.doctor@gmail.com>
This commit is contained in:
@@ -45,7 +45,6 @@ bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) {
|
||||
|
||||
void desktop_scene_locked_on_exit(void* context) {
|
||||
Desktop* desktop = (Desktop*)context;
|
||||
DesktopLockedView* locked_view = desktop->locked_view;
|
||||
desktop_locked_reset_counter(desktop->locked_view);
|
||||
osTimerStop(locked_view->timer);
|
||||
osTimerStop(desktop->locked_view->timer);
|
||||
}
|
||||
|
@@ -67,6 +67,7 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) {
|
||||
desktop_switch_to_app(desktop, &FLIPPER_ARCHIVE);
|
||||
consumed = true;
|
||||
break;
|
||||
|
||||
case DesktopMainEventOpenFavorite:
|
||||
desktop_settings_load(&desktop->settings);
|
||||
desktop_switch_to_app(desktop, &FLIPPER_APPS[desktop->settings.favorite]);
|
||||
|
@@ -20,13 +20,12 @@ void locked_view_timer_callback(void* context) {
|
||||
}
|
||||
|
||||
// temporary locked screen animation managment
|
||||
static void
|
||||
desktop_scene_handler_set_scene(DesktopLockedView* locked_view, const Icon* icon_data) {
|
||||
static void desktop_locked_set_scene(DesktopLockedView* locked_view, const Icon* icon_data) {
|
||||
with_view_model(
|
||||
locked_view->view, (DesktopLockedViewModel * model) {
|
||||
if(model->animation) icon_animation_free(model->animation);
|
||||
model->animation = icon_animation_alloc(icon_data);
|
||||
icon_animation_start(model->animation);
|
||||
view_tie_icon_animation(locked_view->view, model->animation);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
@@ -148,6 +147,25 @@ bool desktop_locked_input(InputEvent* event, void* context) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void desktop_locked_enter(void* context) {
|
||||
DesktopLockedView* locked_view = context;
|
||||
|
||||
with_view_model(
|
||||
locked_view->view, (DesktopLockedViewModel * model) {
|
||||
if(model->animation) icon_animation_start(model->animation);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
void desktop_locked_exit(void* context) {
|
||||
DesktopLockedView* locked_view = context;
|
||||
with_view_model(
|
||||
locked_view->view, (DesktopLockedViewModel * model) {
|
||||
if(model->animation) icon_animation_stop(model->animation);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
DesktopLockedView* desktop_locked_alloc() {
|
||||
DesktopLockedView* locked_view = furi_alloc(sizeof(DesktopLockedView));
|
||||
locked_view->view = view_alloc();
|
||||
@@ -158,8 +176,10 @@ DesktopLockedView* desktop_locked_alloc() {
|
||||
view_set_context(locked_view->view, locked_view);
|
||||
view_set_draw_callback(locked_view->view, (ViewDrawCallback)desktop_locked_render);
|
||||
view_set_input_callback(locked_view->view, desktop_locked_input);
|
||||
view_set_enter_callback(locked_view->view, desktop_locked_enter);
|
||||
view_set_exit_callback(locked_view->view, desktop_locked_exit);
|
||||
|
||||
desktop_scene_handler_set_scene(locked_view, idle_scenes[random() % COUNT_OF(idle_scenes)]);
|
||||
desktop_locked_set_scene(locked_view, idle_scenes[random() % COUNT_OF(idle_scenes)]);
|
||||
return locked_view;
|
||||
}
|
||||
|
||||
|
@@ -17,17 +17,18 @@ void desktop_main_set_callback(
|
||||
void desktop_main_reset_hint(DesktopMainView* main_view) {
|
||||
with_view_model(
|
||||
main_view->view, (DesktopMainViewModel * model) {
|
||||
model->hint_timeout = 0;
|
||||
model->hint_expire_at = 0;
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
// temporary main screen animation managment
|
||||
void desktop_scene_handler_set_scene(DesktopMainView* main_view, const Icon* icon_data) {
|
||||
static void desktop_main_set_scene(DesktopMainView* main_view, const Icon* icon_data) {
|
||||
with_view_model(
|
||||
main_view->view, (DesktopMainViewModel * model) {
|
||||
if(model->animation) icon_animation_free(model->animation);
|
||||
model->animation = icon_animation_alloc(icon_data);
|
||||
icon_animation_start(model->animation);
|
||||
view_tie_icon_animation(main_view->view, model->animation);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
@@ -38,7 +39,6 @@ void desktop_scene_handler_switch_scene(DesktopMainView* main_view) {
|
||||
if(icon_animation_is_last_frame(model->animation)) {
|
||||
if(model->animation) icon_animation_free(model->animation);
|
||||
model->animation = icon_animation_alloc(idle_scenes[model->scene_num]);
|
||||
icon_animation_start(model->animation);
|
||||
model->scene_num = random() % COUNT_OF(idle_scenes);
|
||||
}
|
||||
return true;
|
||||
@@ -53,8 +53,7 @@ void desktop_main_render(Canvas* canvas, void* model) {
|
||||
canvas_draw_icon_animation(canvas, 0, -3, m->animation);
|
||||
}
|
||||
|
||||
if(m->unlocked && m->hint_timeout) {
|
||||
m->hint_timeout = CLAMP(m->hint_timeout - 1, 2, 0);
|
||||
if(osKernelGetTickCount() < m->hint_expire_at) {
|
||||
canvas_set_font(canvas, FontPrimary);
|
||||
elements_multiline_text_framed(canvas, 42, 30, "Unlocked");
|
||||
}
|
||||
@@ -87,6 +86,25 @@ bool desktop_main_input(InputEvent* event, void* context) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void desktop_main_enter(void* context) {
|
||||
DesktopMainView* main_view = context;
|
||||
|
||||
with_view_model(
|
||||
main_view->view, (DesktopMainViewModel * model) {
|
||||
if(model->animation) icon_animation_start(model->animation);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
void desktop_main_exit(void* context) {
|
||||
DesktopMainView* main_view = context;
|
||||
with_view_model(
|
||||
main_view->view, (DesktopMainViewModel * model) {
|
||||
if(model->animation) icon_animation_stop(model->animation);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
DesktopMainView* desktop_main_alloc() {
|
||||
DesktopMainView* main_view = furi_alloc(sizeof(DesktopMainView));
|
||||
main_view->view = view_alloc();
|
||||
@@ -94,8 +112,10 @@ DesktopMainView* desktop_main_alloc() {
|
||||
view_set_context(main_view->view, main_view);
|
||||
view_set_draw_callback(main_view->view, (ViewDrawCallback)desktop_main_render);
|
||||
view_set_input_callback(main_view->view, desktop_main_input);
|
||||
view_set_enter_callback(main_view->view, desktop_main_enter);
|
||||
view_set_exit_callback(main_view->view, desktop_main_exit);
|
||||
|
||||
desktop_scene_handler_set_scene(main_view, idle_scenes[random() % COUNT_OF(idle_scenes)]);
|
||||
desktop_main_set_scene(main_view, idle_scenes[random() % COUNT_OF(idle_scenes)]);
|
||||
|
||||
return main_view;
|
||||
}
|
||||
@@ -109,8 +129,7 @@ void desktop_main_free(DesktopMainView* main_view) {
|
||||
void desktop_main_unlocked(DesktopMainView* main_view) {
|
||||
with_view_model(
|
||||
main_view->view, (DesktopMainViewModel * model) {
|
||||
model->unlocked = true;
|
||||
model->hint_timeout = 2;
|
||||
model->hint_expire_at = osKernelGetTickCount() + osKernelGetTickFreq();
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
@@ -28,8 +28,7 @@ struct DesktopMainView {
|
||||
typedef struct {
|
||||
IconAnimation* animation;
|
||||
uint8_t scene_num;
|
||||
uint8_t hint_timeout;
|
||||
bool unlocked;
|
||||
uint32_t hint_expire_at;
|
||||
} DesktopMainViewModel;
|
||||
|
||||
void desktop_main_set_callback(
|
||||
@@ -40,4 +39,5 @@ void desktop_main_set_callback(
|
||||
View* desktop_main_get_view(DesktopMainView* main_view);
|
||||
|
||||
DesktopMainView* desktop_main_alloc();
|
||||
|
||||
void desktop_main_free(DesktopMainView* main_view);
|
||||
|
Reference in New Issue
Block a user