From 372710c31aa44b4d935eb947483ee98e409c639c Mon Sep 17 00:00:00 2001 From: its your bedtime <23366927+itsyourbedtime@users.noreply.github.com> Date: Thu, 25 Mar 2021 20:48:58 +0300 Subject: [PATCH] [FL-1019] New main screen and graphics (#389) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * new status bar, lock menu and dolphin activities screen * lock icon indication * main screen animation, basic scene switching * level progression calculations based on icounter value Co-authored-by: rusdacent Co-authored-by: あく --- .github/workflows/ci.yml | 6 +- applications/dolphin/dolphin.c | 285 +++++++++++++++++- applications/dolphin/dolphin_i.h | 11 + applications/dolphin/dolphin_state.c | 14 + applications/dolphin/dolphin_state.h | 4 + applications/dolphin/dolphin_views.c | 69 +++-- applications/dolphin/dolphin_views.h | 17 ++ applications/gui/gui.c | 53 +++- applications/gui/icon.c | 10 + applications/gui/icon.h | 10 + applications/power/power.c | 7 +- .../Animations/WatchingTV_128x64/frame_01.png | Bin 0 -> 809 bytes .../Animations/WatchingTV_128x64/frame_02.png | Bin 0 -> 833 bytes .../Animations/WatchingTV_128x64/frame_03.png | Bin 0 -> 818 bytes .../Animations/WatchingTV_128x64/frame_04.png | Bin 0 -> 830 bytes .../Animations/WatchingTV_128x64/frame_05.png | Bin 0 -> 830 bytes .../Animations/WatchingTV_128x64/frame_rate | 1 + .../icons/Animations/Wink_128x64/frame_01.png | Bin 0 -> 674 bytes .../icons/Animations/Wink_128x64/frame_02.png | Bin 0 -> 673 bytes .../icons/Animations/Wink_128x64/frame_03.png | Bin 0 -> 667 bytes .../icons/Animations/Wink_128x64/frame_04.png | Bin 0 -> 673 bytes .../icons/Animations/Wink_128x64/frame_05.png | Bin 0 -> 674 bytes .../icons/Animations/Wink_128x64/frame_06.png | Bin 0 -> 667 bytes .../icons/Animations/Wink_128x64/frame_07.png | Bin 0 -> 673 bytes .../icons/Animations/Wink_128x64/frame_08.png | Bin 0 -> 677 bytes .../icons/Animations/Wink_128x64/frame_09.png | Bin 0 -> 674 bytes .../icons/Animations/Wink_128x64/frame_rate | 1 + assets/icons/Dolphin/BigBurger_24x24.png | Bin 0 -> 356 bytes assets/icons/Dolphin/BigGames_24x24.png | Bin 0 -> 338 bytes assets/icons/Dolphin/BigProfile_24x24.png | Bin 0 -> 340 bytes assets/icons/Dolphin/DolphinOkay_41x43.png | Bin 0 -> 423 bytes assets/icons/Interface/DoorLeft_8x56.png | Bin 0 -> 328 bytes assets/icons/Interface/DoorLocked_10x56.png | Bin 0 -> 372 bytes assets/icons/Interface/DoorRight_8x56.png | Bin 0 -> 317 bytes .../icons/Interface/PassportBottom_128x17.png | Bin 0 -> 364 bytes assets/icons/Interface/PassportLeft_6x47.png | Bin 0 -> 298 bytes assets/icons/StatusBar/Background_128x11.png | Bin 0 -> 410 bytes assets/icons/StatusBar/Background_128x8.png | Bin 0 -> 374 bytes assets/icons/StatusBar/Battery_26x8.png | Bin 0 -> 313 bytes assets/icons/StatusBar/Lock_8x8.png | Bin 0 -> 303 bytes assets/icons/StatusBar/PlaceholderL_11x13.png | Bin 0 -> 312 bytes assets/icons/StatusBar/PlaceholderR_30x13.png | Bin 0 -> 318 bytes 42 files changed, 454 insertions(+), 34 deletions(-) create mode 100644 assets/icons/Animations/WatchingTV_128x64/frame_01.png create mode 100644 assets/icons/Animations/WatchingTV_128x64/frame_02.png create mode 100644 assets/icons/Animations/WatchingTV_128x64/frame_03.png create mode 100644 assets/icons/Animations/WatchingTV_128x64/frame_04.png create mode 100644 assets/icons/Animations/WatchingTV_128x64/frame_05.png create mode 100644 assets/icons/Animations/WatchingTV_128x64/frame_rate create mode 100644 assets/icons/Animations/Wink_128x64/frame_01.png create mode 100644 assets/icons/Animations/Wink_128x64/frame_02.png create mode 100644 assets/icons/Animations/Wink_128x64/frame_03.png create mode 100644 assets/icons/Animations/Wink_128x64/frame_04.png create mode 100644 assets/icons/Animations/Wink_128x64/frame_05.png create mode 100644 assets/icons/Animations/Wink_128x64/frame_06.png create mode 100644 assets/icons/Animations/Wink_128x64/frame_07.png create mode 100644 assets/icons/Animations/Wink_128x64/frame_08.png create mode 100644 assets/icons/Animations/Wink_128x64/frame_09.png create mode 100644 assets/icons/Animations/Wink_128x64/frame_rate create mode 100644 assets/icons/Dolphin/BigBurger_24x24.png create mode 100644 assets/icons/Dolphin/BigGames_24x24.png create mode 100644 assets/icons/Dolphin/BigProfile_24x24.png create mode 100644 assets/icons/Dolphin/DolphinOkay_41x43.png create mode 100644 assets/icons/Interface/DoorLeft_8x56.png create mode 100644 assets/icons/Interface/DoorLocked_10x56.png create mode 100644 assets/icons/Interface/DoorRight_8x56.png create mode 100644 assets/icons/Interface/PassportBottom_128x17.png create mode 100644 assets/icons/Interface/PassportLeft_6x47.png create mode 100644 assets/icons/StatusBar/Background_128x11.png create mode 100644 assets/icons/StatusBar/Background_128x8.png create mode 100644 assets/icons/StatusBar/Battery_26x8.png create mode 100644 assets/icons/StatusBar/Lock_8x8.png create mode 100644 assets/icons/StatusBar/PlaceholderL_11x13.png create mode 100644 assets/icons/StatusBar/PlaceholderR_30x13.png diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae75fc8c..fb09b35f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,11 @@ jobs: uses: actions/checkout@v2 with: fetch-depth: 0 - submodules: true + - name: Checkout submodules + run: git submodule update --init --recursive + - name: Checkout submodules + run: git submodule sync + - uses: satackey/action-docker-layer-caching@v0.0.11 continue-on-error: true with: diff --git a/applications/dolphin/dolphin.c b/applications/dolphin/dolphin.c index 31a15390..b12c4d14 100644 --- a/applications/dolphin/dolphin.c +++ b/applications/dolphin/dolphin.c @@ -1,4 +1,27 @@ #include "dolphin_i.h" +#include + +// temporary main screen animation managment +void dolphin_scene_handler_set_scene(Dolphin* dolphin, IconName icon) { + with_view_model( + dolphin->idle_view_main, (DolphinViewMainModel * model) { + model->animation = assets_icons_get(icon); + icon_start_animation(model->animation); + return true; + }); +} + +void dolphin_scene_handler_switch_scene(Dolphin* dolphin) { + with_view_model( + dolphin->idle_view_main, (DolphinViewMainModel * model) { + if(icon_is_last_frame(model->animation)) { + model->animation = assets_icons_get(idle_scenes[model->scene_num]); + icon_start_animation(model->animation); + model->scene_num = random() % sizeof(idle_scenes); + } + return true; + }); +} bool dolphin_view_first_start_input(InputEvent* event, void* context) { furi_assert(event); @@ -34,15 +57,38 @@ bool dolphin_view_idle_main_input(InputEvent* event, void* context) { Dolphin* dolphin = context; if(event->type == InputTypeShort) { - if(event->key == InputKeyOk) { - with_value_mutex( - dolphin->menu_vm, (Menu * menu) { menu_ok(menu); }); - } else if(event->key == InputKeyUp) { - view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleUp); - } else if(event->key == InputKeyDown) { - view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleDown); + if(!dolphin->locked) { + if(event->key == InputKeyOk) { + with_value_mutex( + dolphin->menu_vm, (Menu * menu) { menu_ok(menu); }); + } else if(event->key == InputKeyUp) { + view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewLockMenu); + } else if(event->key == InputKeyLeft) { + view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleUp); + } else if(event->key == InputKeyRight) { + view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleMeta); + } else if(event->key == InputKeyDown) { + view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleDown); + } + + if(event->key == InputKeyBack) { + view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleMain); + } + } else { + if(event->key == InputKeyBack) { + dolphin->lock_count++; + if(dolphin->lock_count == 3) { + dolphin->locked = false; + dolphin->lock_count = 0; + view_dispatcher_switch_to_view( + dolphin->idle_view_dispatcher, DolphinViewIdleMain); + view_port_enabled_set(dolphin->lock_viewport, false); + } + } } + dolphin_scene_handler_switch_scene(dolphin); } + // All events consumed return true; } @@ -67,6 +113,182 @@ bool dolphin_view_idle_up_input(InputEvent* event, void* context) { return true; } +static void lock_menu_callback(void* context, uint8_t index) { + Dolphin* dolphin = context; + switch(index) { + case 0: + dolphin->locked = true; + view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleMain); + view_port_enabled_set(dolphin->lock_viewport, true); + break; + + default: + break; + } +} + +static void meta_menu_callback(void* context, uint8_t index) { + Dolphin* dolphin = context; + switch(index) { + case 0: + view_port_enabled_set(dolphin->passport, true); + break; + + default: + break; + } +} + +static void lock_icon_callback(Canvas* canvas, void* context) { + assert(context); + Dolphin* dolphin = context; + canvas_draw_icon(canvas, 0, 0, dolphin->lock_icon); +} + +static void draw_passport_callback(Canvas* canvas, void* context) { + assert(context); + Dolphin* dolphin = context; + + char level[20]; + uint32_t current_level = dolphin_state_get_level(dolphin->state); + uint32_t prev_cap = dolphin_state_xp_to_levelup(dolphin->state, current_level - 1, false); + uint32_t exp = (dolphin_state_xp_to_levelup(dolphin->state, current_level, true) * 63) / + (dolphin_state_xp_to_levelup(dolphin->state, current_level, false) - prev_cap); + + canvas_clear(canvas); + + // multipass + canvas_draw_icon_name(canvas, 0, 0, I_PassportLeft_6x47); + canvas_draw_icon_name(canvas, 0, 47, I_PassportBottom_128x17); + canvas_draw_line(canvas, 6, 0, 125, 0); + canvas_draw_line(canvas, 127, 2, 127, 47); + canvas_draw_dot(canvas, 126, 1); + + //portrait frame + canvas_draw_line(canvas, 9, 6, 9, 53); + canvas_draw_line(canvas, 10, 5, 52, 5); + canvas_draw_line(canvas, 55, 8, 55, 53); + canvas_draw_line(canvas, 10, 54, 54, 54); + canvas_draw_line(canvas, 53, 5, 55, 7); + + // portrait + canvas_draw_icon_name(canvas, 14, 11, I_DolphinOkay_41x43); + canvas_draw_line(canvas, 59, 18, 124, 18); + canvas_draw_line(canvas, 59, 31, 124, 31); + canvas_draw_line(canvas, 59, 44, 124, 44); + + canvas_draw_str(canvas, 59, 15, api_hal_version_get_name_ptr()); + canvas_draw_str(canvas, 59, 28, "Mood: OK"); + + snprintf(level, 20, "Level: %ld", current_level); + + canvas_draw_str(canvas, 59, 41, level); + canvas_set_color(canvas, ColorWhite); + canvas_draw_box(canvas, 123 - exp, 48, exp + 1, 6); + canvas_set_color(canvas, ColorBlack); + canvas_draw_line(canvas, 123 - exp, 48, 123 - exp, 54); +} + +static void passport_input_callback(InputEvent* event, void* context) { + Dolphin* dolphin = context; + if(event->type == InputTypeShort) { + if(event->key == InputKeyBack) { + view_port_enabled_set(dolphin->passport, false); + } + } +} + +bool dolphin_view_lockmenu_input(InputEvent* event, void* context) { + furi_assert(event); + furi_assert(context); + Dolphin* dolphin = context; + + if(event->type != InputTypeShort) return false; + + if(event->key == InputKeyUp) { + with_view_model( + dolphin->view_lockmenu, (DolphinViewMenuModel * model) { + if(model->idx <= 0) + model->idx = 0; + else + --model->idx; + return true; + }); + } else if(event->key == InputKeyDown) { + with_view_model( + dolphin->view_lockmenu, (DolphinViewMenuModel * model) { + if(model->idx >= 2) + model->idx = 2; + else + ++model->idx; + return true; + }); + } else if(event->key == InputKeyOk) { + with_view_model( + dolphin->view_lockmenu, (DolphinViewMenuModel * model) { + lock_menu_callback(context, model->idx); + return true; + }); + } else if(event->key == InputKeyBack) { + with_view_model( + dolphin->view_lockmenu, (DolphinViewMenuModel * model) { + model->idx = 0; + return true; + }); + view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleMain); + + if(random() % 100 > 50) + dolphin_scene_handler_set_scene(dolphin, idle_scenes[random() % sizeof(idle_scenes)]); + } + + return true; +} + +bool dolphin_view_idle_meta_input(InputEvent* event, void* context) { + furi_assert(event); + furi_assert(context); + Dolphin* dolphin = context; + + if(event->type != InputTypeShort) return false; + + if(event->key == InputKeyLeft) { + with_view_model( + dolphin->idle_view_meta, (DolphinViewMenuModel * model) { + if(model->idx <= 0) + model->idx = 0; + else + --model->idx; + return true; + }); + } else if(event->key == InputKeyRight) { + with_view_model( + dolphin->idle_view_meta, (DolphinViewMenuModel * model) { + if(model->idx >= 2) + model->idx = 2; + else + ++model->idx; + return true; + }); + } else if(event->key == InputKeyOk) { + with_view_model( + dolphin->idle_view_meta, (DolphinViewMenuModel * model) { + meta_menu_callback(context, model->idx); + return true; + }); + } else if(event->key == InputKeyBack) { + with_view_model( + dolphin->idle_view_meta, (DolphinViewMenuModel * model) { + model->idx = 0; + return true; + }); + view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleMain); + if(random() % 100 > 50) + dolphin_scene_handler_set_scene(dolphin, idle_scenes[random() % sizeof(idle_scenes)]); + } + + return true; +} + Dolphin* dolphin_alloc() { Dolphin* dolphin = furi_alloc(sizeof(Dolphin)); // Message queue @@ -90,6 +312,9 @@ Dolphin* dolphin_alloc() { // Main Idle View dolphin->idle_view_main = view_alloc(); view_set_context(dolphin->idle_view_main, dolphin); + view_allocate_model( + dolphin->idle_view_main, ViewModelTypeLockFree, sizeof(DolphinViewIdleUpModel)); + view_set_draw_callback(dolphin->idle_view_main, dolphin_view_idle_main_draw); view_set_input_callback(dolphin->idle_view_main, dolphin_view_idle_main_input); view_dispatcher_add_view( @@ -97,13 +322,34 @@ Dolphin* dolphin_alloc() { // Stats Idle View dolphin->idle_view_up = view_alloc(); view_set_context(dolphin->idle_view_up, dolphin); + view_allocate_model( - dolphin->idle_view_up, ViewModelTypeLockFree, sizeof(DolphinViewIdleUpModel)); + dolphin->idle_view_up, ViewModelTypeLockFree, sizeof(DolphinViewMainModel)); view_set_draw_callback(dolphin->idle_view_up, dolphin_view_idle_up_draw); view_set_input_callback(dolphin->idle_view_up, dolphin_view_idle_up_input); view_set_previous_callback(dolphin->idle_view_up, dolphin_view_idle_back); view_dispatcher_add_view( dolphin->idle_view_dispatcher, DolphinViewIdleUp, dolphin->idle_view_up); + // Lock Menu View + dolphin->view_lockmenu = view_alloc(); + view_set_context(dolphin->view_lockmenu, dolphin); + view_allocate_model( + dolphin->view_lockmenu, ViewModelTypeLockFree, sizeof(DolphinViewMenuModel)); + view_set_draw_callback(dolphin->view_lockmenu, dolphin_view_lockmenu_draw); + view_set_input_callback(dolphin->view_lockmenu, dolphin_view_lockmenu_input); + view_set_previous_callback(dolphin->view_lockmenu, dolphin_view_idle_back); + view_dispatcher_add_view( + dolphin->idle_view_dispatcher, DolphinViewLockMenu, dolphin->view_lockmenu); + // Meta View + dolphin->idle_view_meta = view_alloc(); + view_set_context(dolphin->idle_view_meta, dolphin); + view_allocate_model( + dolphin->idle_view_meta, ViewModelTypeLockFree, sizeof(DolphinViewMenuModel)); + view_set_draw_callback(dolphin->idle_view_meta, dolphin_view_idle_meta_draw); + view_set_input_callback(dolphin->idle_view_meta, dolphin_view_idle_meta_input); + view_set_previous_callback(dolphin->idle_view_meta, dolphin_view_idle_back); + view_dispatcher_add_view( + dolphin->idle_view_dispatcher, DolphinViewIdleMeta, dolphin->idle_view_meta); // Down Idle View dolphin->idle_view_down = view_alloc(); view_set_draw_callback(dolphin->idle_view_down, dolphin_view_idle_down_draw); @@ -117,6 +363,22 @@ Dolphin* dolphin_alloc() { view_dispatcher_add_view( dolphin->idle_view_dispatcher, DolphinViewHwMismatch, dolphin->view_hw_mismatch); + // Lock icon + dolphin->lock_icon = assets_icons_get(I_Lock_8x8); + dolphin->lock_viewport = view_port_alloc(); + view_port_set_width(dolphin->lock_viewport, icon_get_width(dolphin->lock_icon)); + view_port_draw_callback_set(dolphin->lock_viewport, lock_icon_callback, dolphin); + view_port_enabled_set(dolphin->lock_viewport, false); + + // Passport + dolphin->passport = view_port_alloc(); + view_port_draw_callback_set(dolphin->passport, draw_passport_callback, dolphin); + view_port_input_callback_set(dolphin->passport, passport_input_callback, dolphin); + view_port_enabled_set(dolphin->passport, false); + + // Main screen animation + dolphin_scene_handler_set_scene(dolphin, idle_scenes[random() % sizeof(idle_scenes)]); + return dolphin; } @@ -139,7 +401,12 @@ int32_t dolphin_task() { Dolphin* dolphin = dolphin_alloc(); Gui* gui = furi_record_open("gui"); + view_dispatcher_attach_to_gui(dolphin->idle_view_dispatcher, gui, ViewDispatcherTypeWindow); + gui_add_view_port(gui, dolphin->lock_viewport, GuiLayerStatusBarLeft); + + gui_add_view_port(gui, dolphin->passport, GuiLayerFullscreen); + if(dolphin_state_load(dolphin->state)) { view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewIdleMain); } else { @@ -157,7 +424,6 @@ int32_t dolphin_task() { if(!api_hal_version_do_i_belong_here()) { view_dispatcher_switch_to_view(dolphin->idle_view_dispatcher, DolphinViewHwMismatch); } - DolphinEvent event; while(1) { furi_check(osMessageQueueGet(dolphin->event_queue, &event, NULL, osWaitForever) == osOK); @@ -173,6 +439,5 @@ int32_t dolphin_task() { dolphin_state_save(dolphin->state); } } - return 0; } diff --git a/applications/dolphin/dolphin_i.h b/applications/dolphin/dolphin_i.h index a0cd8e40..ff257921 100644 --- a/applications/dolphin/dolphin_i.h +++ b/applications/dolphin/dolphin_i.h @@ -39,9 +39,20 @@ struct Dolphin { View* idle_view_main; View* idle_view_up; View* idle_view_down; + View* idle_view_meta; View* view_hw_mismatch; + View* view_lockmenu; + ViewPort* passport; + ViewPort* lock_viewport; + Icon* lock_icon; + + bool locked; + uint8_t lock_count; }; +// Temporary +const IconName idle_scenes[] = {A_Wink_128x64, A_WatchingTV_128x64}; + Dolphin* dolphin_alloc(); /* Save Dolphin state (write to permanent memory) diff --git a/applications/dolphin/dolphin_state.c b/applications/dolphin/dolphin_state.c index 8bff0c01..cbe5e117 100644 --- a/applications/dolphin/dolphin_state.c +++ b/applications/dolphin/dolphin_state.c @@ -1,6 +1,7 @@ #include "dolphin_state.h" #include #include +#include typedef struct { uint8_t magic; @@ -17,6 +18,8 @@ typedef struct { #define DOLPHIN_DATA_HEADER_MAGIC 0xD0 #define DOLPHIN_DATA_HEADER_VERSION 0x01 +#define DOLPHIN_LVL_THRESHOLD 20.0f + typedef struct { uint32_t limit_ibutton; uint32_t limit_nfc; @@ -119,3 +122,14 @@ uint32_t dolphin_state_get_icounter(DolphinState* dolphin_state) { uint32_t dolphin_state_get_butthurt(DolphinState* dolphin_state) { return dolphin_state->data.butthurt; } + +uint32_t dolphin_state_get_level(DolphinState* dolphin_state) { + return 0.5f + + sqrtf(1.0f + 8.0f * ((float)dolphin_state->data.icounter / DOLPHIN_LVL_THRESHOLD)) / + 2.0f; +} + +uint32_t dolphin_state_xp_to_levelup(DolphinState* dolphin_state, uint32_t level, bool remaining) { + return (DOLPHIN_LVL_THRESHOLD * level * (level + 1) / 2) - + (remaining ? dolphin_state->data.icounter : 0); +} \ No newline at end of file diff --git a/applications/dolphin/dolphin_state.h b/applications/dolphin/dolphin_state.h index 33433b2b..6e5a94e0 100644 --- a/applications/dolphin/dolphin_state.h +++ b/applications/dolphin/dolphin_state.h @@ -21,3 +21,7 @@ void dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed); uint32_t dolphin_state_get_icounter(DolphinState* dolphin_state); uint32_t dolphin_state_get_butthurt(DolphinState* dolphin_state); + +uint32_t dolphin_state_get_level(DolphinState* dolphin_state); + +uint32_t dolphin_state_xp_to_levelup(DolphinState* dolphin_state, uint32_t level, bool remaining); \ No newline at end of file diff --git a/applications/dolphin/dolphin_views.c b/applications/dolphin/dolphin_views.c index 7f9b3525..1cad7cd4 100644 --- a/applications/dolphin/dolphin_views.c +++ b/applications/dolphin/dolphin_views.c @@ -2,9 +2,11 @@ #include #include #include - #include +static char* Lockmenu_Items[3] = {"Lock", "Set PIN", "DUMB mode"}; +static char* Meta_Items[3] = {"Passport", "Games", "???"}; + void dolphin_view_first_start_draw(Canvas* canvas, void* model) { DolphinViewFirstStartModel* m = model; canvas_clear(canvas); @@ -57,40 +59,73 @@ void dolphin_view_first_start_draw(Canvas* canvas, void* model) { void dolphin_view_idle_main_draw(Canvas* canvas, void* model) { canvas_clear(canvas); - canvas_set_color(canvas, ColorBlack); - 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"); - canvas_draw_str(canvas, 2, 52, "\\/: Version"); + DolphinViewMainModel* m = model; + if(m->animation) canvas_draw_icon(canvas, 0, 0, m->animation); } void dolphin_view_idle_up_draw(Canvas* canvas, void* model) { DolphinViewIdleUpModel* m = model; canvas_clear(canvas); + canvas_set_color(canvas, ColorBlack); canvas_set_font(canvas, FontPrimary); - canvas_draw_str(canvas, 2, 10, "Dolphin stats:"); + canvas_draw_str(canvas, 2, 15, "Dolphin stats:"); char buffer[64]; canvas_set_font(canvas, FontSecondary); snprintf(buffer, 64, "Icounter: %ld", m->icounter); - canvas_draw_str(canvas, 5, 22, buffer); + canvas_draw_str(canvas, 5, 30, buffer); snprintf(buffer, 64, "Butthurt: %ld", m->butthurt); - canvas_draw_str(canvas, 5, 32, buffer); - canvas_draw_str(canvas, 5, 40, "< > change icounter"); + canvas_draw_str(canvas, 5, 40, buffer); + canvas_draw_str(canvas, 0, 53, "[< >] icounter value [ok] save"); +} + +void dolphin_view_lockmenu_draw(Canvas* canvas, void* model) { + DolphinViewMenuModel* m = model; + canvas_clear(canvas); + canvas_set_color(canvas, ColorBlack); + canvas_draw_icon_name(canvas, 5, 0, I_DoorLeft_8x56); + canvas_draw_icon_name(canvas, 115, 0, I_DoorRight_8x56); + canvas_set_font(canvas, FontSecondary); + for(uint8_t i = 0; i < 3; ++i) { + canvas_draw_str_aligned( + canvas, 64, 13 + (i * 17), AlignCenter, AlignCenter, Lockmenu_Items[i]); + if(m->idx == i) elements_frame(canvas, 15, 5 + (i * 17), 98, 15); + } +} + +void dolphin_view_idle_meta_draw(Canvas* canvas, void* model) { + DolphinViewMenuModel* m = model; + canvas_clear(canvas); + canvas_set_color(canvas, ColorBlack); + canvas_set_font(canvas, FontSecondary); + + canvas_draw_icon_name(canvas, 20, 23, I_BigProfile_24x24); + canvas_draw_icon_name(canvas, 55, 23, I_BigGames_24x24); + canvas_draw_icon_name(canvas, 90, 23, I_BigBurger_24x24); + + canvas_draw_str_aligned(canvas, 66, 12, AlignCenter, AlignCenter, Meta_Items[m->idx]); + + canvas_draw_frame(canvas, 17 + (35 * m->idx), 20, 30, 30); + canvas_set_color(canvas, ColorWhite); + + canvas_draw_dot(canvas, 17 + (35 * m->idx), 20); + canvas_draw_dot(canvas, 17 + (35 * m->idx), 49); + canvas_draw_dot(canvas, 46 + (35 * m->idx), 20); + canvas_draw_dot(canvas, 46 + (35 * m->idx), 49); + + canvas_set_color(canvas, ColorBlack); } void dolphin_view_idle_down_draw(Canvas* canvas, void* model) { canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); canvas_set_font(canvas, FontPrimary); - canvas_draw_str(canvas, 2, 10, "Version info:"); + canvas_draw_str(canvas, 2, 15, "Version info:"); canvas_set_font(canvas, FontSecondary); - canvas_draw_str(canvas, 5, 22, TARGET " " BUILD_DATE); - canvas_draw_str(canvas, 5, 32, GIT_BRANCH); - canvas_draw_str(canvas, 5, 42, GIT_BRANCH_NUM " " GIT_COMMIT); + canvas_draw_str(canvas, 5, 25, TARGET " " BUILD_DATE); + canvas_draw_str(canvas, 5, 35, GIT_BRANCH); + canvas_draw_str(canvas, 5, 45, GIT_BRANCH_NUM " " GIT_COMMIT); char buffer[64]; snprintf( @@ -101,7 +136,7 @@ void dolphin_view_idle_down_draw(Canvas* canvas, void* model) { api_hal_version_get_hw_target(), api_hal_version_get_hw_body(), api_hal_version_get_hw_connect()); - canvas_draw_str(canvas, 5, 52, buffer); + canvas_draw_str(canvas, 5, 55, buffer); } void dolphin_view_hw_mismatch_draw(Canvas* canvas, void* model) { diff --git a/applications/dolphin/dolphin_views.h b/applications/dolphin/dolphin_views.h index 6433080c..2be3b14f 100644 --- a/applications/dolphin/dolphin_views.h +++ b/applications/dolphin/dolphin_views.h @@ -13,6 +13,8 @@ typedef enum { DolphinViewIdleUp, DolphinViewIdleDown, DolphinViewHwMismatch, + DolphinViewLockMenu, + DolphinViewIdleMeta, } DolphinViewIdle; typedef struct { @@ -27,12 +29,27 @@ typedef struct { uint32_t butthurt; } DolphinViewIdleUpModel; +typedef struct { + uint8_t idx; +} DolphinViewMenuModel; + +typedef struct { + Icon* animation; + uint8_t scene_num; + +} DolphinViewMainModel; + void dolphin_view_idle_main_draw(Canvas* canvas, void* model); bool dolphin_view_idle_main_input(InputEvent* event, void* context); void dolphin_view_idle_up_draw(Canvas* canvas, void* model); + +void dolphin_view_lockmenu_draw(Canvas* canvas, void* model); + void dolphin_view_idle_down_draw(Canvas* canvas, void* model); +void dolphin_view_idle_meta_draw(Canvas* canvas, void* model); + void dolphin_view_hw_mismatch_draw(Canvas* canvas, void* model); uint32_t dolphin_view_idle_back(void* context); diff --git a/applications/gui/gui.c b/applications/gui/gui.c index bc541d0a..40ae8078 100644 --- a/applications/gui/gui.c +++ b/applications/gui/gui.c @@ -46,8 +46,12 @@ void gui_redraw_status_bar(Gui* gui) { uint8_t x_used = 0; uint8_t width; ViewPort* view_port; + canvas_frame_set( + gui->canvas, GUI_STATUS_BAR_X, GUI_STATUS_BAR_Y, GUI_DISPLAY_WIDTH, GUI_STATUS_BAR_HEIGHT); + canvas_draw_icon_name(gui->canvas, 0, 0, I_Background_128x11); + // Right side - x = GUI_DISPLAY_WIDTH + 2; + x = GUI_DISPLAY_WIDTH; ViewPortArray_it(it, gui->layers[GuiLayerStatusBarRight]); while(!ViewPortArray_end_p(it) && x_used < GUI_STATUS_BAR_WIDTH) { // Render view_port; @@ -57,7 +61,28 @@ void gui_redraw_status_bar(Gui* gui) { if(!width) width = 8; x_used += width; x -= (width + 2); - canvas_frame_set(gui->canvas, x, GUI_STATUS_BAR_Y, width, GUI_STATUS_BAR_HEIGHT); + canvas_frame_set(gui->canvas, x - 3, GUI_STATUS_BAR_Y, width, GUI_STATUS_BAR_HEIGHT); + + canvas_set_color(gui->canvas, ColorWhite); + canvas_draw_box(gui->canvas, 1, 1, width + 3, 11); + + canvas_set_color(gui->canvas, ColorBlack); + + canvas_draw_box(gui->canvas, 1, 0, 1, 12); + canvas_draw_box(gui->canvas, 0, 1, 1, 11); + + canvas_draw_box(gui->canvas, 1, 11, width + 4, 2); + canvas_draw_box(gui->canvas, 1, 0, width + 4, 1); + canvas_draw_box(gui->canvas, width + 4, 1, 1, 11); + + canvas_set_color(gui->canvas, ColorWhite); + canvas_draw_dot(gui->canvas, width + 4, 0); + canvas_draw_dot(gui->canvas, width + 4, 12); + + canvas_set_color(gui->canvas, ColorBlack); + + canvas_frame_set(gui->canvas, x, GUI_STATUS_BAR_Y + 2, width, GUI_STATUS_BAR_HEIGHT); + view_port_draw(view_port, gui->canvas); } ViewPortArray_next(it); @@ -73,7 +98,31 @@ void gui_redraw_status_bar(Gui* gui) { if(!width) width = 8; x_used += width; canvas_frame_set(gui->canvas, x, GUI_STATUS_BAR_Y, width, GUI_STATUS_BAR_HEIGHT); + + canvas_set_color(gui->canvas, ColorWhite); + canvas_draw_box(gui->canvas, 1, 1, width + 3, 11); + + canvas_set_color(gui->canvas, ColorBlack); + + if(x == 0) { // Frame start + canvas_draw_box(gui->canvas, 1, 0, 1, 12); + canvas_draw_box(gui->canvas, 0, 1, 1, 11); + } + + canvas_draw_box(gui->canvas, 1, 11, width + 4, 2); + canvas_draw_box(gui->canvas, 1, 0, width + 4, 1); + canvas_draw_box(gui->canvas, width + 4, 0, 1, 12); + + canvas_set_color(gui->canvas, ColorWhite); + canvas_draw_dot(gui->canvas, width + 4, 0); + canvas_draw_dot(gui->canvas, width + 4, 12); + + canvas_set_color(gui->canvas, ColorBlack); + + canvas_frame_set( + gui->canvas, x + 3, GUI_STATUS_BAR_Y + 2, width, GUI_STATUS_BAR_HEIGHT); view_port_draw(view_port, gui->canvas); + x += (width + 2); } ViewPortArray_next(it); diff --git a/applications/gui/icon.c b/applications/gui/icon.c index 37c6eba0..a0cc2505 100644 --- a/applications/gui/icon.c +++ b/applications/gui/icon.c @@ -58,3 +58,13 @@ void icon_stop_animation(Icon* icon) { icon->tick = 0; icon->frame = 0; } + +uint8_t icon_get_current_frame(Icon* icon) { + furi_assert(icon); + return icon->frame; +} + +bool icon_is_last_frame(Icon* icon) { + furi_assert(icon); + return icon->data->frame_count - icon->frame <= 1; +} \ No newline at end of file diff --git a/applications/gui/icon.h b/applications/gui/icon.h index 72acabd5..d9d14c94 100644 --- a/applications/gui/icon.h +++ b/applications/gui/icon.h @@ -46,6 +46,16 @@ void icon_start_animation(Icon* icon); */ void icon_stop_animation(Icon* icon); +/* + * Get current frame + */ +uint8_t icon_get_current_frame(Icon* icon); + +/* + * Returns true if current frame is a last one + */ +bool icon_is_last_frame(Icon* icon); + #ifdef __cplusplus } #endif diff --git a/applications/power/power.c b/applications/power/power.c index e8b58049..10d6256d 100644 --- a/applications/power/power.c +++ b/applications/power/power.c @@ -42,11 +42,10 @@ void power_draw_usb_callback(Canvas* canvas, void* context) { void power_draw_battery_callback(Canvas* canvas, void* context) { assert(context); Power* power = context; - canvas_draw_icon(canvas, 0, 0, power->battery_icon); with_view_model( power->info_view, (PowerInfoModel * model) { - canvas_draw_box(canvas, 2, 2, (float)model->charge / 100 * 14, 4); + canvas_draw_box(canvas, 2, 2, (float)model->charge / 100 * 20, 4); return false; }); } @@ -130,11 +129,11 @@ Power* power_alloc() { view_port_set_width(power->usb_view_port, icon_get_width(power->usb_icon)); view_port_draw_callback_set(power->usb_view_port, power_draw_usb_callback, power); - power->battery_icon = assets_icons_get(I_Battery_19x8); + power->battery_icon = assets_icons_get(I_Battery_26x8); power->battery_view_port = view_port_alloc(); + view_port_set_width(power->battery_view_port, icon_get_width(power->battery_icon)); view_port_draw_callback_set(power->battery_view_port, power_draw_battery_callback, power); - return power; } diff --git a/assets/icons/Animations/WatchingTV_128x64/frame_01.png b/assets/icons/Animations/WatchingTV_128x64/frame_01.png new file mode 100644 index 0000000000000000000000000000000000000000..221cfbba34ac5fc3d557920d2ab3115120d54f52 GIT binary patch literal 809 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYF7d#b>5MCeVg%R6V4P0u|G{;%$-7cl-Cc`j>B-Nc5Xof zpEHi7|6;ex@|42V@S?RcTC=rxhFxIZrTvrjfH2Dp<(OF)UYgr7m~uYb%lOd1nr%g1 zI=6tVLYVo{hU~KA42p}GRh%Ac9N!nfSbJShx&3;~t%e1Y`*y^& zAxq~Te-~A;XR_e3wbK1_`mJ>={NtS@)!Nz5JZ05zemq0WWM9dy36=c`o4KvDGtPhF za(mrrX+j|I=OuHr?``^pQlLl @8RtY~}@KlFkV%H;!?gEy# zFGFN1{CoA44HqOUG|hR@$IKs4o6?qgP-bl>Tf#OiyF;cgHb0si>OAGo0pmac2;-d^-S^FjmX8>h zG3v(e5^kDWz_Z)jqEez^>z!2#ef;KqyW+k#Wa}mm@0O1*_BXE1JJ7qHUvD{XE)7O>#DYFZ$nS#Jy77;qPnA*<^N-k0(GH3|JUo(wOCwzSL(l2E9y{%1lw$;Kga61 zrx-f@P;aU@G2zeltzvUK*Mul+my6E+%zZ-M;hBZ;%{{U9<+Z1e#ri-C z=idzPUNSHp`!loNMB}!0lVpB9*I(o6sW+x^aq!y9e} zPI~0U->`T`vGPx5sRfn}3frxjU+t1*cJf$%T)=$IIj3{AUN65!7@a=zA*wU`)g-y5 z@12VS?HdlceGIoy);sUeb2HTJ&r2y8wrOG?4#?Nvd;R3EVTIk_H9XyinZLMg6Azo( zn;iM3^6L52+1FWT$A;|t{;y(cx-@_D(Q_S^@8_-DbE#M_o-Iv(t#C+EwwJJ(yTR@U z?Yjinp83pMxakd(;}SK!lgE@~9A78r_th+mz4%+b_;W>*Os4pBGqv9uJpHWMUCVd{ ztR8r-+dcO~XS9^nM@MthPfLV__Hgwm7TEO{t>>KNCU;6;&8j0y4l=kO;K^vXw){?Z zg-Oh^#Oceg9ny1JDO|wvC?{0e+J?dQvB%4@^FrDIrWtE5@imK{{K05pCvk9JheGX- zaJI5TjK}IE3@mwPoD~#0a5T44k~wmp)g#7b4}<4&Y->%n*n05fWrj6RgLqR5KW$nb zH$PY*Y2vhw&9C=2da)NQz246Bu`+ZL<0QtOhc^CuvKTHV+fCVC{E;E=1JC|bF BOAP=3 literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/WatchingTV_128x64/frame_03.png b/assets/icons/Animations/WatchingTV_128x64/frame_03.png new file mode 100644 index 0000000000000000000000000000000000000000..672cd1e84429a547305f6ac61f01b66490e67eff GIT binary patch literal 818 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYFL_~fFm z%s70Tacxh&&>{}G>n8QgHcB&AJBoPTXRrzXEYBdpAo-u|0sor9wG$ndH?SV=V%RcM zsm)4Z@0oM|axZdEU{(m$h-DDh|6y=|Ey7PQJH1=hsl#!5%C^Xxdk=3|=2t1GRZ*hF zenIGqd)dZ0CmgzN#y-1MwX1ou=HZ)bH~yDl3*=sZce_EGsvu)_HRG`hs?*r}^?%>F zu_t5-!||K5u`_$Jx7qQGtC)YUuNrbXYL?RZ0aqrbT4+BaYSrp?$s%XW{*M9+y2 zSA{ZaU5#>aVQH%4kCR!lY~6E7EjBi_6|EM*Y#DZ3hqoo1y%);NA-%G{VB`M{k5|uX zTl3SCO+nR`YtBL2_p#=j!ckWed2TW)s4e`%)M#+P?$-AZ<4@N<6!PAgca7UPdj1lJ z1;0yp-?#E^kYZnCTw!b)&V0@O0)Mk+Li@dj$IZeaJ0m{2x9Nn*9ni>TbmM){H-X7+ zX5)PE!(}Q=G0au_%9h{#w8tgEVz1)K%Z!VjCQIF#^yF!H?KWpu6(w82XSwWO7BT;L z@YvZq^}f~%hLQ&3Ij=p_WEWK3Y5z7S#-d@ph~&J*wmc5|8FmVny%G16%mk(v)e_f; zl9a@fRIB8oR3OD*WME{dYhbKvWE5g(Vr6JxWo)2rU|?ln@bhF6D1jj~{ literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/WatchingTV_128x64/frame_04.png b/assets/icons/Animations/WatchingTV_128x64/frame_04.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ea47e5cb4e2cd2681d6f3886da832f5084dc21 GIT binary patch literal 830 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYFKz8clA?0%0CD>pHpobRvJ3Frf!C~v(pdx z{bC2=1MU8EEZHyP^y&JuIXl=r8B4yek9u9f$QkeO?1u6@8Nq$&Ypt1CKA3XNnf%=F zrxa`7SJoK03I7#;8#?`GixK=NeZl%>c&Fh%hNN-_uMf-&`+1^{%z3il-olUt7iXHb zp71n&!doD+J#TJ;o&EwVg-3-R4b^pXnD#Vwvwhd75ZQLQ_I#`x-*K-Q&J58kt7G>j z-FDy%=s&R3GLF&p+pP6huWk^n=oNhSDfREX<0rQ|f2pd96jf_yfA;Cnu1!Tg+*0?e zc221Dz47MJvNN})g;!qLC!+JC@|jQdvuD=2&p(AFd<~LrlfF4C$n`8|k6KN*cvAbB z*ypSfiY}U_h2CL$hd8fX%Pe|e8t8sm{qwVrOg|5~u$?-VBJY|QY0!SfrQrmt+>_bc zEY|!u(dM@&U=o|02@B71rr?e_=kI@t5jNf9@@|#D+P6oRoNEwHU^Q51({?beW!q9;^0w4m(fSM9Hhwh+ex*~EpTb$o z4l(|nB|K?0<0i`{CYy-|j*DFQbXAZ)f_MG9mV{u7*1OVkYzd*z)cinB2#&8uL2DlTC%$CsE%2x9F5F2TbKp-Q2mM(f!C8<`)MX5lF!N|bKP}jg%*T^Wu(8S8nz{=P_+rYrez~JY} yBv4{QXvob^$xN#RX)w?=Fw-?O3o$UVGBO0}foRY#61V`=z~JfX=d#Wzp$P!OLPg>L literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/WatchingTV_128x64/frame_05.png b/assets/icons/Animations/WatchingTV_128x64/frame_05.png new file mode 100644 index 0000000000000000000000000000000000000000..15fa1601176f34c59b5fd8eff7567234655ddcab GIT binary patch literal 830 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYF5`J8Igu+q@UHFYz@ot=Kj z?-x4|A87ZVW66FQr%%_P&Dp{3$yoAzebnm;M$UMLXE&7R$q4RCUu(_G^1+mA&gAEY zKc!gvzOu&1P57_)+tBGhTa4gG=?m63!#fTCF(j2cczs}I*v}JnWX_WX_ZEgMxH!|a z^@OMK6W#)m?Rj$(?DQ8{DLg9lXsE86!?dTdo9(+sg~+zcwdZ5q_>OzcaAt^RSslAK z>9zxBK>vZImT`=(-)619dUb*e#gp34 z#6D+@P;}8WE%Xl4JH&bAT4vD$(?Ivj>Ytx|Wcqo?h3(X_6nWRgNQ3q(E)6GG<(|ym zX0hhSi8jAI0h8F|Ojvl9GX;0dIe-6CjIik*mv^fK*1kQm6VW+Ai(4p0D)w(+Yu@GG6N{1nbw zc8KxsEa6G388=xrG1*K!a9rfVr>lbe5xnc)wIl>vwBD7TW5e?xN^b2!AHR8JS6&x- zwHt_Mb{fpu$Ch{Jz~nxD)tJ{Io@^@2K8f=FzeT5fIbbS(>gLW3js73Fo^QP*dceMV zeIwK12rfHd+EFcWjVMV;EJ?LWE=mPb3`Pb(gLPKtTN@iLmNP~f{ftjwMS%`s=m64&9kr70LSrVHRPy>UftDnm{r-UW|bb?0i literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/WatchingTV_128x64/frame_rate b/assets/icons/Animations/WatchingTV_128x64/frame_rate new file mode 100644 index 00000000..9a037142 --- /dev/null +++ b/assets/icons/Animations/WatchingTV_128x64/frame_rate @@ -0,0 +1 @@ +10 \ No newline at end of file diff --git a/assets/icons/Animations/Wink_128x64/frame_01.png b/assets/icons/Animations/Wink_128x64/frame_01.png new file mode 100644 index 0000000000000000000000000000000000000000..3eff7d9a840f8db9955c16e2475c0dda3c2d6b68 GIT binary patch literal 674 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYKY>iP;6q=`uh) zjh-%!As)xyPI1g*R^)Nb<@}~_u(rqLTgajB`@M1%vW#b(QJSsSH6^2I|9<&n!VUkw zZVyXKs}erGY>|1_y7)Q$h5D@fjx3nZ5_I4y-wz8B$D92d9pyBR6@6N{)p4K={B+p3ur&k8aX z-MI3$D*Mn3BlAq=lz`^d4ieIh-U2Lw3HEI}#7=&e;>@~W&QdaO<(c$}Z^fG&%aqSD zM@@dpRLpO(F4pbv4qu_h#TP%HId)~oCF5=d%|(qLL^9a-THaabv0Cy|8aQel}4tMfJ?mhtC#pWcq4#Lc3KmU=WoyZ-b54=s=-M+OR5UF7nN%3ZiZJr2>W(L&~ z*NBpo#FA92*k oK^hEn4a{^6EkX>;tqcvVOidsfep^U305vdpy85}Sb4q9e08|6@2mk;8 literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Wink_128x64/frame_02.png b/assets/icons/Animations/Wink_128x64/frame_02.png new file mode 100644 index 0000000000000000000000000000000000000000..bfbfecb2988f93504347ee9d713f2f820b0ca5b2 GIT binary patch literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYKY>iPg>i+vY$$ z4W2HJAs)xyPCnRoSb@hSm-C&%!T%OQJ2wmc`M>^+gwR_vi?a)-+v)_Z-XhnQZmjq# zzCQcuz1@3O7KdJxcD=lQUjA!2_L_qW?s671X!lm^w`}=X-!t`-gW`;^~V!`TAK(Pwmglq6<$GO+bqh3oGzk#2J?QaQ*T^4E&>*n(B2=<1-l!ZBJP;`5=;lKrn+4HkC#rZtCc zlDU=R$i}@W@y@d511D!xzH`fp$=T^VLFA%?1*?@~e%tL_iPFhteg*<<4jC+)qB*oy z82>V3TD~?=u2s54Xu@PcX=%k{75j|LoNmsYf6Sc2qh?0Ga3W`_rqXlHT~To|ef1{Z zSsQivp4v2)$jlROXHGn$ls{FR-POZAYUg?Lmq!zSTz<3ha;O9Qp&ZB9rk5YGJKuiT zoV>UD`u*^h*Pp&_wz9pl)Ba69|5qP*E;-I$%uU;semf;_?PFZ?-jiu&So20;^r)7& zMwFx^mZVxG7o`Fz1|tI_LtO)7T_d9qLlY}Q11n<#Z36=<1B0I@lR)u_(2$#-l9^Ts n(qN!#V5Vzm5n^C&WoTq&U;@z)@qW#7paup{S3j3^P64Es+ literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Wink_128x64/frame_03.png b/assets/icons/Animations/Wink_128x64/frame_03.png new file mode 100644 index 0000000000000000000000000000000000000000..6e63bff72cadb3c93e06408c82a70cf09b493df7 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYKY>DP!S$W}vee zt2|vCLp+YZo$T0mSb@him-Brm%lAUnP0NMu{MSmJ9b(M6EVAVCQH8BukIsKT{FCuV z{Qa#(@8{mXvT@am-bF9t&!4vPY+f$0WvYWz%O!^IuEJBE-wsoh?%Le+$7^LkrLQ8N z&zu5X4eKopFPv^{(^XbBIDI09B~f8zvg)yy8!pNOG4zQn_4+Ilz!vH`#q+przrBs>%(|e)B7Gz|raPxjQLW;W#e(TN z3t#AN+UQ|&K+r>_a?7c`l}&j~OFH zm1msna?wP)Wm3b9q{qrR(N(oZc1=&FwtZxB6p}yw)M18GB-iKF&FiMAw?FPo^VF4_ z>|9y8p-{k&kG<)vlD(E6U)O}bElKk6mrfr1lQ?JN;ZO$lLl#ZDT&_PnpLG9W`SCw` z=e~!xyk7JxQa10^jr?!hXIHiHvuZ|w~LYGCkm^>bP0l+XkK)YkjS literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Wink_128x64/frame_04.png b/assets/icons/Animations/Wink_128x64/frame_04.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3c4f232f7f62663e8b3b17fdd78534f08712e3 GIT binary patch literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYKY>DGTG*?{|TE z8a!PbLp+YZ4R-81tiZEHb%!wLzsFu*&UyX#A0K&J<(Aouq8q2>t_4L)@f$bKWcYLa z{;ES~zAWtbb(9x~-M>TUcOc8YmIdn>lmxQaYxGa= zuQ&W^kqbC7Bc1zLzytvgS2g8>5?NF1>Ms8Lzjcz~6NV{C`y}o!Z!lUR#yWFqospwJ zshGz>kyEk?JvS>-f;Ktq+0(oebe=blYidD+fbWyVtUg) zu{)=a1h`+*?KN5S@!SMAwKp7+N`5>n%71=!-zZ2jU|w{g?dZ&hR!;Kn9D2=)$1EqG z{}B8=Gma`3k`WyfN literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Wink_128x64/frame_05.png b/assets/icons/Animations/Wink_128x64/frame_05.png new file mode 100644 index 0000000000000000000000000000000000000000..42cfee7b6573af8d02080ba36cb1807d919339e8 GIT binary patch literal 674 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYKY>Dc3XKTepCE z8a-VcLp+YZoqVwGumX=uF6TR!rvHViRq3if{>R_k=(#1gq3FhGIkA#{jpj@(L|` zzBL_+(WF}s}ILM?-SV}Vmp1eLI%f0;d{4=FYs`*{WTDOD(lbFq;^WZ z?9=AMP6ZpzDl9+8^1@jx^{JpE>n#nzcbrCo6??TW3aN1jWV~~h&oyQ#T4|ot%HU|f zS(NE`hx^-;tWJFu$~ivIIF1Ycd1>l?U{71!R)+&e=5K$_G2{C2%BwyHN((x|oA!yV zU3O6Md*t@aDRxrt`4*nvm8&@E`9a4O{QLhIiOb3GFmNta?&G^ImUX{rw$+S9?~TvM z)?M2>d-~z6Ho0LpuavXx`?GFdS?R*wgy84f1h@R!`EI%KUoQjE8s_3cmxp|(q(CV{ zwZt`|BqgyV)hf9t6-Y4{85kMr8W`&u8HE^{SQ#2v85?LD7+4t?{5+Wiico}x-29Zx qv`UZ$16>0%T|8)760*7(8A5T-G@yGywpJ(EuR; literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Wink_128x64/frame_06.png b/assets/icons/Animations/Wink_128x64/frame_06.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf84a0a0b4c94da3b2cad2096423c4bc43c823b GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYKY>sbG$Vuo+NK zm8Xkih{y4_lO6jGEAY7Ha=!0m`Ch2HX}Qpy|60kjLyS3>MV4GXs<74T(fRL(e=`1v zzrVHU{oMOkHm-WnyXa;7`O{XO&C4aWOm&cIxy10@Rd~wt+hK~*U7MT!c&!Ym^i|~Z znNy&vVZEi{h0~2~y2{E1r%%MNBr2>-Rz3D|!$p}OhCY#{UY|t**g`$0cpkTH-0)72 zi7(>n+h5mO3}^QHa9w$z#bK5u=<3KaqhIjgx3^K9Sr^n;q>m)Wbm!D5s#SclSTJ2@ z;S1eO8$C=82zsbgZaKBLvMH}=Ne3SjOGx}R&Pmem9DYriU0NXEvcQx(<-34F%G=eV z@{E&RE}Ce!Olr81^jJA3x~kU5uIb6twvSAXLh{F-I?Qm26bkt9u{WJnve)wC>zdHFB}qR1(#eB=66b6@9Lm6c$f9YN%k_unlkPt(KmJGW z-1qR7*Nc8d%I3Ygk^gP`?5Z|?*6l2R*&6qpn8y)wkl%W>3*(gLNjrcMqgvt`QIe8a zl4_M)lnSI6j0}tnbq$Pljf_GJO{@$Jtc(q`4GgRd41S(W0>vakLvDUbW?CgkgMqGr hnXaKlh=IA4p|O<_R0E^?lkGqa44$rjF6*2UngHjD`$hl& literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Wink_128x64/frame_07.png b/assets/icons/Animations/Wink_128x64/frame_07.png new file mode 100644 index 0000000000000000000000000000000000000000..3da34c70b9519ff48c2972358f647329be1149b0 GIT binary patch literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYKY>sc5$Ab$y_o z22U5q5Rc<;Cp-2XR^V~XJ^7}S<$IyZrsb1%{trE7*11f0LFAbW2>i~foXH>cU@6-sp$tYXrV5>|1$Othaor45bNr>b)aj{dt5v~+ zmTX5$2ac@~*~(4UDJd-5l$beoI&;oCE~&CEKjA%7sn5H`b1$)Ot3JH4SiK`+_1)943wnCmCd~dClgY-irP8t7@ZQH`7q-34 ziQ4`1Wa>+^&N_*&vv^o1a&`2Iy0Zx9Op-SI#z4XlcsoSb2A=h)MgRB za_^ia)3VqN?_(6EL@ez;DU*16TS3)X!BdVK*NbsjeSH4dvgzFGx^=U-1K8S2LN{Dr zha2l2>#*aPXi+?vJeyO{h2G_*(w+&y@5E0h=cqZ8>JuoNIsSvtQVUHGZm>=X%jYx~qZF zqgvt`QIe8al4_M)lnSI6j0}tnbq$Pljf_GJO{@$Jtc(q`4GgRd41S(W0>vjnLvDUb qW?CgkgMqGrnXaKlh=IA4p|O>*8AQW6+l#_L4Gf;HelF{r5}E*VQ399% literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Wink_128x64/frame_08.png b/assets/icons/Animations/Wink_128x64/frame_08.png new file mode 100644 index 0000000000000000000000000000000000000000..7c4a31c0072f361266389c8298a2267fa1b468e6 GIT binary patch literal 677 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`#0(_Y@0k7uNU@|l`Z_W&Z0zU$lgJ9>D{XE)7O>#DYKY>sch=Jcv+yH z7Ec$)5Rc<;Cp-2XR^V~X<@}~_uvVt?&B~Vd^;0+cE_%tL(S7qwlFnA&*Yp3&_i=xS zuU~Cse7W5&Otdz@r1tTiH`SaKosQ9*DhH;rRp>bd)b($4GMnOQSvfUm;iXwlGADu$ zZCx(1uZT~KJHl1v^ce_#kO%;Qwpari{ObBcNcE|#Pd*S z&IYF)EVpJVCj>P{>I-;H*tYhhjN-9^+|Nu4=jeS|&Fa*1{Oe~K$8TSEth>Q-gRQ+p z{l)#JXgL|L`=z(tHvO%%XxaC=tc696ojvu+)9e06x|*9AJ)GWlEIwS@a;^WtGQMRm zp7Rv9zpwK9T(;x%;bpIu?Kl4Lwfyg%*TOk0v+X{)9e7)O-@p9V+yt#3OpoKdIsCqd zX#=B3wZt`|BqgyV)hf9t6-Y4{85kMr8W`&u8HE^{SQ#2v85?LD7+4t?{5+Wiic^G! t-29Zxv`UZ$16>0%T|D{XE)7O>#DYKY>snX>iMG8PY zjh-%!As)xyPI1g*R^)Nb<@}~_u(rqLTgajB`@M1%vW#b(QJSsSH6^2I|9<&n!VUkw zZVyXKs}erGY>|1_y7)Q$h5D@fjx3nZ5_I4y-wz8B$D92d9pyBR6@6N{)p4K={B+p3ur&k8aX z-MI3$D*Mn3BlAq=lz`^d4ieIh-U2Lw3HEI}#7=&e;>@~W&QdaO<(c$}Z^fG&%aqSD zM@@dpRLpO(F4pbv4qu_h#TP%HId)~oCF5=d%|(qLL^9a-THaabv0Cy|8aQel}4tMfJ?mhtC#pWcq4#Lc3KmU=WoyZ-b54=s=-M+OR5UF7nN%3ZiZJr2>W(L&~ z*NBpo#FA92*k mK^hEn4a{^6EkX>;tw4H=AR2ykzhnVwVDNPHb6Mw<&;$T@lJ+?O literal 0 HcmV?d00001 diff --git a/assets/icons/Animations/Wink_128x64/frame_rate b/assets/icons/Animations/Wink_128x64/frame_rate new file mode 100644 index 00000000..9a037142 --- /dev/null +++ b/assets/icons/Animations/Wink_128x64/frame_rate @@ -0,0 +1 @@ +10 \ No newline at end of file diff --git a/assets/icons/Dolphin/BigBurger_24x24.png b/assets/icons/Dolphin/BigBurger_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..5533147ced1b94e4aaeb6bdd1ba5df51a8872b0c GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY7Bp6QcFoXgrmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5yxS$b1jyqo z@Q5sCVBi)4Va7{$>;3=**-JcqUD=;93vvl+S}q9@1PX%*q1XMk4n1#}(3p4;FkVFh2bE|NeuI6e`)i zvGc4BD>L%po>z z40R2Rbq&o!3=OOd&8$pKv<(cb3=H&pFKeS{$jwj5OsmALA?`xNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5yxS$b1jyqo z@Q5sCVBi)4Va7{$>;3=**-JcqUD=;93vvl6I8?mZ3KVknba4#fxSssu{-5~|>)+P5 z)&Dmz^pMf1mu-~i*kHV8|G&8p=N-szvu3)=Q!SAt`OWxW>WcsW`x#lBoSh}Mgso+| z?7+aFbkfj2_*S$x&_LA^*NBpo#FA921Gb mWnkdXe+T48gofPwl+3hB+#2kHQg#A0FnGH9xvXNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5yxS$b1jyqo z@Q5sCVBi)4Va7{$>;3=**-JcqUD=;93vvmHik;S&1{8Alba4#fxSssu{~!Cq|8G0& z5$~Ap^f8VjFCigi#sB~P3mH0uxn@WRy%H=rsBYcnwV>i@yK}UftDnm{r-UW|^?_ml literal 0 HcmV?d00001 diff --git a/assets/icons/Dolphin/DolphinOkay_41x43.png b/assets/icons/Dolphin/DolphinOkay_41x43.png new file mode 100644 index 0000000000000000000000000000000000000000..52cc98b1dca4bf82dc8ac46dc94ff2e98a0cabb1 GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^nn0}02qYNJUY-*Gq*&4&eH|GXHuiJ>Nn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9f$?sa@Dd=8 zy~NYkmHjER7_Yc77mLb8pwN0x7sn8Z%dQs``3@O~usskzBgB(cC3jemZTXCr2*)FVYAVZ_P96h zw>Y{>TaHE@a+~_7_^Bk*?ixXje5v#V1F8BKo2vZSCYt45bDP46hOx7_4S6Fo+k-*%fF5lwb?+332`3$_r$kI{y_U z!kFak?!wT)D(eB{u$OrHy0SlI78GHy`cb`ODNxAX)5S4_<9f0|Lc;;xfDDG^x)Lc8 zKO}BQPLXVp+;MS%L9-AuH#2)PLo=fo$HklH3T7zIJUAoKXo^@`LRtbFgX$yRge%I& zl7L33mbgZgq$HN4S|t~y0x1R~10zFS17lr7^AJNzD^p7=Lt||N11kfA73v3fplHa= gPsvQHMAu+pWn>1?@QUB64yb{_)78&qol`;+08E-#Jpcdz literal 0 HcmV?d00001 diff --git a/assets/icons/Interface/DoorLocked_10x56.png b/assets/icons/Interface/DoorLocked_10x56.png new file mode 100644 index 0000000000000000000000000000000000000000..d83d28a84bed43572eed44cb8d8bf27479845af4 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^Ahrb)GmzZ*uCW71v7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaf@tPl)UP|3DT4kUV%> z>l2X0SQ6wH%;50sMjD8d21sKV=r?HDYU?bwC{`6z%Ea7{YPA zw%3ra!GMQZcI8d$DgRp*Rtb* W8AOASiQHtM1_n=8KbLh*2~7Zp&vAYL literal 0 HcmV?d00001 diff --git a/assets/icons/Interface/DoorRight_8x56.png b/assets/icons/Interface/DoorRight_8x56.png new file mode 100644 index 0000000000000000000000000000000000000000..4828ebc67673f11b0a5b3fb97218a5fc3daecd2f GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^96)Tr$P6TZ?bc2OQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEkIR3p@tU>45bDP46hOx7_4S6Fo+k-*%fF5lwb?+32_C||66&Lcg>v$ zWHBarySp%Su*!M>IqW5#zOL*~nFU1{v?raO5e^hG@pN$v;kcf>A-%z&m@S#jn@yU{ zSi`peq0Qmqw(}Jaixz!ai^ TVcQdFpaup{S3j3^P6t}*EEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCjK(#Fl48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!Ib3f?!v%$w@Y{lkjGx) z>Fdh=lv$8VP2}V09VS4b5>FS$5Q)pl7Jub=>B1oktyHq2GDHxyxW z`q$d_C*8neGZ$Ofzw1#y=O_NNY5Dh`_soAuz6DXg5stX6&uUg_7QIe8a zl4_M)lnSI6j0}tnbq$Pl4b4Lg4XljKtxPPm4GgRd3?^%4+o5R4%}>cptHiD0QOV^d Ppaup{S3j3^P6n!epx1JuCa>FVdQ&MBb@0B*5S AEdT%j literal 0 HcmV?d00001 diff --git a/assets/icons/StatusBar/Background_128x11.png b/assets/icons/StatusBar/Background_128x11.png new file mode 100644 index 0000000000000000000000000000000000000000..78ef029ae737fe82080bd709545aff7ccdae948e GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^4M5Dz#0(@)spmQaDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMHK5uS28Lfip@tU>45bDP46hOx7_4S6Fo+k-*%fF5l;8~T332`ZAIM?=k_T^V zeFCx=OM?7@862M7NCR<_yxm_V@sW8a-VcLnJPT z1~~E^P~d1jayNa^|HRIFrW60yr@Gu>&}-W^MJYtBAT;u{K+{9k<&Lvot+tTstUP<| z#4-;3vevG9_gAsjw(zVxqm%MWw{cQe@xAvG?T;szm0Xkxq!^40 zj0|-RjCBnyLkujfOih4D+rYrez+mCd+=VC_a`RI%(<(7Fm>5Dd_?7)q0cv3IboFyt I=akR{0I2AM5dZ)H literal 0 HcmV?d00001 diff --git a/assets/icons/StatusBar/Background_128x8.png b/assets/icons/StatusBar/Background_128x8.png new file mode 100644 index 0000000000000000000000000000000000000000..c71b5a9926da80478b8681bc3df29304709c657e GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^4M5Dn#0(^THp{;SQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiYCyFu3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8U)v6XN>+Kaj-$BoE%! z`UGS#mIV0)GdMiEkp|)p1!W^Pnku9I3*bjXI2A+Vm)0PLnJP@ z_8amYP~c&1cKN1c`k&MJo5Ici|GgHzDVW^;<4MOyjw4S!CZ0H`5H;c1G%MrCnX(co zuOF4l>s=}3jy?6c-HLZ^<3xtum3i;i9Gqaw_EGO}F0=lLw`cjC$_#x?=KYQVTBKUy z8c~vxSdwa$T$Bo=7>o>z40R2Rb&U)|3@xk-EUkp9Z&;mdKI;Vst0G@(#EC2ui literal 0 HcmV?d00001 diff --git a/assets/icons/StatusBar/Battery_26x8.png b/assets/icons/StatusBar/Battery_26x8.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc1b0cd6d93a694ee460f7253bac4fa368285c2 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX#0(^7S+So5QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIC7!;n>`$46IoXB1>;0Aig%mtp978y+ zCkybhHVLq?v9l>8v|MBih+^pFYgpao>z40R2Rbqy^;3@ofnEv-xpwG9lc3=G7b1=gZy$jwj5OsmAyU~B}@5No`9Do_K1 Mr>mdKI;Vst0P~nnl>h($ literal 0 HcmV?d00001 diff --git a/assets/icons/StatusBar/Lock_8x8.png b/assets/icons/StatusBar/Lock_8x8.png new file mode 100644 index 0000000000000000000000000000000000000000..01fb0eb6bf7506d19f5c6e039df0ef0d3272e424 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5l;8~T332`ZAIM?=k_T^V zeFCx=OM?7@862M7NCR<_yxm zF*LUVA`?Sx0|P4qgWh8dPf;}F=BH$)Rbpx|Hi2kZk~Z%-Py>UftDnm{r-UW|;$Ka1 literal 0 HcmV?d00001 diff --git a/assets/icons/StatusBar/PlaceholderL_11x13.png b/assets/icons/StatusBar/PlaceholderL_11x13.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5612798eccf8cd845fa0e2c5e7ab0e7e0dcd5 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^+#og+GmvDOU9$p6v7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaf@tPl)UP|3DT4kUV%> z>l2X0SQ6wH%;50sMjD8d21sKV=r?WYe$ZW=;SK$$PpuhHzX@ zPT(y~5MXd(XA|3F(csvkXkyafXmW*-At##Uab@vA4WLrh64!{5l*E!$tK_0oAjM#0 zU}UIkV61Cs8Dd~zWnyM!Y_4r!U}a$7cX`EO6b-rgDVb@Nm>LYB8fsUIGXXU)c)I$z JtaD0e0s!sVP1pbc literal 0 HcmV?d00001 diff --git a/assets/icons/StatusBar/PlaceholderR_30x13.png b/assets/icons/StatusBar/PlaceholderR_30x13.png new file mode 100644 index 0000000000000000000000000000000000000000..bc1c9367cf87414f9af08a2d9cdab6c50bbe1580 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^av(MnGmtziW5xocSkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YhSC&cyte;|tiNFKbc z^$EygED7=pW^j0RBMrn!@^*J&=wOxg0CLz%Jbhi+pE3(`vZ@^X(y0v;QuTCk4B@z* zoWRS<%*MvZW>CQ3WFW9$iXcNGi$RCenu3Ieo2(4C12|7vf1Yas(oo_WQIe8al4_M) zlnSI6j0}tnbq$Pl4J|_qEUgR-tqe@G4GgRd4C>Tb4x?zu%}>cpt3=meU}b6w(ZHvF RX(CVqgQu&X%Q~loCIEz}PecF! literal 0 HcmV?d00001