From cb4fb8e4aed62fcf7e456df2434fd414ae822910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Wed, 3 Feb 2021 12:52:54 +0300 Subject: [PATCH] FL-819 new first start screen, add multiline text (#318) * GUI Canvas: get current font height routine * Dolphin: new start screen. GUI: new multiline element. * Dolphin: up state version to reset it for everyone * Dolphin: take maximum of idle screen height * Dolphin: frames on first start screen. --- applications/dolphin/dolphin.c | 7 ++- applications/dolphin/dolphin_state.c | 2 +- applications/dolphin/dolphin_views.c | 48 ++++++++++++++---- applications/gui/canvas.c | 13 ++--- applications/gui/canvas.h | 7 ++- applications/gui/canvas_i.h | 9 ++++ applications/gui/elements.c | 35 ++++++++++++- applications/gui/elements.h | 7 +++ applications/gui/view.h | 3 ++ .../Dolphin/DolphinFirstStart0_128x54.png | Bin 871 -> 0 bytes .../Dolphin/DolphinFirstStart0_70x53.png | Bin 0 -> 624 bytes .../Dolphin/DolphinFirstStart1_128x54.png | Bin 736 -> 0 bytes .../Dolphin/DolphinFirstStart1_59x53.png | Bin 0 -> 558 bytes .../Dolphin/DolphinFirstStart2_128x54.png | Bin 838 -> 0 bytes .../Dolphin/DolphinFirstStart2_59x51.png | Bin 0 -> 574 bytes .../Dolphin/DolphinFirstStart3_128x54.png | Bin 806 -> 0 bytes .../Dolphin/DolphinFirstStart3_57x48.png | Bin 0 -> 527 bytes .../Dolphin/DolphinFirstStart4_128x54.png | Bin 829 -> 0 bytes .../Dolphin/DolphinFirstStart4_67x53.png | Bin 0 -> 556 bytes .../Dolphin/DolphinFirstStart5_128x54.png | Bin 860 -> 0 bytes .../Dolphin/DolphinFirstStart5_45x53.png | Bin 0 -> 522 bytes .../Dolphin/DolphinFirstStart6_128x54.png | Bin 852 -> 0 bytes .../Dolphin/DolphinFirstStart6_58x54.png | Bin 0 -> 553 bytes .../Dolphin/DolphinFirstStart7_128x54.png | Bin 841 -> 0 bytes .../Dolphin/DolphinFirstStart7_61x51.png | Bin 0 -> 544 bytes .../Dolphin/DolphinFirstStart8_128x54.png | Bin 853 -> 0 bytes .../Dolphin/DolphinFirstStart8_56x51.png | Bin 0 -> 520 bytes 27 files changed, 109 insertions(+), 22 deletions(-) delete mode 100644 assets/icons/Dolphin/DolphinFirstStart0_128x54.png create mode 100644 assets/icons/Dolphin/DolphinFirstStart0_70x53.png delete mode 100644 assets/icons/Dolphin/DolphinFirstStart1_128x54.png create mode 100644 assets/icons/Dolphin/DolphinFirstStart1_59x53.png delete mode 100644 assets/icons/Dolphin/DolphinFirstStart2_128x54.png create mode 100644 assets/icons/Dolphin/DolphinFirstStart2_59x51.png delete mode 100644 assets/icons/Dolphin/DolphinFirstStart3_128x54.png create mode 100644 assets/icons/Dolphin/DolphinFirstStart3_57x48.png delete mode 100644 assets/icons/Dolphin/DolphinFirstStart4_128x54.png create mode 100644 assets/icons/Dolphin/DolphinFirstStart4_67x53.png delete mode 100644 assets/icons/Dolphin/DolphinFirstStart5_128x54.png create mode 100644 assets/icons/Dolphin/DolphinFirstStart5_45x53.png delete mode 100644 assets/icons/Dolphin/DolphinFirstStart6_128x54.png create mode 100644 assets/icons/Dolphin/DolphinFirstStart6_58x54.png delete mode 100644 assets/icons/Dolphin/DolphinFirstStart7_128x54.png create mode 100644 assets/icons/Dolphin/DolphinFirstStart7_61x51.png delete mode 100644 assets/icons/Dolphin/DolphinFirstStart8_128x54.png create mode 100644 assets/icons/Dolphin/DolphinFirstStart8_56x51.png diff --git a/applications/dolphin/dolphin.c b/applications/dolphin/dolphin.c index cae109c3..33e08ebf 100644 --- a/applications/dolphin/dolphin.c +++ b/applications/dolphin/dolphin.c @@ -5,7 +5,12 @@ bool dolphin_view_first_start_input(InputEvent* event, void* context) { furi_assert(context); Dolphin* dolphin = context; if(event->state) { - if(event->input == InputRight) { + if(event->input == InputLeft) { + with_view_model( + dolphin->idle_view_first_start, (DolphinViewFirstStartModel * model) { + if(model->page > 0) model->page--; + }); + } else if(event->input == InputRight) { uint32_t page; with_view_model( dolphin->idle_view_first_start, diff --git a/applications/dolphin/dolphin_state.c b/applications/dolphin/dolphin_state.c index 77344c65..f7945234 100644 --- a/applications/dolphin/dolphin_state.c +++ b/applications/dolphin/dolphin_state.c @@ -14,7 +14,7 @@ typedef struct { #define DOLPHIN_DATA_DATA_ADDRESS (DOLPHIN_DATA_HEADER_ADDRESS + sizeof(DolphinDataHeader)) #define DOLPHIN_DATA_HEADER_MAGIC 0xD0 -#define DOLPHIN_DATA_HEADER_VERSION 0x00 +#define DOLPHIN_DATA_HEADER_VERSION 0x01 typedef struct { uint32_t limit_ibutton; diff --git a/applications/dolphin/dolphin_views.c b/applications/dolphin/dolphin_views.c index 55f67075..bda3be5d 100644 --- a/applications/dolphin/dolphin_views.c +++ b/applications/dolphin/dolphin_views.c @@ -1,35 +1,63 @@ #include "dolphin_views.h" #include +#include +#include void dolphin_view_first_start_draw(Canvas* canvas, void* model) { DolphinViewFirstStartModel* m = model; canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); + canvas_set_font(canvas, FontSecondary); + uint8_t font_height = canvas_current_font_height(canvas); + uint8_t width = canvas_width(canvas); + uint8_t height = canvas_height(canvas); if(m->page == 0) { - canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart0_128x54); + canvas_draw_icon_name(canvas, 0, height - 53, I_DolphinFirstStart0_70x53); + elements_multiline_text(canvas, 75, 20, "Hey m8,\npress > to\ncontinue"); + elements_frame(canvas, 72, 20 - font_height, width - 70 - 4, font_height * 3 + 4); } else if(m->page == 1) { - canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart1_128x54); + canvas_draw_icon_name(canvas, 0, height - 53, I_DolphinFirstStart1_59x53); + elements_multiline_text(canvas, 64, 20, "First Of All,\n... >"); + elements_frame(canvas, 61, 20 - font_height, width - 59 - 4, font_height * 2 + 4); } else if(m->page == 2) { - canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart2_128x54); + canvas_draw_icon_name(canvas, 0, height - 51, I_DolphinFirstStart2_59x51); + elements_multiline_text(canvas, 64, 20, "Thank you\nfor your\nsupport! >"); + elements_frame(canvas, 61, 20 - font_height, width - 59 - 4, font_height * 3 + 4); } else if(m->page == 3) { - canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart3_128x54); + canvas_draw_icon_name(canvas, width - 57, height - 48, I_DolphinFirstStart3_57x48); + elements_multiline_text(canvas, 5, 20, "Kickstarter\ncampaign\nwas INSANE! >"); + elements_frame(canvas, 2, 20 - font_height, width - 57 - 4, font_height * 3 + 4); } else if(m->page == 4) { - canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart4_128x54); + canvas_draw_icon_name(canvas, width - 67, height - 53, I_DolphinFirstStart4_67x53); + elements_multiline_text(canvas, 5, 10, "Now\nallow me\nto introduce\nmyself >"); + elements_frame(canvas, 2, 10 - font_height, width - 67 - 4, font_height * 4 + 4); } else if(m->page == 5) { - canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart5_128x54); + canvas_draw_icon_name(canvas, 0, height - 53, I_DolphinFirstStart5_45x53); + elements_multiline_text( + canvas, 50, 20, "I am Flipper,\ncyberdolphin\nliving in your\npocket >"); + elements_frame(canvas, 47, 20 - font_height, width - 45 - 4, font_height * 4 + 4); } else if(m->page == 6) { - canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart6_128x54); + canvas_draw_icon_name(canvas, 0, height - 54, I_DolphinFirstStart6_58x54); + elements_multiline_text( + canvas, 63, 20, "I can grow\n smart'n'cool\nif you use me\noften >"); + elements_frame(canvas, 60, 20 - font_height, width - 58 - 4, font_height * 4 + 4); } else if(m->page == 7) { - canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart7_128x54); + canvas_draw_icon_name(canvas, width - 61, height - 51, I_DolphinFirstStart7_61x51); + elements_multiline_text(canvas, 5, 10, "As long as\nyou read, write\nand emulate >"); + elements_frame(canvas, 2, 10 - font_height, width - 54 - 4, font_height * 3 + 4); } else if(m->page == 8) { - canvas_draw_icon_name(canvas, 0, 1, I_DolphinFirstStart8_128x54); + canvas_draw_icon_name(canvas, width - 56, height - 51, I_DolphinFirstStart8_56x51); + elements_multiline_text( + canvas, 5, 10, "You can check\nmy level and\nmood in the\nPassport menu"); + elements_frame(canvas, 2, 10 - font_height, width - 56 - 4, font_height * 4 + 4); } } void dolphin_view_idle_main_draw(Canvas* canvas, void* model) { canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); - canvas_draw_icon_name(canvas, 128 - 80, 0, I_Flipper_young_80x60); + canvas_draw_icon_name( + canvas, canvas_width(canvas) - 80, canvas_height(canvas) - 60 + 6, I_Flipper_young_80x60); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 2, 10, "/\\: Stats"); canvas_draw_str(canvas, 5, 32, "OK: Menu"); diff --git a/applications/gui/canvas.c b/applications/gui/canvas.c index a8ea67eb..a2a5092f 100644 --- a/applications/gui/canvas.c +++ b/applications/gui/canvas.c @@ -3,14 +3,6 @@ #include -struct Canvas { - u8g2_t fb; - uint8_t offset_x; - uint8_t offset_y; - uint8_t width; - uint8_t height; -}; - uint8_t u8g2_gpio_and_delay_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_ptr); uint8_t u8x8_hw_spi_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_ptr); @@ -70,6 +62,11 @@ uint8_t canvas_height(Canvas* canvas) { return canvas->height; } +uint8_t canvas_current_font_height(Canvas* canvas) { + furi_assert(canvas); + return u8g2_GetMaxCharHeight(&canvas->fb); +} + void canvas_clear(Canvas* canvas) { furi_assert(canvas); u8g2_ClearBuffer(&canvas->fb); diff --git a/applications/gui/canvas.h b/applications/gui/canvas.h index 7bc04066..62258ed6 100644 --- a/applications/gui/canvas.h +++ b/applications/gui/canvas.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include @@ -30,6 +29,12 @@ uint8_t canvas_width(Canvas* canvas); */ uint8_t canvas_height(Canvas* canvas); +/* + * Get current font height + * @return height in pixels. + */ +uint8_t canvas_current_font_height(Canvas* canvas); + /* * Clear canvas, clear rendering buffer */ diff --git a/applications/gui/canvas_i.h b/applications/gui/canvas_i.h index 23c87372..80b0abe7 100644 --- a/applications/gui/canvas_i.h +++ b/applications/gui/canvas_i.h @@ -1,6 +1,15 @@ #pragma once #include "canvas.h" +#include + +struct Canvas { + u8g2_t fb; + uint8_t offset_x; + uint8_t offset_y; + uint8_t width; + uint8_t height; +}; /* * Allocate memory and initialize canvas diff --git a/applications/gui/elements.c b/applications/gui/elements.c index 2d5d4599..7c58a311 100644 --- a/applications/gui/elements.c +++ b/applications/gui/elements.c @@ -1,6 +1,14 @@ #include "elements.h" +#include "canvas_i.h" + +#include + +#include +#include void elements_scrollbar(Canvas* canvas, uint8_t pos, uint8_t total) { + furi_assert(canvas); + uint8_t width = canvas_width(canvas); uint8_t height = canvas_height(canvas); // prevent overflows @@ -19,6 +27,8 @@ void elements_scrollbar(Canvas* canvas, uint8_t pos, uint8_t total) { } void elements_frame(Canvas* canvas, uint8_t x, uint8_t y, uint8_t width, uint8_t height) { + furi_assert(canvas); + canvas_draw_line(canvas, x + 2, y, x + width - 2, y); canvas_draw_line(canvas, x + 1, y + height - 1, x + width, y + height - 1); canvas_draw_line(canvas, x + 2, y + height, x + width - 1, y + height); @@ -28,4 +38,27 @@ void elements_frame(Canvas* canvas, uint8_t x, uint8_t y, uint8_t width, uint8_t canvas_draw_line(canvas, x + width, y + 2, x + width, y + height - 2); canvas_draw_dot(canvas, x + 1, y + 1); -} \ No newline at end of file +} + +void elements_multiline_text(Canvas* canvas, uint8_t x, uint8_t y, char* text) { + furi_assert(canvas); + furi_assert(text); + + uint8_t font_height = canvas_current_font_height(canvas); + string_t str; + string_init(str); + char* start = text; + char* end; + do { + end = strchr(start, '\n'); + if(end) { + string_set_strn(str, start, end - start); + } else { + string_set_str(str, start); + } + canvas_draw_str(canvas, x, y, string_get_cstr(str)); + start = end + 1; + y += font_height; + } while(end); + string_clear(str); +} diff --git a/applications/gui/elements.h b/applications/gui/elements.h index bbdbe0fa..68f7ec85 100644 --- a/applications/gui/elements.h +++ b/applications/gui/elements.h @@ -22,6 +22,13 @@ void elements_scrollbar(Canvas* canvas, uint8_t pos, uint8_t total); */ void elements_frame(Canvas* canvas, uint8_t x, uint8_t y, uint8_t width, uint8_t height); +/* + * Draw multiline text + * @param x, y - top left corner coordinates + * @param text - string (possible multiline) + */ +void elements_multiline_text(Canvas* canvas, uint8_t x, uint8_t y, char* text); + #ifdef __cplusplus } #endif diff --git a/applications/gui/view.h b/applications/gui/view.h index f050f302..8563b067 100644 --- a/applications/gui/view.h +++ b/applications/gui/view.h @@ -3,6 +3,9 @@ #include #include "canvas.h" +#include +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/assets/icons/Dolphin/DolphinFirstStart0_128x54.png b/assets/icons/Dolphin/DolphinFirstStart0_128x54.png deleted file mode 100644 index a084b12745a2f88195bf5223a7e7770a3d03ded9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 871 zcmeAS@N?(olHy`uVBq!ia0vp^4M1$h2qYNPudU$&QY`6?zK#qG8~eHcB(eheOiAAE zE)0x!yM&hjd7K3vk;M!Qd`Cc-ajG_-G*FPe#M9T6{Rxk>IE&fFFzv%YA%WyXzcL`* z0K^VJ3<6wdrC%%p8p!SG;uxZFKKJte{L2m^>>tDe(K*8WpFy@!s9#plsg-r* z9|;K!tsqv(2}z3=^u4uj@Q{?y2x3<5@;Wr7)6nUWdvZ!=hsP1V&?3Luo%-+Rm=)^W z6R?!8egCuQyOW2gV_=$`lSVP$tO?JbH@uj-MOeWwLQ?hG1&+J2`R((imS}r3tzA9e zwyjF0gX2ZmC;y*?m(tH%h|;TLxU!^mk<~8o#qy^Dny!09Pwc(+%<%@lx74Ctmu$P* z>t}2D99*dUe|qQigF(7A2fY(|-IAn@^uJ|aWcFKeyE`b>afbNr_@oJM6E$s`q6MyU z_Ph=}_~GG{Bi8m&`dVFbb5}1u>&+-H(A9U>STw@ua6n?PNsi7IRi@-!UmcZqiyb_B zF5z^<>jNjxI&fLZ(x7Y*X4N-wydA z7NO>meIs9QU3}g87il(^F z`kep5QlvTIq~zsLKfi^1H#S@L9`ruXzo4=xGd-h(!7pC{&e2gQElyQPD@skx zsa!tmLlaPkB1}h0YH@N=WnD>p{1Fbu92Q$_}W|UK*bE6u6{1- HoD!M<>0MD3 diff --git a/assets/icons/Dolphin/DolphinFirstStart0_70x53.png b/assets/icons/Dolphin/DolphinFirstStart0_70x53.png new file mode 100644 index 0000000000000000000000000000000000000000..7255f679cf518db01604520b574b6c32e20c1df7 GIT binary patch literal 624 zcmeAS@N?(olHy`uVBq!ia0vp^Za{3x2qYM;JYE3eu%tWsIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1i<>&pI=QI^kG&ph|=GzJF7WKS2z5RLPp7x#M~4iI4f zpv}0sBUW~m#c&J!2W393cCw(b*UGri@WyPQ%`__?F#X=k0&mf-C&6>TeCdEPD!-m+JJalzz8 zucHMcEtclEmU~QDzKWOSn({nNZT6bkb3<2o&1Byy5g>NTlF_SnS7Y9+w{~w&)qA%6 zTUi{q=S7Uj_sw(Wg^Ji6_d1qzMC<4zRbSJ)$L*&kZInFif9z9Q(bu~F3@&N8voB~g zo&?5#YKdz^NlIc#s#S7PDv)9@GB7gKH89jQvJ5dau`)HZGPKY(Ft9Q(_*pI|hN2-i oKP5A*5~RUE*U$*00i@2{%Gd~^VcyJwV4wyDPgg&ebxsLQ05M(W(EtDd literal 0 HcmV?d00001 diff --git a/assets/icons/Dolphin/DolphinFirstStart1_128x54.png b/assets/icons/Dolphin/DolphinFirstStart1_128x54.png deleted file mode 100644 index 87ae4c3365480946de9b9d180707316105931a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736 zcmeAS@N?(olHy`uVBq!ia0vp^4M1$h2qYNPudU$&QY`6?zK#qG8~eHcB(eheOiAAE zE)0x!yM&hjd7K3vk;M!Qd`Cc-ajG_-G*FPe#M9T6{Rxk>IE&fFFzv%YA%WyXzcL`* z0K^VJ3<6wdrC%&!U|?+Vba4#PI3Ig?qaTx@1p5ayJ{>pt11@Q`>@SsfWJuI9-<{Ga z#U7?6WX`63_yBW^hi`|Wq8iVsk_mh~5)us(mJ8$lZ+rUU>$;OqcmKXyp8I~^dyb-J zhOQ?GoU>Z(T*NG%MJ7bN{khGE=)M1touQ#O#3K{(BD@pBTw_C zD(;(8A+T^?W-IrsLytZzmpK)$%ygZt>vEOEX^;3K?)Z`bnJ`ruo+Hendy0NX$cx|S zIkVxsli-?nM>^QqmMrpR&gP9}UU8w5acWAsWsC+Z#+ALQQy63x%FRz_a|&C zt|@+6xX^iiWdYNj=?@OFwnjCp2B^OBY;S573Vd#5u=TgYaTT-sjaC*4^=c-MMV4^p z&a@Mnd7(7GO z4}UrLY?EBq{496}XHLJX_cYd>CsU6sQ=Q4K#c$D^8OrbGFsIQ^j%n{+o;}YNF3q0X zXk=u6!G7Z5|BtU-$^pfZYKdz^NlIc#s#S7PDv)9@GB7gGH8j#SG7m8_vNE->GBnUO zFt9Q(ke;;85=BF9eoAIqC2kE_=fzrq8q`2GWF{wDCFd7Z7GQIE~NJ%YDF3Kz@$;{7VC=POWQt)(jHZ!y|Gt)KFGYnsQ%N?kg N!PC{xWt~$(69BZ$2+;rl diff --git a/assets/icons/Dolphin/DolphinFirstStart1_59x53.png b/assets/icons/Dolphin/DolphinFirstStart1_59x53.png new file mode 100644 index 0000000000000000000000000000000000000000..85bdb5d147b4c6cca6bc93f0b71fdb7b88edbf87 GIT binary patch literal 558 zcmeAS@N?(olHy`uVBq!ia0vp^)O>_%)r1c1j3A$?$-SQ3bL1Y`ns||Wt8PJ)-%sNJdJ^YQPI=IF+}3B>BYTX%#I?g z4;ZTMct9< zeb3+d8-FfLOL(_;al--z3q9!4Eqx$M60|IJ(VIbF+Ax6;dC^&BnM$Cp+* zeK0CM#Wl%$`68=}elrsq%FD9MeCDyNZxKD?+pLi*ygO@h60fAr{2Mdau5R<)GyPD< z1xED=fx_A+S~@G+-M7U(-g$V6@rsM?e+&O}oX_!|@O`s8F#J?YTq8l#m4U&}ayc;+4Y~O#nQ4_E4FnpU4KuEA1EY(9!PC{xWt~$(69CeFzBK>< literal 0 HcmV?d00001 diff --git a/assets/icons/Dolphin/DolphinFirstStart2_128x54.png b/assets/icons/Dolphin/DolphinFirstStart2_128x54.png deleted file mode 100644 index 7a67a021a8edab79f04235ce977fd1e3bd553093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 838 zcmeAS@N?(olHy`uVBq!ia0vp^4M1$h2qYNPudU$&QY`6?zK#qG8~eHcB(eheOiAAE zE)0x!yM&hjd7K3vk;M!Qd`Cc-ajG_-G*FPe#M9T6{Rxk>IE&fFFzv%YA%WyXzcL`* z0K^VJ3<6wdrC%&!U|@XZ>EaloalZGmVg6+Y5%v$l+(JTkB{JLnzHlFCiJWP~qAhGx z(^$qWTq(+P^OfeS7mbW39V>bZCiC!2-IUU06*+ZJLpIBEVubUL!==oskJ>FwHSyLAzz3$SQ5GE|C z_}IuK;_xK>n(4o?BMN$@M7Vaa1x;UA9@EX2HciMpY#ztj6_qDDx%DnQyZp_0mRb6* z+JZ;SVyZC(7iZKhs`t6H_q@SEmi>lT)2F0O6;$Qi)Yi7Kk@F>oElqX4^o4c0D zN=5XN`c|fzOIzQu{9I_6sQRZd=Xk@CX&>5We%kQ(>4z!8U0EB}F21||ZTsylnl=1! z4YFL%FHZONlwS1sK{c~}!4ZSY57;AWjwth#n=P?uqxjQL%x;mQ~TAG>Z8tEB^ Tuf63CRLtP%>gTe~DWM4fcS}b8 diff --git a/assets/icons/Dolphin/DolphinFirstStart2_59x51.png b/assets/icons/Dolphin/DolphinFirstStart2_59x51.png new file mode 100644 index 0000000000000000000000000000000000000000..e1fd177e8647ada52b75709fb5916d99745353ea GIT binary patch literal 574 zcmeAS@N?(olHy`uVBq!ia0vp^)dAqwXFy8GFUIOHC z7I;JgP2?5=Va7{$>;3=**-JcqUD=;9%JLcOndcs!2DI1E)5S4F;1$298DUXOPkgx3Cvz>k zxp-lcl&kKfD;ErGkLqrV;hvzM9AJ@n(sf5*oBGc(@>h}>8@?Fp;dM%BvJn_p%yJ>lJE?kuHn-Q6l( zgd--i+yicW|Zt*ZsfCUs!~(&zY9V-x$AwBAG{LZ<>WZ~&qMo}+kY^6G5UC#Kh_Hc zhNo(YYeY#(Vo9o1a#1RfVlXl=GSoFN)HSjUF*LCYfAvZrI oGp!P&!9ds02&BQl+{)O{%ESPo;gwHCEl>l4r>mdKI;Vst0CeWcXaE2J literal 0 HcmV?d00001 diff --git a/assets/icons/Dolphin/DolphinFirstStart3_128x54.png b/assets/icons/Dolphin/DolphinFirstStart3_128x54.png deleted file mode 100644 index 317df65bfa730f85ce038d1e257006bb93066b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 806 zcmeAS@N?(olHy`uVBq!ia0vp^4M1$h2qYNPudU$&QY`6?zK#qG8~eHcB(eheOiAAE zE)0x!yM&hjd7K3vk;M!Qd`Cc-ajG_-G*FPe#M9T6{Rxk>IE&fFFzv%YA%WyXzcL`* z0K^VJ3<6wdrC%&!U|>Au>EaloalZAEp|^~q2>S;|0q@mUoVL8+;NV#piYzdE5U1z%bv}jx%bVz zdxB?j4EyiztNbh>clbh*@3rVDO@E|2L@p`(ow#(B$fJcv|#e;-nD`JVok1_6k{}#p59!0?d~FOVc|%5 z-+!rBzfRBg*;5kDw<3AF27j8wo9*{y85%dr1u#jgB(E!$T)*lS)2z@kdGTjEn-|Y~ zA=EZ?+jjH$-t6r23vw6EIq1)Ccs@PmYD3{+t?KC3N_Jt{e!c5F#rhBBmM?uY%fQ{% zqF6xk{P8D;*Yt;pPiDL~_nYJFi|IcmFn@mhi*J>rOIJ;glZwIjXa7P11&?1Bz2%v( z^P#v%=tY@>eA>1A^Vi7y^6oM_u%&s|hq(JyTb8`}xIA`E)P&9ZUw`YcSh@FYW0C1C zuRotEQWkz%V72|;3@z=#Z-NsI|Ei0;63AjWR3MOY;;TZ9b9B~ad2dZYues7OD-Xz~ zEY`g(UNFITZ_n{|2X2mHVGZa1tmZpQgkRJ%{bxQ>a<+_RZDSiSc2!GUBT7;dOH!?p zi&B9UgOP!efv%yEu910&k&%_Dg_WU!wt<0_fr0d-b(Sa^a`RI%(<*Um$T~093e=zm zvLQ1$*(y1|pt2}4J)?xdFJA%9(NQQZPE|-NN=?nFTt4eV6HtdDOh-y;adJ^+K}lwQ m9z$`EyOV;atFxJ*rJ0$ok)C1r+FR~G#SEUVelF{r5}E*c5;y(; diff --git a/assets/icons/Dolphin/DolphinFirstStart3_57x48.png b/assets/icons/Dolphin/DolphinFirstStart3_57x48.png new file mode 100644 index 0000000000000000000000000000000000000000..04466fd83537721b9aa583d61402ec2863bf519c GIT binary patch literal 527 zcmeAS@N?(olHy`uVBq!ia0vp^mOyO42qYMqbKXAyQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIO>_%)r1c1j3A$?$-SQ3bL1Y`ns||Wt8PJ)-%sNJdJ^Yk;&7=F+}2W>IFmZBMt(r z53U}IPna83-=e9zwrT0!sdHN^gtu(ivdgM9R_C3%4hMT#`GUV%?Jl}8fhoe1Za=>r z+udMr^muhJ&tis(sS86~+C!b16%R59EwmIoG@;@Yr}qr&w!RC@7uj3pvh-fHI`qIO zVP^FF%A~pnQJfX~Uq(ATuW|X7zDseQulE!D?r&lA!sNh2`~JQ36=l&SHrfY zAiqG+cXGn)Q|f!X(rw>w6ypuldL5uzvR37X?w^AnxQ&{e|M5G$Ftjo>z40R0*b&V`T3{9*|4Xq3IE&fFFzv%YA%WyXzcL`* z0K^VJ3<6wdrC%&!U|@Xc>EaloaX$94ZT4*k3HA@KMP6JwS={E-c5dmC$=lMrxsGyP zskUCaGCPUYrS>1&Kc=PkM4P5tiO5{dYvWUVaMp0fGa;uB6C95mJF#wU^{@TnCl47# zJX-#L?<-3;ZSmcSzk<$RHDx`t=Yb2iUFZd~hTAhvFcvU#w7JAKoE8?an!>oHi*YGG zGk1kDWBYqu4`T^!X^zks)8uuHCmI-P?qod3?3>T0_PHb6anZ!QnG7FAUsx!{ZU*=N^#De(jtwYV7Z3%F0TxCz>A29m1F>BeL`=FNg^q;wd#e(_g&t=~T zJyu$q^upoUl{pggBX^|jW89>mR;gYb7bVj7Co0|6Hc-xW@}Jvx!m6GHoK(L5z5k{C z(Uxnc{?A+S4jAdGC9V-ADTyViR>?)FK#IZ0z{o(?&`8(FJjBSz%GAQj&_LV3z{Ge3`^ILO^e!PC{*%+S)zOxH-yFnsMTcc5YhPgg&e IbxsLQ0Gp&g?f?J) diff --git a/assets/icons/Dolphin/DolphinFirstStart4_67x53.png b/assets/icons/Dolphin/DolphinFirstStart4_67x53.png new file mode 100644 index 0000000000000000000000000000000000000000..2855bd5c74c25dd344507886b194a52ad996a0b3 GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^&OmI+2qYMcPGvIzDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&V7%KUyadSO zEbxddW?zU^sp2onyDDUaw7@~1L^x}TM!v+Fu z1;H%>!oot*b1ON&^9Hn^dpr3^PERe%4TsoY9DF`~>)zjtXERq^=-8?>{_@@h8Of&x3up{C``l@=#`q|s1+SXSALr=BDHKHUXu_VKa*w7@Am_8d@1zXd4(<85sO5mlH$Lkei>9nN|tXV4!Pg1kzw&Ze?s_ YWoiP^U^(ykXP^cKPgg&ebxsLQ00T(O82|tP literal 0 HcmV?d00001 diff --git a/assets/icons/Dolphin/DolphinFirstStart5_128x54.png b/assets/icons/Dolphin/DolphinFirstStart5_128x54.png deleted file mode 100644 index 6fed3ce81f49459ea4bb521943afe95eaae12eea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmeAS@N?(olHy`uVBq!ia0vp^4M1$h2qYNPudU$&QY`6?zK#qG8~eHcB(eheOiAAE zE)0x!yM&hjd7K3vk;M!Qd`Cc-ajG_-G*FPe#M9T6{Rxk>IE&fFFzv%YA%WyXzcL`* z0K^VJ3<6wdrC%%p8pz=3;uxZFKK8O>wy>iF+k=U6OimwPEzEq^^hHIq<(VTaB0gA28UkG$PBh|Foux2h&4`c0RQO zi9b#`MqOlGQmMtR@3Zr+{cV$;S68M^`g7t%|LyrUhnu(_#Rq+pwc+P67Lrn0&B2+W z)qEjz%kSl-hm*Lk$7r}7J*MWm;JLu^16&s!15dloP-u!>KVf65c1fWnyQ@Llc82JW zI*fYk|4#MotSr19pSpLcgnIc7`#%fz+y5#wN!mN<&{yV*zxK{MDDSU!RV$x2l+EP& znxAC_`!@L%-%#gG{FdU)c8g)Zd^P5g84$yc7DP&G+knyRqhJqn6OhyO+d8Pc^=sXt*Y9z1h6_ zxva5XyGyLtB(5jh8E340Sp1NwcBP}px*KZ+iV8XZGgZdk-}QIrTsB~uP%UwdC`m~y zNwrEYN(E93Mg~R(x`sx&M&=<###ROfR)%KUK+?eAc*r^f6b-rgDVb@NC>o5cOf9So z4Imn_&Wp7IHK>7X$V^VQO3p8+EXqvJC}Hr+SAcVL6iSOz71D}QQ*$bp&-%~=)S(E| xk&;@RT$EW*l9`{!P#om$q~Pi5Y-VU_W~OVTXBfWrmOD@}gQu&X%Q~loCII=TRq_A; diff --git a/assets/icons/Dolphin/DolphinFirstStart5_45x53.png b/assets/icons/Dolphin/DolphinFirstStart5_45x53.png new file mode 100644 index 0000000000000000000000000000000000000000..62b33e1e60d32441abeb979426694f7a7f8d2f8b GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^xNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9f$?sa@Dd=8 zv%n*=n1O*?2!t6g-L3lr6l5>)^mS!_$|%cctY@Bkcp6aXucwP+h{R>n3v2zD9Yt6l zOb#(Qm{7QtciEnUc1#m4h+MxOakbI>z=Q`{jiy^)Z)0nYY+iADR@<(ZX-EBxHy7_P z7QQll_MQ3(TTD1^xacROY;9Z|-0SGRZngQ9CEqNyHrY$B;C#Ej@w&{C8il9@S!9?uikw@AHp_WhCthDX`!)NIZy|Dm$K+g<0x z^>!iYmpwAuzpP$!WY)T;e7#xv%u}blJFwPA=dsZLCxY|Mq=n|rQM#fgb1brFj^D(Z zq?sHO_oRO`;S)L4@~PTL_+DzDyz$olnNe(>)78!yZ?^cGEgANx^yp)G_w!uJ-wc~A zfB~Ue;u=wsl30>zm0Xkxq!^40j0|-R40VkxLkvxvobb=XzIE&fFFzv%YA%WyXzcL`* z0K^VJ3<6wdrC%&!U|{^=>EaloaX$9)#%^Ip5w;J@#a23P*buya!-pttM+<`+w>j9u zgtnT8dv>XqAN~4#e!@zb8JDvTx^C}~*kHhM=%wy!1+k{8>DK3V%&y-3`DfZD&u4jE zoD-%haq_WLbx z(#~lWyZGzBxBHcxPaX8wfA8|cQ{6&A8M2|JH|`ZJU{NYxB&(skbG{eXQuffh@3+YO zIg(#|?r7P4CZ7pDlli_5^yPgrtQ<%FkKPHGq5SgxadN@j`b8lhS{#`Bq#I}g2I zAGd4L%CpkHx4l>;QoH-N`qLL5{U-kt$_;F_KNi}!?ttOkm)F$(6;V zJlnQFO+FR(GkcfZ;A9O^`EW$Guf&3Xh;f?4Fk6_l-#`0vpRM7Rda?6u zUVbc}j8b0uao#p7y_@a)xL4MQf7|W@3z_E~y8CtMrl~7?x(u&Oej~T$vTWuA#{Iu1 z+V4>_%)4ZKgGc86;{`Jh#4Jq#X1YdthT&^(xdRn5c)I$ztaD0e0st^iQAPj& diff --git a/assets/icons/Dolphin/DolphinFirstStart6_58x54.png b/assets/icons/Dolphin/DolphinFirstStart6_58x54.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9cd908b5136273bf9c6464569d1496ae67f4a2 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^RzPgV2qYNxF>U_`q*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDI0P3H?z#v{QXIG#NP=YDR+uenM@oty!5+IMW zz$3Dlfq`2Hgc&d0t@{HMWH0gbb!C6bD9dN8XP$d_8Uq8PjHioZh{Wa43mg3o8;G!8 z&@N4QCTF1(b zVLCNJVPaP{Pv8#M&r1AhbM7R6_q!s)Q2o$%R~K(QwX^CCZ+Q;8Ppg@W3im!;C9}45 zTg3hcSbk&Ax%t!h$FX}GtvPF@>lxZ#MfgMttXu>PI@J=_h?11Vl2ohYqEsNoU}Ruq zsB2)TYh)Q>Xkuk*Xk}=jZD3$!VDPhCP7FmuZhlH;S|wbAfklXcrInGnm5~WVgKN0n Qa-aqVPgg&ebxsLQ0C@+)SO5S3 literal 0 HcmV?d00001 diff --git a/assets/icons/Dolphin/DolphinFirstStart7_128x54.png b/assets/icons/Dolphin/DolphinFirstStart7_128x54.png deleted file mode 100644 index 35ebf277dcb27b54e856f58c959a0180cc9664ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^4M1$h2qYNPudU$&QY`6?zK#qG8~eHcB(eheOiAAE zE)0x!yM&hjd7K3vk;M!Qd`Cc-ajG_-G*FPe#M9T6{Rxk>IE&fFFzv%YA%WyXzcL`* z0K^VJ3<6wdrC%&!U|@Xf>EaloaenG$$82Fo5%v!kS5Lhc%2UVSFK451*8PKs%^SrV z99_2qTwmxNG5X2yNPL5UqyJRXDM{Z14tq2&(K4;-u&ju1bO}recDixv?3w%Klkb*n zH*asf`S)$|^Ru(J^BiaUZNEbQS>mbhpAFg`S-xQImEm~6ej_~X7$+0ok%WV9)*6Yc z%~*_KzQ;dl=t-FG~6JfI~1*+`=L|VO6>0Bjw{SYE90Y z9Pkrdyw_s#uf78rirnit{jPH)9q>3(t8!yRv51-7e0u<3e*17JquMvA#7SB1~$>$}*P=+OIaH3rSzfEn$iN z(IB(u!Tiq`a^Ae;%36^8z$T+DWMf`3-`_MB!SKw;?-wr>mHrGm-_LHvc=B3Yna%lC zWwk%U@_2WmdsHf>e()Zc&2@~&|^H>vb5=(V15 zMsPuMdO&K^mZjG=o?PCfkZaXx-delr=pJ3wd$yJ2p1Hp4i^`nu?;dAqwXFy8GFUIOHC z7I;J!Gca%qfiUBxyLEqng6t)pzOL*~8D;s5^~`e*Ph((U6!vs+43W5OdePAPu!98K zgXlSPWR4u&xZnr>94m{Gk_iuHc*@8aS-en~7f|r>!u$!gr+YZ&%>Gr{C zOVgHS#W@P^E~ppCPHI(?Nl*L9Y{<|RWWe$+`JmXuJ%YCn+})YbyyHc|Hn)qaN4Idz z$mMd|bBK#A^RB}O4(S4o^8z*>&uE*Lg)>gi6DoKtXu&!@?$h{_XvN4ok{x3MNQ4x{4fSjGWfI zdxOVv4ukpG9_J(eF-NdPojWXP-vIE&fFFzv%YA%WyXzcL`* z0K^VJ3<6wdrC%&!U|{^|>EaloaX$6(#%$q08TJp)FRXN4{z%~q+kb|GimI|}c5v%$ z6bN8H$hT1?-N4CY&+S*&LN^Gw6m%>(I!#CSA?MYt(OI(>aq3nq+H3t~g21Ia=ik47 zs<*eBpRZ{CpL@ICKmI=NMOT5xCFc?i87&r3#~=P7o=+Zb6!Wx6mJH}uoKWrg;_^JpKsq4jOf%=*1^ z4ry~3oO9%wtg)kEogt%Ky}IOIdxtH-Z2wGo5^IH)h@`!GQ}J)IWz&PjLQ9+DZ|e72 z9r&)fVI5;#ihg#1L2>Cc?OS^V6Pj0FUQ|+%cE0`}L&5(`7iNi8d0Vx2b7e=JsAIVo ztYanW{mNExmt}{u^QGHA;;f=ws-?;_*FRj*v4JOx<<*4*gUi3U&DVu7ewt$4v!r+K zIWDi5yLUO#I%Mwt=TKpu&y({%qkiG$pwtOc$1G*`YFaWn>a09myGw*w{K8Td7PbWk zbdO(V{`2hIN6F+5jM-9hasK;lG~*2K{!C8<`)MX5lF z!N|bKK-bVn*T_7?$jHjn!phJ<+rYrez(9J^I!hD{x%nxXX_dG&WStjl1!_ zY?Yi}P+63jo>9W!m#+Zl=qQvHrz)fsrKaXoE}!+G38+I6rXwY_IJqdZpd>RtkD)lo i-ATdI)!EF@(#%ZPNY5~Q?JakpVg^rFKbLh*2~7aG=Ss-{ diff --git a/assets/icons/Dolphin/DolphinFirstStart8_56x51.png b/assets/icons/Dolphin/DolphinFirstStart8_56x51.png new file mode 100644 index 0000000000000000000000000000000000000000..55ea58a05b5dcb499c50374715a3182d66ed5aec GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^7C>yw2qYL@S$!)2QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI;3=**-JcqUD=;9%JLcOndcs!1{C`3>Eak7aoP8Rtsk?Y0PBND zjcrdjzJ%OKSl`ehzZe0aLVlGipa zvvn?LT=Q@IBV%Esv}?cFlkGjWQx~QDQi(Twk>RUE3)NNmZ)BT zW;HA4{3p8;f0Rz?{hLr>c=F`VFxiY{w@xx`shoE7#9rR#isIK_7|-48IxF2GvpeOh z(bL&Adjh7*r@P&~dw=7v&vi?0{=Iwb&7rK7fBANAf3m?#u5{x6xib3C-ZfP#0E0ob z#5JNMC9x#cD!C{XNHG{07#Zps80s2Xh8UVynHpLdT4);>SQ!}nESD2Q(U6;;l9^Ts i*I-}~VqjurXl`X}1kqsfShfbJfx*+&&t;ucLK6T%6}x8u literal 0 HcmV?d00001