From 3ab9112c21f4791da34a175b98700af4785b89e1 Mon Sep 17 00:00:00 2001 From: Albert Kharisov Date: Fri, 26 Nov 2021 16:19:30 +0400 Subject: [PATCH] Fix out of screen drawings (#842) * Fix lock screen menu * Fix pin setup in lock menu * Desktop GUI layer on FS, black status bar * Desktop: fix spelling * Fix first start screen * Fix status bar drawing Co-authored-by: Aleksandr Kutuzov --- applications/desktop/desktop_i.h | 2 + .../desktop/helpers/desktop_animation.c | 26 +++++-- .../desktop/helpers/desktop_animation.h | 6 +- .../desktop/helpers/desktop_animation_i.h | 2 + .../scenes/desktop_scene_hw_mismatch.c | 5 +- .../desktop/scenes/desktop_scene_locked.c | 13 +++- .../desktop/scenes/desktop_scene_main.c | 13 +++- applications/desktop/views/desktop_debug.c | 20 ++--- .../desktop/views/desktop_first_start.c | 29 ++++--- .../desktop/views/desktop_lock_menu.c | 9 ++- applications/desktop/views/desktop_locked.c | 21 ++++-- applications/desktop/views/desktop_locked.h | 6 +- applications/desktop/views/desktop_main.c | 15 +++- applications/desktop/views/desktop_main.h | 6 +- applications/gui/gui.c | 75 ++++++++++--------- applications/gui/gui_i.h | 6 ++ applications/gui/modules/code_input.c | 13 ++-- 17 files changed, 174 insertions(+), 93 deletions(-) diff --git a/applications/desktop/desktop_i.h b/applications/desktop/desktop_i.h index cd1a2c83..a1298cf4 100644 --- a/applications/desktop/desktop_i.h +++ b/applications/desktop/desktop_i.h @@ -25,6 +25,8 @@ #include "desktop/desktop_settings/desktop_settings.h" #include +#define STATUS_BAR_Y_SHIFT 13 + typedef enum { DesktopViewMain, DesktopViewLockMenu, diff --git a/applications/desktop/helpers/desktop_animation.c b/applications/desktop/helpers/desktop_animation.c index 5dc688dc..9ded5c10 100644 --- a/applications/desktop/helpers/desktop_animation.c +++ b/applications/desktop/helpers/desktop_animation.c @@ -214,11 +214,18 @@ void desktop_animation_activate(DesktopAnimation* animation) { } } -static const Icon* desktop_animation_get_current_idle_animation(DesktopAnimation* animation) { - const Icon* active_icon = animation->current->active->icon; - const Icon* basic_icon = animation->current->basic->icon; - return (animation->state == DesktopAnimationStateActive && active_icon) ? active_icon : - basic_icon; +static const Icon* desktop_animation_get_current_idle_animation( + DesktopAnimation* animation, + bool* status_bar_background_black) { + const ActiveAnimation* active = animation->current->active; + const BasicAnimation* basic = animation->current->basic; + if(animation->state == DesktopAnimationStateActive && active->icon) { + *status_bar_background_black = active->black_status_bar; + return active->icon; + } else { + *status_bar_background_black = basic->black_status_bar; + return basic->icon; + } } // Every time somebody starts 'desktop_animation_get_animation()' @@ -227,7 +234,9 @@ static const Icon* desktop_animation_get_current_idle_animation(DesktopAnimation // 3) check if the SD card is empty // 4) if all false - get idle animation -const Icon* desktop_animation_get_animation(DesktopAnimation* animation) { +const Icon* desktop_animation_get_animation( + DesktopAnimation* animation, + bool* status_bar_background_black) { Dolphin* dolphin = furi_record_open("dolphin"); Storage* storage = furi_record_open("storage"); const Icon* icon = NULL; @@ -272,7 +281,10 @@ const Icon* desktop_animation_get_animation(DesktopAnimation* animation) { } if(!icon) { - icon = desktop_animation_get_current_idle_animation(animation); + icon = + desktop_animation_get_current_idle_animation(animation, status_bar_background_black); + } else { + status_bar_background_black = false; } furi_record_close("storage"); diff --git a/applications/desktop/helpers/desktop_animation.h b/applications/desktop/helpers/desktop_animation.h index 677bbb14..740365f8 100644 --- a/applications/desktop/helpers/desktop_animation.h +++ b/applications/desktop/helpers/desktop_animation.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -22,11 +23,13 @@ struct BasicAnimation { uint16_t duration; // sec uint16_t active_cooldown; uint8_t weight; + bool black_status_bar; uint16_t butthurt_level_mask; }; struct ActiveAnimation { const Icon* icon; + bool black_status_bar; uint16_t duration; // sec }; @@ -49,7 +52,8 @@ DesktopAnimationState desktop_animation_handle_right(DesktopAnimation* animation void desktop_animation_start_oneshot_levelup(DesktopAnimation* animation); -const Icon* desktop_animation_get_animation(DesktopAnimation* animation); +const Icon* + desktop_animation_get_animation(DesktopAnimation* animation, bool* status_bar_background_black); const Icon* desktop_animation_get_oneshot_frame(DesktopAnimation* animation); void desktop_start_new_idle_animation(DesktopAnimation* animation); diff --git a/applications/desktop/helpers/desktop_animation_i.h b/applications/desktop/helpers/desktop_animation_i.h index aef8b0d6..c89eba64 100644 --- a/applications/desktop/helpers/desktop_animation_i.h +++ b/applications/desktop/helpers/desktop_animation_i.h @@ -33,6 +33,7 @@ static const ActiveAnimation animation_TV_active = { static const BasicAnimation animation_sleep = { .icon = &A_Sleep_128x51, + .black_status_bar = true, .duration = COMMON_BASIC_DURATION, .weight = COMMON_WEIGHT, .active_cooldown = COMMON_ACTIVE_COOLDOWN, @@ -43,6 +44,7 @@ static const BasicAnimation animation_sleep = { static const ActiveAnimation animation_sleep_active = { .icon = &A_SleepActive_128x51, + .black_status_bar = true, .duration = COMMON_ACTIVE_DURATION(2), }; diff --git a/applications/desktop/scenes/desktop_scene_hw_mismatch.c b/applications/desktop/scenes/desktop_scene_hw_mismatch.c index 16f989a1..7a83d3a8 100644 --- a/applications/desktop/scenes/desktop_scene_hw_mismatch.c +++ b/applications/desktop/scenes/desktop_scene_hw_mismatch.c @@ -19,8 +19,9 @@ void desktop_scene_hw_mismatch_on_enter(void* context) { furi_hal_version_get_hw_target(), version_get_target(NULL)); popup_set_context(popup, desktop); - popup_set_header(popup, "!!!! HW Mismatch !!!!", 60, 14, AlignCenter, AlignCenter); - popup_set_text(popup, buffer, 60, 37, AlignCenter, AlignCenter); + popup_set_header( + popup, "!!!! HW Mismatch !!!!", 60, 14 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter); + popup_set_text(popup, buffer, 60, 37 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter); popup_set_callback(popup, desktop_scene_hw_mismatch_callback); view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewHwMismatch); } diff --git a/applications/desktop/scenes/desktop_scene_locked.c b/applications/desktop/scenes/desktop_scene_locked.c index 3377b2c9..78000acf 100644 --- a/applications/desktop/scenes/desktop_scene_locked.c +++ b/applications/desktop/scenes/desktop_scene_locked.c @@ -25,8 +25,10 @@ void desktop_scene_locked_on_enter(void* context) { desktop_animation_set_animation_changed_callback( desktop->animation, desktop_scene_locked_animation_changed_callback, desktop); - const Icon* icon = desktop_animation_get_animation(desktop->animation); - desktop_locked_set_dolphin_animation(locked_view, icon); + bool status_bar_background_black = false; + const Icon* icon = + desktop_animation_get_animation(desktop->animation, &status_bar_background_black); + desktop_locked_set_dolphin_animation(locked_view, icon, status_bar_background_black); uint32_t state = scene_manager_get_scene_state(desktop->scene_manager, DesktopViewLocked); @@ -81,8 +83,11 @@ bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) { desktop->pincode_buffer.length = 0; break; case DesktopMainEventUpdateAnimation: { - const Icon* icon = desktop_animation_get_animation(desktop->animation); - desktop_locked_set_dolphin_animation(desktop->locked_view, icon); + bool status_bar_background_black = false; + const Icon* icon = + desktop_animation_get_animation(desktop->animation, &status_bar_background_black); + desktop_locked_set_dolphin_animation( + desktop->locked_view, icon, status_bar_background_black); consumed = true; break; } diff --git a/applications/desktop/scenes/desktop_scene_main.c b/applications/desktop/scenes/desktop_scene_main.c index 96278d13..fb77e22c 100644 --- a/applications/desktop/scenes/desktop_scene_main.c +++ b/applications/desktop/scenes/desktop_scene_main.c @@ -54,8 +54,10 @@ void desktop_scene_main_on_enter(void* context) { desktop_animation_activate(desktop->animation); desktop_animation_set_animation_changed_callback( desktop->animation, desktop_scene_main_animation_changed_callback, desktop); - const Icon* icon = desktop_animation_get_animation(desktop->animation); - desktop_main_switch_dolphin_animation(desktop->main_view, icon); + bool status_bar_background_black = false; + const Icon* icon = + desktop_animation_get_animation(desktop->animation, &status_bar_background_black); + desktop_main_switch_dolphin_animation(desktop->main_view, icon, status_bar_background_black); view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewMain); } @@ -92,8 +94,11 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { break; case DesktopMainEventUpdateAnimation: { - const Icon* icon = desktop_animation_get_animation(desktop->animation); - desktop_main_switch_dolphin_animation(desktop->main_view, icon); + bool status_bar_background_black = false; + const Icon* icon = + desktop_animation_get_animation(desktop->animation, &status_bar_background_black); + desktop_main_switch_dolphin_animation( + desktop->main_view, icon, status_bar_background_black); consumed = true; break; } diff --git a/applications/desktop/views/desktop_debug.c b/applications/desktop/views/desktop_debug.c index 3d7946ec..7ccfcd0c 100644 --- a/applications/desktop/views/desktop_debug.c +++ b/applications/desktop/views/desktop_debug.c @@ -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, 9, headers[m->screen]); + canvas_draw_str(canvas, 2, 9 + STATUS_BAR_Y_SHIFT, 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, 19, buffer); + canvas_draw_str(canvas, 5, 19 + STATUS_BAR_Y_SHIFT, buffer); ver = m->screen == DesktopViewStatsBoot ? furi_hal_version_get_bootloader_version() : furi_hal_version_get_firmware_version(); if(!ver) { - canvas_draw_str(canvas, 5, 29, "No info"); + canvas_draw_str(canvas, 5, 29 + STATUS_BAR_Y_SHIFT, "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, 28, buffer); + canvas_draw_str(canvas, 5, 28 + STATUS_BAR_Y_SHIFT, buffer); snprintf( buffer, @@ -64,11 +64,11 @@ void desktop_debug_render(Canvas* canvas, void* model) { "%s [%s]", version_get_githash(ver), version_get_gitbranchnum(ver)); - canvas_draw_str(canvas, 5, 39, buffer); + canvas_draw_str(canvas, 5, 39 + STATUS_BAR_Y_SHIFT, buffer); snprintf( buffer, sizeof(buffer), "[%d] %s", version_get_target(ver), version_get_gitbranch(ver)); - canvas_draw_str(canvas, 5, 50, buffer); + canvas_draw_str(canvas, 5, 50 + STATUS_BAR_Y_SHIFT, buffer); } else { char buffer[64]; @@ -81,7 +81,7 @@ void desktop_debug_render(Canvas* canvas, void* model) { canvas_set_font(canvas, FontSecondary); snprintf(buffer, 64, "Icounter: %ld Butthurt %ld", m->icounter, m->butthurt); - canvas_draw_str(canvas, 5, 19, buffer); + canvas_draw_str(canvas, 5, 19 + STATUS_BAR_Y_SHIFT, buffer); snprintf( buffer, @@ -89,11 +89,11 @@ void desktop_debug_render(Canvas* canvas, void* model) { "Level: %ld To level up: %ld", current_lvl, (remaining == (uint32_t)(-1) ? remaining : 0)); - canvas_draw_str(canvas, 5, 29, buffer); + canvas_draw_str(canvas, 5, 29 + STATUS_BAR_Y_SHIFT, buffer); snprintf(buffer, 64, "%s", asctime(localtime((const time_t*)&m->timestamp))); - canvas_draw_str(canvas, 5, 39, buffer); - canvas_draw_str(canvas, 0, 49, "[< >] icounter value [ok] save"); + canvas_draw_str(canvas, 5, 39 + STATUS_BAR_Y_SHIFT, buffer); + canvas_draw_str(canvas, 0, 49 + STATUS_BAR_Y_SHIFT, "[< >] icounter value [ok] save"); } } diff --git a/applications/desktop/views/desktop_first_start.c b/applications/desktop/views/desktop_first_start.c index c959ca15..21901c95 100644 --- a/applications/desktop/views/desktop_first_start.c +++ b/applications/desktop/views/desktop_first_start.c @@ -27,19 +27,24 @@ static void desktop_first_start_draw(Canvas* canvas, void* model) { const char* my_name = furi_hal_version_get_name_ptr(); if(m->page == 0) { canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart0_70x53); - elements_multiline_text_framed(canvas, 75, 16, "Hey m8,\npress > to\ncontinue"); + elements_multiline_text_framed( + canvas, 75, 16 + STATUS_BAR_Y_SHIFT, "Hey m8,\npress > to\ncontinue"); } else if(m->page == 1) { canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart1_59x53); - elements_multiline_text_framed(canvas, 64, 16, "First Of All,\n... >"); + elements_multiline_text_framed( + canvas, 64, 16 + STATUS_BAR_Y_SHIFT, "First Of All,\n... >"); } else if(m->page == 2) { canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart2_59x51); - elements_multiline_text_framed(canvas, 64, 16, "Thank you\nfor your\nsupport! >"); + elements_multiline_text_framed( + canvas, 64, 16 + STATUS_BAR_Y_SHIFT, "Thank you\nfor your\nsupport! >"); } else if(m->page == 3) { canvas_draw_icon(canvas, width - 57, height - 45, &I_DolphinFirstStart3_57x48); - elements_multiline_text_framed(canvas, 0, 16, "Kickstarter\ncampaign\nwas INSANE! >"); + elements_multiline_text_framed( + canvas, 0, 16 + STATUS_BAR_Y_SHIFT, "Kickstarter\ncampaign\nwas INSANE! >"); } else if(m->page == 4) { canvas_draw_icon(canvas, width - 67, height - 51, &I_DolphinFirstStart4_67x53); - elements_multiline_text_framed(canvas, 0, 13, "Now\nallow me\nto introduce\nmyself >"); + elements_multiline_text_framed( + canvas, 0, 13 + STATUS_BAR_Y_SHIFT, "Now\nallow me\nto introduce\nmyself >"); } else if(m->page == 5) { char buf[64]; snprintf( @@ -50,19 +55,25 @@ static void desktop_first_start_draw(Canvas* canvas, void* model) { my_name ? my_name : "Unknown", ",\ncyberdolphin\nliving in your\npocket >"); canvas_draw_icon(canvas, 0, height - 49, &I_DolphinFirstStart5_54x49); - elements_multiline_text_framed(canvas, 60, 13, buf); + elements_multiline_text_framed(canvas, 60, 13 + STATUS_BAR_Y_SHIFT, buf); } else if(m->page == 6) { canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart6_58x54); elements_multiline_text_framed( - canvas, 63, 13, "I can grow\nsmart'n'cool\nif you use me\noften >"); + canvas, + 63, + 13 + STATUS_BAR_Y_SHIFT, + "I can grow\nsmart'n'cool\nif you use me\noften >"); } else if(m->page == 7) { canvas_draw_icon(canvas, width - 61, height - 51, &I_DolphinFirstStart7_61x51); elements_multiline_text_framed( - canvas, 0, 13, "As long as\nyou read, write\nand emulate >"); + canvas, 0, 13 + STATUS_BAR_Y_SHIFT, "As long as\nyou read, write\nand emulate >"); } else if(m->page == 8) { canvas_draw_icon(canvas, width - 56, height - 51, &I_DolphinFirstStart8_56x51); elements_multiline_text_framed( - canvas, 0, 13, "You can check\nmy level and\nmood in the\nPassport menu"); + canvas, + 0, + 13 + STATUS_BAR_Y_SHIFT, + "You can check\nmy level and\nmood in the\nPassport menu"); } } diff --git a/applications/desktop/views/desktop_lock_menu.c b/applications/desktop/views/desktop_lock_menu.c index 52a8df56..a9794417 100644 --- a/applications/desktop/views/desktop_lock_menu.c +++ b/applications/desktop/views/desktop_lock_menu.c @@ -54,8 +54,8 @@ void desktop_lock_menu_render(Canvas* canvas, void* model) { DesktopLockMenuViewModel* m = model; canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); - canvas_draw_icon(canvas, -57, 0, &I_DoorLeft_70x55); - canvas_draw_icon(canvas, 115, 0, &I_DoorRight_70x55); + canvas_draw_icon(canvas, -57, 0 + STATUS_BAR_Y_SHIFT, &I_DoorLeft_70x55); + canvas_draw_icon(canvas, 116, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55); canvas_set_font(canvas, FontSecondary); for(uint8_t i = 0; i < 3; ++i) { @@ -64,9 +64,10 @@ void desktop_lock_menu_render(Canvas* canvas, void* model) { if(i == 1 && !m->pin_set) str = "Set PIN"; if(m->hint_timeout && m->idx == 2 && m->idx == i) str = "Not implemented"; - canvas_draw_str_aligned(canvas, 64, 13 + (i * 17), AlignCenter, AlignCenter, str); + canvas_draw_str_aligned( + canvas, 64, 9 + (i * 17) + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter, str); - if(m->idx == i) elements_frame(canvas, 15, 5 + (i * 17), 98, 15); + if(m->idx == i) elements_frame(canvas, 15, 1 + (i * 17) + STATUS_BAR_Y_SHIFT, 98, 15); } } diff --git a/applications/desktop/views/desktop_locked.c b/applications/desktop/views/desktop_locked.c index ca15a33f..a4557531 100644 --- a/applications/desktop/views/desktop_locked.c +++ b/applications/desktop/views/desktop_locked.c @@ -17,13 +17,17 @@ void locked_view_timer_callback(void* context) { locked_view->callback(DesktopLockedEventUpdate, locked_view->context); } -void desktop_locked_set_dolphin_animation(DesktopLockedView* locked_view, const Icon* icon) { +void desktop_locked_set_dolphin_animation( + DesktopLockedView* locked_view, + const Icon* icon, + bool status_bar_background_black) { with_view_model( locked_view->view, (DesktopLockedViewModel * model) { if(model->animation) icon_animation_free(model->animation); model->animation = icon_animation_alloc(icon); view_tie_icon_animation(locked_view->view, model->animation); icon_animation_start(model->animation); + model->status_bar_background_black = status_bar_background_black; return true; }); } @@ -95,23 +99,26 @@ void desktop_locked_render(Canvas* canvas, void* model) { canvas_set_color(canvas, ColorBlack); if(!m->animation_seq_end) { - canvas_draw_icon(canvas, m->door_left_x, 0, &I_DoorLeft_70x55); - canvas_draw_icon(canvas, m->door_right_x, 0, &I_DoorRight_70x55); + canvas_draw_icon(canvas, m->door_left_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorLeft_70x55); + canvas_draw_icon(canvas, m->door_right_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55); } if(m->animation && m->animation_seq_end) { - canvas_draw_icon_animation(canvas, 0, 0, m->animation); + if(m->status_bar_background_black) { + canvas_draw_box(canvas, 0, 0, GUI_STATUS_BAR_WIDTH, GUI_STATUS_BAR_HEIGHT); + } + canvas_draw_icon_animation(canvas, 0, 0 + STATUS_BAR_Y_SHIFT, m->animation); } if(now < m->hint_expire_at) { if(!m->animation_seq_end) { canvas_set_font(canvas, FontPrimary); - elements_multiline_text_framed(canvas, 42, 30, "Locked"); + elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Locked"); } else if(!m->pin_lock) { canvas_set_font(canvas, FontSecondary); - canvas_draw_icon(canvas, 13, 2, &I_LockPopup_100x49); - elements_multiline_text(canvas, 65, 20, "To unlock\npress:"); + canvas_draw_icon(canvas, 13, 2 + STATUS_BAR_Y_SHIFT, &I_LockPopup_100x49); + elements_multiline_text(canvas, 65, 20 + STATUS_BAR_Y_SHIFT, "To unlock\npress:"); } } } diff --git a/applications/desktop/views/desktop_locked.h b/applications/desktop/views/desktop_locked.h index 80fe468b..de9b4dcd 100644 --- a/applications/desktop/views/desktop_locked.h +++ b/applications/desktop/views/desktop_locked.h @@ -43,6 +43,7 @@ typedef struct { IconAnimation* animation; uint32_t hint_expire_at; + bool status_bar_background_black; uint8_t scene_num; int8_t door_left_x; int8_t door_right_x; @@ -56,7 +57,10 @@ void desktop_locked_set_callback( DesktopLockedViewCallback callback, void* context); -void desktop_locked_set_dolphin_animation(DesktopLockedView* locked_view, const Icon* icon); +void desktop_locked_set_dolphin_animation( + DesktopLockedView* locked_view, + const Icon* icon, + bool status_bar_background_black); 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); diff --git a/applications/desktop/views/desktop_main.c b/applications/desktop/views/desktop_main.c index 77bb4a6a..fdd9e5b5 100644 --- a/applications/desktop/views/desktop_main.c +++ b/applications/desktop/views/desktop_main.c @@ -22,7 +22,10 @@ void desktop_main_reset_hint(DesktopMainView* main_view) { }); } -void desktop_main_switch_dolphin_animation(DesktopMainView* main_view, const Icon* icon) { +void desktop_main_switch_dolphin_animation( + DesktopMainView* main_view, + const Icon* icon, + bool status_bar_background_black) { with_view_model( main_view->view, (DesktopMainViewModel * model) { if(model->animation) icon_animation_free(model->animation); @@ -30,6 +33,7 @@ void desktop_main_switch_dolphin_animation(DesktopMainView* main_view, const Ico view_tie_icon_animation(main_view->view, model->animation); icon_animation_start(model->animation); model->icon = NULL; + model->status_bar_background_black = status_bar_background_black; return true; }); } @@ -49,15 +53,18 @@ void desktop_main_render(Canvas* canvas, void* model) { DesktopMainViewModel* m = model; uint32_t now = osKernelGetTickCount(); + if(m->status_bar_background_black) { + canvas_draw_box(canvas, 0, 0, GUI_STATUS_BAR_WIDTH, GUI_STATUS_BAR_HEIGHT); + } if(m->icon) { - canvas_draw_icon(canvas, 0, 0, m->icon); + canvas_draw_icon(canvas, 0, 0 + STATUS_BAR_Y_SHIFT, m->icon); } else if(m->animation) { - canvas_draw_icon_animation(canvas, 0, 0, m->animation); + canvas_draw_icon_animation(canvas, 0, 0 + STATUS_BAR_Y_SHIFT, m->animation); } if(now < m->hint_expire_at) { canvas_set_font(canvas, FontPrimary); - elements_multiline_text_framed(canvas, 42, 30, "Unlocked"); + elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Unlocked"); } } diff --git a/applications/desktop/views/desktop_main.h b/applications/desktop/views/desktop_main.h index 7bc8a992..2ee33d5b 100644 --- a/applications/desktop/views/desktop_main.h +++ b/applications/desktop/views/desktop_main.h @@ -32,6 +32,7 @@ typedef struct { IconAnimation* animation; const Icon* icon; uint8_t scene_num; + bool status_bar_background_black; uint32_t hint_expire_at; } DesktopMainViewModel; @@ -43,7 +44,10 @@ 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, const Icon* icon); +void desktop_main_switch_dolphin_animation( + DesktopMainView* main_view, + const Icon* icon, + bool status_bar_background_black); 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); diff --git a/applications/gui/gui.c b/applications/gui/gui.c index f20718ca..5700e642 100644 --- a/applications/gui/gui.c +++ b/applications/gui/gui.c @@ -1,3 +1,4 @@ +#include "gui/canvas.h" #include "gui_i.h" #define TAG "GuiSrv" @@ -53,7 +54,19 @@ void gui_redraw_status_bar(Gui* gui) { canvas_set_orientation(gui->canvas, CanvasOrientationHorizontal); canvas_frame_set( gui->canvas, GUI_STATUS_BAR_X, GUI_STATUS_BAR_Y, GUI_DISPLAY_WIDTH, GUI_STATUS_BAR_HEIGHT); + + /* for support black theme - paint white area and + * draw icon with transparent white color + */ + canvas_set_color(gui->canvas, ColorWhite); + canvas_draw_box(gui->canvas, 1, 1, 9, 7); + canvas_draw_box(gui->canvas, 7, 3, 58, 6); + canvas_draw_box(gui->canvas, 61, 1, 32, 7); + canvas_draw_box(gui->canvas, 89, 3, 38, 6); + canvas_set_color(gui->canvas, ColorBlack); + canvas_set_bitmap_mode(gui->canvas, 1); canvas_draw_icon(gui->canvas, 0, 0, &I_Background_128x11); + canvas_set_bitmap_mode(gui->canvas, 0); // Right side x = GUI_DISPLAY_WIDTH; @@ -66,25 +79,22 @@ void gui_redraw_status_bar(Gui* gui) { if(!width) width = 8; x_used += width; x -= (width + 2); - canvas_frame_set(gui->canvas, x - 3, GUI_STATUS_BAR_Y, width, GUI_STATUS_BAR_HEIGHT); + canvas_frame_set( + gui->canvas, x - 3, GUI_STATUS_BAR_Y, width + 5, GUI_STATUS_BAR_HEIGHT); canvas_set_color(gui->canvas, ColorWhite); - canvas_draw_box(gui->canvas, 1, 1, width + 3, 11); - + canvas_draw_box(gui->canvas, 2, 1, width + 2, 10); 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_draw_rframe( + gui->canvas, 0, 0, canvas_width(gui->canvas), canvas_height(gui->canvas), 1); + canvas_draw_line(gui->canvas, 1, 1, 1, canvas_height(gui->canvas) - 2); + canvas_draw_line( + gui->canvas, + 2, + canvas_height(gui->canvas) - 2, + canvas_width(gui->canvas) - 2, + canvas_height(gui->canvas) - 2); canvas_frame_set( gui->canvas, x, GUI_STATUS_BAR_Y + 2, width, GUI_STATUS_BAR_WORKAREA_HEIGHT); @@ -103,26 +113,23 @@ void gui_redraw_status_bar(Gui* gui) { width = view_port_get_width(view_port); if(!width) width = 8; x_used += width; - canvas_frame_set(gui->canvas, x, GUI_STATUS_BAR_Y, width, GUI_STATUS_BAR_HEIGHT); + + canvas_frame_set( + gui->canvas, 0, GUI_STATUS_BAR_Y, x + width + 5, GUI_STATUS_BAR_HEIGHT); + canvas_draw_rframe( + gui->canvas, 0, 0, canvas_width(gui->canvas), canvas_height(gui->canvas), 1); + canvas_draw_line(gui->canvas, 1, 1, 1, canvas_height(gui->canvas) - 2); + canvas_draw_line( + gui->canvas, + 2, + canvas_height(gui->canvas) - 2, + canvas_width(gui->canvas) - 2, + canvas_height(gui->canvas) - 2); + + canvas_frame_set(gui->canvas, x, GUI_STATUS_BAR_Y, width + 5, 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_draw_box(gui->canvas, 2, 1, width + 2, 10); canvas_set_color(gui->canvas, ColorBlack); canvas_frame_set( @@ -148,7 +155,7 @@ bool gui_redraw_window(Gui* gui) { bool gui_redraw_desktop(Gui* gui) { canvas_set_orientation(gui->canvas, CanvasOrientationHorizontal); - canvas_frame_set(gui->canvas, GUI_WINDOW_X, GUI_WINDOW_Y, GUI_WINDOW_WIDTH, GUI_WINDOW_HEIGHT); + canvas_frame_set(gui->canvas, 0, 0, GUI_DISPLAY_WIDTH, GUI_DISPLAY_HEIGHT); ViewPort* view_port = gui_view_port_find_enabled(gui->layers[GuiLayerDesktop]); if(view_port) { view_port_draw(view_port, gui->canvas); diff --git a/applications/gui/gui_i.h b/applications/gui/gui_i.h index d8e3983b..06784f81 100644 --- a/applications/gui/gui_i.h +++ b/applications/gui/gui_i.h @@ -23,7 +23,13 @@ #define GUI_STATUS_BAR_X 0 #define GUI_STATUS_BAR_Y 0 #define GUI_STATUS_BAR_WIDTH GUI_DISPLAY_WIDTH +/* 0-1 pixels for upper thin frame + * 2-9 pixels for icons (battery, sd card, etc) + * 10-12 pixels for lower bold line */ #define GUI_STATUS_BAR_HEIGHT 13 +/* icon itself area (battery, sd card, etc) excluding frame. + * painted 2 pixels below GUI_STATUS_BAR_X. + */ #define GUI_STATUS_BAR_WORKAREA_HEIGHT 8 #define GUI_WINDOW_X 0 diff --git a/applications/gui/modules/code_input.c b/applications/gui/modules/code_input.c index 62f5118d..9e220d54 100644 --- a/applications/gui/modules/code_input.c +++ b/applications/gui/modules/code_input.c @@ -275,11 +275,14 @@ static void code_input_handle_dpad(CodeInputModel* model, InputKey key) { static void code_input_view_draw_callback(Canvas* canvas, void* _model) { CodeInputModel* model = _model; uint8_t y_offset = 0; - if(!strlen(model->header)) y_offset = 5; canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); - canvas_draw_str(canvas, 2, 9, model->header); + if(model->header && strlen(model->header)) { + canvas_draw_str(canvas, 2, 9, model->header); + } else { + y_offset = 4; + } canvas_set_font(canvas, FontSecondary); @@ -290,7 +293,7 @@ static void code_input_view_draw_callback(Canvas* canvas, void* _model) { model->local_buffer[CodeInputFirst], model->input_length[CodeInputFirst], 6, - 30 - y_offset, + 30 + y_offset, true); break; case CodeInputStateUpdate: @@ -299,14 +302,14 @@ static void code_input_view_draw_callback(Canvas* canvas, void* _model) { model->local_buffer[CodeInputFirst], model->input_length[CodeInputFirst], 6, - 14 - y_offset, + 14 + y_offset, !model->current); code_input_draw_sequence( canvas, model->local_buffer[CodeInputSecond], model->input_length[CodeInputSecond], 6, - 44 - y_offset, + 44 + y_offset, model->current); if(model->current) canvas_draw_str(canvas, 2, 39 - y_offset, "Repeat code");