[FL-1995] New dolphin animations (part 1) (#835)

* Desktop Animation (part 1): Ugly naked ohmygod architecture
* fix butthurt, fix locked scene
* Change SD icons, fixes
* Fix level update animation
* Fixes, correct butthurt
* Clean up code
* furi_assert(0) -> furi_crash("msg")
* Gui: rename none layer to desktop, update docs.

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
Albert Kharisov
2021-11-24 20:21:12 +04:00
committed by GitHub
parent 92c499b41b
commit 9b8a139e2b
235 changed files with 1869 additions and 661 deletions

View File

@@ -25,7 +25,7 @@ void desktop_debug_render(Canvas* canvas, void* model) {
canvas_set_color(canvas, ColorBlack);
canvas_set_font(canvas, FontPrimary);
canvas_draw_str(canvas, 2, 13, headers[m->screen]);
canvas_draw_str(canvas, 2, 9, headers[m->screen]);
canvas_set_font(canvas, FontSecondary);
if(m->screen != DesktopViewStatsMeta) {
@@ -40,13 +40,13 @@ void desktop_debug_render(Canvas* canvas, void* model) {
furi_hal_version_get_hw_body(),
furi_hal_version_get_hw_connect(),
my_name ? my_name : "Unknown");
canvas_draw_str(canvas, 5, 23, buffer);
canvas_draw_str(canvas, 5, 19, buffer);
ver = m->screen == DesktopViewStatsBoot ? furi_hal_version_get_bootloader_version() :
furi_hal_version_get_firmware_version();
if(!ver) {
canvas_draw_str(canvas, 5, 33, "No info");
canvas_draw_str(canvas, 5, 29, "No info");
return;
}
@@ -56,7 +56,7 @@ void desktop_debug_render(Canvas* canvas, void* model) {
"%s [%s]",
version_get_version(ver),
version_get_builddate(ver));
canvas_draw_str(canvas, 5, 32, buffer);
canvas_draw_str(canvas, 5, 28, buffer);
snprintf(
buffer,
@@ -64,27 +64,36 @@ void desktop_debug_render(Canvas* canvas, void* model) {
"%s [%s]",
version_get_githash(ver),
version_get_gitbranchnum(ver));
canvas_draw_str(canvas, 5, 43, buffer);
canvas_draw_str(canvas, 5, 39, buffer);
snprintf(
buffer, sizeof(buffer), "[%d] %s", version_get_target(ver), version_get_gitbranch(ver));
canvas_draw_str(canvas, 5, 54, buffer);
canvas_draw_str(canvas, 5, 50, buffer);
} else {
char buffer[64];
uint32_t current_lvl = dolphin_state_get_level(m->icounter);
uint32_t remaining = dolphin_state_xp_to_levelup(m->icounter, current_lvl, true);
Dolphin* dolphin = furi_record_open("dolphin");
DolphinStats stats = dolphin_stats(dolphin);
furi_record_close("dolphin");
uint32_t current_lvl = stats.level;
uint32_t remaining = dolphin_state_xp_to_levelup(m->icounter);
canvas_set_font(canvas, FontSecondary);
snprintf(buffer, 64, "Icounter: %ld Butthurt %ld", m->icounter, m->butthurt);
canvas_draw_str(canvas, 5, 23, buffer);
canvas_draw_str(canvas, 5, 19, buffer);
snprintf(buffer, 64, "Level: %ld To level up: %ld", current_lvl, remaining);
canvas_draw_str(canvas, 5, 33, buffer);
snprintf(
buffer,
64,
"Level: %ld To level up: %ld",
current_lvl,
(remaining == (uint32_t)(-1) ? remaining : 0));
canvas_draw_str(canvas, 5, 29, buffer);
snprintf(buffer, 64, "%s", asctime(localtime((const time_t*)&m->timestamp)));
canvas_draw_str(canvas, 5, 43, buffer);
canvas_draw_str(canvas, 0, 53, "[< >] icounter value [ok] save");
canvas_draw_str(canvas, 5, 39, buffer);
canvas_draw_str(canvas, 0, 49, "[< >] icounter value [ok] save");
}
}

View File

@@ -26,20 +26,20 @@ static void desktop_first_start_draw(Canvas* canvas, void* model) {
uint8_t height = canvas_height(canvas);
const char* my_name = furi_hal_version_get_name_ptr();
if(m->page == 0) {
canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart0_70x53);
elements_multiline_text_framed(canvas, 75, 20, "Hey m8,\npress > to\ncontinue");
canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart0_70x53);
elements_multiline_text_framed(canvas, 75, 16, "Hey m8,\npress > to\ncontinue");
} else if(m->page == 1) {
canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart1_59x53);
elements_multiline_text_framed(canvas, 64, 20, "First Of All,\n... >");
canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart1_59x53);
elements_multiline_text_framed(canvas, 64, 16, "First Of All,\n... >");
} else if(m->page == 2) {
canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart2_59x51);
elements_multiline_text_framed(canvas, 64, 20, "Thank you\nfor your\nsupport! >");
canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart2_59x51);
elements_multiline_text_framed(canvas, 64, 16, "Thank you\nfor your\nsupport! >");
} else if(m->page == 3) {
canvas_draw_icon(canvas, width - 57, height - 48, &I_DolphinFirstStart3_57x48);
elements_multiline_text_framed(canvas, 0, 20, "Kickstarter\ncampaign\nwas INSANE! >");
canvas_draw_icon(canvas, width - 57, height - 45, &I_DolphinFirstStart3_57x48);
elements_multiline_text_framed(canvas, 0, 16, "Kickstarter\ncampaign\nwas INSANE! >");
} else if(m->page == 4) {
canvas_draw_icon(canvas, width - 67, height - 50, &I_DolphinFirstStart4_67x53);
elements_multiline_text_framed(canvas, 0, 17, "Now\nallow me\nto introduce\nmyself >");
canvas_draw_icon(canvas, width - 67, height - 51, &I_DolphinFirstStart4_67x53);
elements_multiline_text_framed(canvas, 0, 13, "Now\nallow me\nto introduce\nmyself >");
} else if(m->page == 5) {
char buf[64];
snprintf(
@@ -49,20 +49,20 @@ static void desktop_first_start_draw(Canvas* canvas, void* model) {
"I am",
my_name ? my_name : "Unknown",
",\ncyberdolphin\nliving in your\npocket >");
canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart5_54x49);
elements_multiline_text_framed(canvas, 60, 17, buf);
canvas_draw_icon(canvas, 0, height - 49, &I_DolphinFirstStart5_54x49);
elements_multiline_text_framed(canvas, 60, 13, buf);
} else if(m->page == 6) {
canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart6_58x54);
canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart6_58x54);
elements_multiline_text_framed(
canvas, 63, 17, "I can grow\nsmart'n'cool\nif you use me\noften >");
canvas, 63, 13, "I can grow\nsmart'n'cool\nif you use me\noften >");
} else if(m->page == 7) {
canvas_draw_icon(canvas, width - 61, height - 48, &I_DolphinFirstStart7_61x51);
canvas_draw_icon(canvas, width - 61, height - 51, &I_DolphinFirstStart7_61x51);
elements_multiline_text_framed(
canvas, 0, 17, "As long as\nyou read, write\nand emulate >");
canvas, 0, 13, "As long as\nyou read, write\nand emulate >");
} else if(m->page == 8) {
canvas_draw_icon(canvas, width - 56, height - 48, &I_DolphinFirstStart8_56x51);
canvas_draw_icon(canvas, width - 56, height - 51, &I_DolphinFirstStart8_56x51);
elements_multiline_text_framed(
canvas, 0, 17, "You can check\nmy level and\nmood in the\nPassport menu");
canvas, 0, 13, "You can check\nmy level and\nmood in the\nPassport menu");
}
}

View File

@@ -17,13 +17,13 @@ void locked_view_timer_callback(void* context) {
locked_view->callback(DesktopLockedEventUpdate, locked_view->context);
}
// temporary locked screen animation managment
void desktop_locked_set_dolphin_animation(DesktopLockedView* locked_view) {
void desktop_locked_set_dolphin_animation(DesktopLockedView* locked_view, const Icon* icon) {
with_view_model(
locked_view->view, (DesktopLockedViewModel * model) {
if(model->animation) icon_animation_free(model->animation);
model->animation = icon_animation_alloc(desktop_get_icon());
model->animation = icon_animation_alloc(icon);
view_tie_icon_animation(locked_view->view, model->animation);
icon_animation_start(model->animation);
return true;
});
}
@@ -100,7 +100,7 @@ void desktop_locked_render(Canvas* canvas, void* model) {
}
if(m->animation && m->animation_seq_end) {
canvas_draw_icon_animation(canvas, 0, -3, m->animation);
canvas_draw_icon_animation(canvas, 0, 0, m->animation);
}
if(now < m->hint_expire_at) {
@@ -110,7 +110,7 @@ void desktop_locked_render(Canvas* canvas, void* model) {
} else if(!m->pin_lock) {
canvas_set_font(canvas, FontSecondary);
canvas_draw_icon(canvas, 13, 5, &I_LockPopup_100x49);
canvas_draw_icon(canvas, 13, 2, &I_LockPopup_100x49);
elements_multiline_text(canvas, 65, 20, "To unlock\npress:");
}
}

View File

@@ -56,7 +56,7 @@ void desktop_locked_set_callback(
DesktopLockedViewCallback callback,
void* context);
void desktop_locked_set_dolphin_animation(DesktopLockedView* locked_view);
void desktop_locked_set_dolphin_animation(DesktopLockedView* locked_view, const Icon* icon);
void desktop_locked_update_hint_timeout(DesktopLockedView* locked_view);
void desktop_locked_reset_counter(DesktopLockedView* locked_view);
void desktop_locked_reset_door_pos(DesktopLockedView* locked_view);
@@ -65,4 +65,4 @@ void desktop_locked_manage_redraw(DesktopLockedView* locked_view);
View* desktop_locked_get_view(DesktopLockedView* locked_view);
DesktopLockedView* desktop_locked_alloc();
void desktop_locked_free(DesktopLockedView* locked_view);
void desktop_locked_with_pin(DesktopLockedView* lock_menu, bool locked);
void desktop_locked_with_pin(DesktopLockedView* lock_menu, bool locked);

View File

@@ -1,3 +1,5 @@
#include "gui/canvas.h"
#include "input/input.h"
#include <furi.h>
#include "../desktop_i.h"
#include "desktop_main.h"
@@ -20,12 +22,24 @@ void desktop_main_reset_hint(DesktopMainView* main_view) {
});
}
void desktop_main_switch_dolphin_animation(DesktopMainView* main_view) {
void desktop_main_switch_dolphin_animation(DesktopMainView* main_view, const Icon* icon) {
with_view_model(
main_view->view, (DesktopMainViewModel * model) {
if(model->animation) icon_animation_free(model->animation);
model->animation = icon_animation_alloc(desktop_get_icon());
model->animation = icon_animation_alloc(icon);
view_tie_icon_animation(main_view->view, model->animation);
icon_animation_start(model->animation);
model->icon = NULL;
return true;
});
}
void desktop_main_switch_dolphin_icon(DesktopMainView* main_view, const Icon* icon) {
with_view_model(
main_view->view, (DesktopMainViewModel * model) {
if(model->animation) icon_animation_free(model->animation);
model->animation = NULL;
model->icon = icon;
return true;
});
}
@@ -35,8 +49,10 @@ void desktop_main_render(Canvas* canvas, void* model) {
DesktopMainViewModel* m = model;
uint32_t now = osKernelGetTickCount();
if(m->animation) {
canvas_draw_icon_animation(canvas, 0, -3, m->animation);
if(m->icon) {
canvas_draw_icon(canvas, 0, 0, m->icon);
} else if(m->animation) {
canvas_draw_icon_animation(canvas, 0, 0, m->animation);
}
if(now < m->hint_expire_at) {
@@ -66,6 +82,8 @@ bool desktop_main_input(InputEvent* event, void* context) {
main_view->callback(DesktopMainEventOpenArchive, main_view->context);
} else if(event->key == InputKeyLeft && event->type == InputTypeShort) {
main_view->callback(DesktopMainEventOpenFavorite, main_view->context);
} else if(event->key == InputKeyRight && event->type == InputTypeShort) {
main_view->callback(DesktopMainEventRightShort, main_view->context);
}
desktop_main_reset_hint(main_view);

View File

@@ -13,6 +13,9 @@ typedef enum {
DesktopMainEventOpenMenu,
DesktopMainEventOpenDebug,
DesktopMainEventUnlocked,
DesktopMainEventRightShort,
DesktopMainEventUpdateAnimation,
DesktopMainEventUpdateOneShotAnimation,
} DesktopMainEvent;
typedef struct DesktopMainView DesktopMainView;
@@ -27,6 +30,7 @@ struct DesktopMainView {
typedef struct {
IconAnimation* animation;
const Icon* icon;
uint8_t scene_num;
uint32_t hint_expire_at;
} DesktopMainViewModel;
@@ -39,6 +43,7 @@ void desktop_main_set_callback(
View* desktop_main_get_view(DesktopMainView* main_view);
DesktopMainView* desktop_main_alloc();
void desktop_main_free(DesktopMainView* main_view);
void desktop_main_switch_dolphin_animation(DesktopMainView* main_view);
void desktop_main_switch_dolphin_animation(DesktopMainView* main_view, const Icon* icon);
void desktop_main_unlocked(DesktopMainView* main_view);
void desktop_main_reset_hint(DesktopMainView* main_view);
void desktop_main_switch_dolphin_icon(DesktopMainView* main_view, const Icon* icon);