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 <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									6857b98ecd
								
							
						
					
					
						commit
						3ab9112c21
					
				| @ -25,6 +25,8 @@ | |||||||
| #include "desktop/desktop_settings/desktop_settings.h" | #include "desktop/desktop_settings/desktop_settings.h" | ||||||
| #include <gui/icon.h> | #include <gui/icon.h> | ||||||
| 
 | 
 | ||||||
|  | #define STATUS_BAR_Y_SHIFT 13 | ||||||
|  | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|     DesktopViewMain, |     DesktopViewMain, | ||||||
|     DesktopViewLockMenu, |     DesktopViewLockMenu, | ||||||
|  | |||||||
| @ -214,11 +214,18 @@ void desktop_animation_activate(DesktopAnimation* animation) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static const Icon* desktop_animation_get_current_idle_animation(DesktopAnimation* animation) { | static const Icon* desktop_animation_get_current_idle_animation( | ||||||
|     const Icon* active_icon = animation->current->active->icon; |     DesktopAnimation* animation, | ||||||
|     const Icon* basic_icon = animation->current->basic->icon; |     bool* status_bar_background_black) { | ||||||
|     return (animation->state == DesktopAnimationStateActive && active_icon) ? active_icon : |     const ActiveAnimation* active = animation->current->active; | ||||||
|                                                                               basic_icon; |     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()'
 | // 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
 | // 3) check if the SD card is empty
 | ||||||
| // 4) if all false - get idle animation
 | // 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"); |     Dolphin* dolphin = furi_record_open("dolphin"); | ||||||
|     Storage* storage = furi_record_open("storage"); |     Storage* storage = furi_record_open("storage"); | ||||||
|     const Icon* icon = NULL; |     const Icon* icon = NULL; | ||||||
| @ -272,7 +281,10 @@ const Icon* desktop_animation_get_animation(DesktopAnimation* animation) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if(!icon) { |     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"); |     furi_record_close("storage"); | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include <stdbool.h> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <gui/icon.h> | #include <gui/icon.h> | ||||||
| 
 | 
 | ||||||
| @ -22,11 +23,13 @@ struct BasicAnimation { | |||||||
|     uint16_t duration; // sec
 |     uint16_t duration; // sec
 | ||||||
|     uint16_t active_cooldown; |     uint16_t active_cooldown; | ||||||
|     uint8_t weight; |     uint8_t weight; | ||||||
|  |     bool black_status_bar; | ||||||
|     uint16_t butthurt_level_mask; |     uint16_t butthurt_level_mask; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct ActiveAnimation { | struct ActiveAnimation { | ||||||
|     const Icon* icon; |     const Icon* icon; | ||||||
|  |     bool black_status_bar; | ||||||
|     uint16_t duration; // sec
 |     uint16_t duration; // sec
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -49,7 +52,8 @@ DesktopAnimationState desktop_animation_handle_right(DesktopAnimation* animation | |||||||
| 
 | 
 | ||||||
| void desktop_animation_start_oneshot_levelup(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); | const Icon* desktop_animation_get_oneshot_frame(DesktopAnimation* animation); | ||||||
| 
 | 
 | ||||||
| void desktop_start_new_idle_animation(DesktopAnimation* animation); | void desktop_start_new_idle_animation(DesktopAnimation* animation); | ||||||
|  | |||||||
| @ -33,6 +33,7 @@ static const ActiveAnimation animation_TV_active = { | |||||||
| 
 | 
 | ||||||
| static const BasicAnimation animation_sleep = { | static const BasicAnimation animation_sleep = { | ||||||
|     .icon = &A_Sleep_128x51, |     .icon = &A_Sleep_128x51, | ||||||
|  |     .black_status_bar = true, | ||||||
|     .duration = COMMON_BASIC_DURATION, |     .duration = COMMON_BASIC_DURATION, | ||||||
|     .weight = COMMON_WEIGHT, |     .weight = COMMON_WEIGHT, | ||||||
|     .active_cooldown = COMMON_ACTIVE_COOLDOWN, |     .active_cooldown = COMMON_ACTIVE_COOLDOWN, | ||||||
| @ -43,6 +44,7 @@ static const BasicAnimation animation_sleep = { | |||||||
| 
 | 
 | ||||||
| static const ActiveAnimation animation_sleep_active = { | static const ActiveAnimation animation_sleep_active = { | ||||||
|     .icon = &A_SleepActive_128x51, |     .icon = &A_SleepActive_128x51, | ||||||
|  |     .black_status_bar = true, | ||||||
|     .duration = COMMON_ACTIVE_DURATION(2), |     .duration = COMMON_ACTIVE_DURATION(2), | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -19,8 +19,9 @@ void desktop_scene_hw_mismatch_on_enter(void* context) { | |||||||
|         furi_hal_version_get_hw_target(), |         furi_hal_version_get_hw_target(), | ||||||
|         version_get_target(NULL)); |         version_get_target(NULL)); | ||||||
|     popup_set_context(popup, desktop); |     popup_set_context(popup, desktop); | ||||||
|     popup_set_header(popup, "!!!! HW Mismatch !!!!", 60, 14, AlignCenter, AlignCenter); |     popup_set_header( | ||||||
|     popup_set_text(popup, buffer, 60, 37, AlignCenter, AlignCenter); |         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); |     popup_set_callback(popup, desktop_scene_hw_mismatch_callback); | ||||||
|     view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewHwMismatch); |     view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewHwMismatch); | ||||||
| } | } | ||||||
|  | |||||||
| @ -25,8 +25,10 @@ void desktop_scene_locked_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     desktop_animation_set_animation_changed_callback( |     desktop_animation_set_animation_changed_callback( | ||||||
|         desktop->animation, desktop_scene_locked_animation_changed_callback, desktop); |         desktop->animation, desktop_scene_locked_animation_changed_callback, desktop); | ||||||
|     const Icon* icon = desktop_animation_get_animation(desktop->animation); |     bool status_bar_background_black = false; | ||||||
|     desktop_locked_set_dolphin_animation(locked_view, icon); |     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); |     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; |             desktop->pincode_buffer.length = 0; | ||||||
|             break; |             break; | ||||||
|         case DesktopMainEventUpdateAnimation: { |         case DesktopMainEventUpdateAnimation: { | ||||||
|             const Icon* icon = desktop_animation_get_animation(desktop->animation); |             bool status_bar_background_black = false; | ||||||
|             desktop_locked_set_dolphin_animation(desktop->locked_view, icon); |             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; |             consumed = true; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -54,8 +54,10 @@ void desktop_scene_main_on_enter(void* context) { | |||||||
|     desktop_animation_activate(desktop->animation); |     desktop_animation_activate(desktop->animation); | ||||||
|     desktop_animation_set_animation_changed_callback( |     desktop_animation_set_animation_changed_callback( | ||||||
|         desktop->animation, desktop_scene_main_animation_changed_callback, desktop); |         desktop->animation, desktop_scene_main_animation_changed_callback, desktop); | ||||||
|     const Icon* icon = desktop_animation_get_animation(desktop->animation); |     bool status_bar_background_black = false; | ||||||
|     desktop_main_switch_dolphin_animation(desktop->main_view, icon); |     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); |     view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewMain); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -92,8 +94,11 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { | |||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
|         case DesktopMainEventUpdateAnimation: { |         case DesktopMainEventUpdateAnimation: { | ||||||
|             const Icon* icon = desktop_animation_get_animation(desktop->animation); |             bool status_bar_background_black = false; | ||||||
|             desktop_main_switch_dolphin_animation(desktop->main_view, icon); |             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; |             consumed = true; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -25,7 +25,7 @@ void desktop_debug_render(Canvas* canvas, void* model) { | |||||||
| 
 | 
 | ||||||
|     canvas_set_color(canvas, ColorBlack); |     canvas_set_color(canvas, ColorBlack); | ||||||
|     canvas_set_font(canvas, FontPrimary); |     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); |     canvas_set_font(canvas, FontSecondary); | ||||||
| 
 | 
 | ||||||
|     if(m->screen != DesktopViewStatsMeta) { |     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_body(), | ||||||
|             furi_hal_version_get_hw_connect(), |             furi_hal_version_get_hw_connect(), | ||||||
|             my_name ? my_name : "Unknown"); |             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() : |         ver = m->screen == DesktopViewStatsBoot ? furi_hal_version_get_bootloader_version() : | ||||||
|                                                   furi_hal_version_get_firmware_version(); |                                                   furi_hal_version_get_firmware_version(); | ||||||
| 
 | 
 | ||||||
|         if(!ver) { |         if(!ver) { | ||||||
|             canvas_draw_str(canvas, 5, 29, "No info"); |             canvas_draw_str(canvas, 5, 29 + STATUS_BAR_Y_SHIFT, "No info"); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -56,7 +56,7 @@ void desktop_debug_render(Canvas* canvas, void* model) { | |||||||
|             "%s [%s]", |             "%s [%s]", | ||||||
|             version_get_version(ver), |             version_get_version(ver), | ||||||
|             version_get_builddate(ver)); |             version_get_builddate(ver)); | ||||||
|         canvas_draw_str(canvas, 5, 28, buffer); |         canvas_draw_str(canvas, 5, 28 + STATUS_BAR_Y_SHIFT, buffer); | ||||||
| 
 | 
 | ||||||
|         snprintf( |         snprintf( | ||||||
|             buffer, |             buffer, | ||||||
| @ -64,11 +64,11 @@ void desktop_debug_render(Canvas* canvas, void* model) { | |||||||
|             "%s [%s]", |             "%s [%s]", | ||||||
|             version_get_githash(ver), |             version_get_githash(ver), | ||||||
|             version_get_gitbranchnum(ver)); |             version_get_gitbranchnum(ver)); | ||||||
|         canvas_draw_str(canvas, 5, 39, buffer); |         canvas_draw_str(canvas, 5, 39 + STATUS_BAR_Y_SHIFT, buffer); | ||||||
| 
 | 
 | ||||||
|         snprintf( |         snprintf( | ||||||
|             buffer, sizeof(buffer), "[%d] %s", version_get_target(ver), version_get_gitbranch(ver)); |             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 { |     } else { | ||||||
|         char buffer[64]; |         char buffer[64]; | ||||||
| @ -81,7 +81,7 @@ void desktop_debug_render(Canvas* canvas, void* model) { | |||||||
| 
 | 
 | ||||||
|         canvas_set_font(canvas, FontSecondary); |         canvas_set_font(canvas, FontSecondary); | ||||||
|         snprintf(buffer, 64, "Icounter: %ld  Butthurt %ld", m->icounter, m->butthurt); |         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( |         snprintf( | ||||||
|             buffer, |             buffer, | ||||||
| @ -89,11 +89,11 @@ void desktop_debug_render(Canvas* canvas, void* model) { | |||||||
|             "Level: %ld  To level up: %ld", |             "Level: %ld  To level up: %ld", | ||||||
|             current_lvl, |             current_lvl, | ||||||
|             (remaining == (uint32_t)(-1) ? remaining : 0)); |             (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))); |         snprintf(buffer, 64, "%s", asctime(localtime((const time_t*)&m->timestamp))); | ||||||
|         canvas_draw_str(canvas, 5, 39, buffer); |         canvas_draw_str(canvas, 5, 39 + STATUS_BAR_Y_SHIFT, buffer); | ||||||
|         canvas_draw_str(canvas, 0, 49, "[< >] icounter value   [ok] save"); |         canvas_draw_str(canvas, 0, 49 + STATUS_BAR_Y_SHIFT, "[< >] icounter value   [ok] save"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -27,19 +27,24 @@ static void desktop_first_start_draw(Canvas* canvas, void* model) { | |||||||
|     const char* my_name = furi_hal_version_get_name_ptr(); |     const char* my_name = furi_hal_version_get_name_ptr(); | ||||||
|     if(m->page == 0) { |     if(m->page == 0) { | ||||||
|         canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart0_70x53); |         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) { |     } else if(m->page == 1) { | ||||||
|         canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart1_59x53); |         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) { |     } else if(m->page == 2) { | ||||||
|         canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart2_59x51); |         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) { |     } else if(m->page == 3) { | ||||||
|         canvas_draw_icon(canvas, width - 57, height - 45, &I_DolphinFirstStart3_57x48); |         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) { |     } else if(m->page == 4) { | ||||||
|         canvas_draw_icon(canvas, width - 67, height - 51, &I_DolphinFirstStart4_67x53); |         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) { |     } else if(m->page == 5) { | ||||||
|         char buf[64]; |         char buf[64]; | ||||||
|         snprintf( |         snprintf( | ||||||
| @ -50,19 +55,25 @@ static void desktop_first_start_draw(Canvas* canvas, void* model) { | |||||||
|             my_name ? my_name : "Unknown", |             my_name ? my_name : "Unknown", | ||||||
|             ",\ncyberdolphin\nliving in your\npocket >"); |             ",\ncyberdolphin\nliving in your\npocket >"); | ||||||
|         canvas_draw_icon(canvas, 0, height - 49, &I_DolphinFirstStart5_54x49); |         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) { |     } else if(m->page == 6) { | ||||||
|         canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart6_58x54); |         canvas_draw_icon(canvas, 0, height - 51, &I_DolphinFirstStart6_58x54); | ||||||
|         elements_multiline_text_framed( |         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) { |     } else if(m->page == 7) { | ||||||
|         canvas_draw_icon(canvas, width - 61, height - 51, &I_DolphinFirstStart7_61x51); |         canvas_draw_icon(canvas, width - 61, height - 51, &I_DolphinFirstStart7_61x51); | ||||||
|         elements_multiline_text_framed( |         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) { |     } else if(m->page == 8) { | ||||||
|         canvas_draw_icon(canvas, width - 56, height - 51, &I_DolphinFirstStart8_56x51); |         canvas_draw_icon(canvas, width - 56, height - 51, &I_DolphinFirstStart8_56x51); | ||||||
|         elements_multiline_text_framed( |         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"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -54,8 +54,8 @@ void desktop_lock_menu_render(Canvas* canvas, void* model) { | |||||||
|     DesktopLockMenuViewModel* m = model; |     DesktopLockMenuViewModel* m = model; | ||||||
|     canvas_clear(canvas); |     canvas_clear(canvas); | ||||||
|     canvas_set_color(canvas, ColorBlack); |     canvas_set_color(canvas, ColorBlack); | ||||||
|     canvas_draw_icon(canvas, -57, 0, &I_DoorLeft_70x55); |     canvas_draw_icon(canvas, -57, 0 + STATUS_BAR_Y_SHIFT, &I_DoorLeft_70x55); | ||||||
|     canvas_draw_icon(canvas, 115, 0, &I_DoorRight_70x55); |     canvas_draw_icon(canvas, 116, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55); | ||||||
|     canvas_set_font(canvas, FontSecondary); |     canvas_set_font(canvas, FontSecondary); | ||||||
| 
 | 
 | ||||||
|     for(uint8_t i = 0; i < 3; ++i) { |     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(i == 1 && !m->pin_set) str = "Set PIN"; | ||||||
|         if(m->hint_timeout && m->idx == 2 && m->idx == i) str = "Not implemented"; |         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); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,13 +17,17 @@ void locked_view_timer_callback(void* context) { | |||||||
|     locked_view->callback(DesktopLockedEventUpdate, locked_view->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( |     with_view_model( | ||||||
|         locked_view->view, (DesktopLockedViewModel * model) { |         locked_view->view, (DesktopLockedViewModel * model) { | ||||||
|             if(model->animation) icon_animation_free(model->animation); |             if(model->animation) icon_animation_free(model->animation); | ||||||
|             model->animation = icon_animation_alloc(icon); |             model->animation = icon_animation_alloc(icon); | ||||||
|             view_tie_icon_animation(locked_view->view, model->animation); |             view_tie_icon_animation(locked_view->view, model->animation); | ||||||
|             icon_animation_start(model->animation); |             icon_animation_start(model->animation); | ||||||
|  |             model->status_bar_background_black = status_bar_background_black; | ||||||
|             return true; |             return true; | ||||||
|         }); |         }); | ||||||
| } | } | ||||||
| @ -95,23 +99,26 @@ void desktop_locked_render(Canvas* canvas, void* model) { | |||||||
|     canvas_set_color(canvas, ColorBlack); |     canvas_set_color(canvas, ColorBlack); | ||||||
| 
 | 
 | ||||||
|     if(!m->animation_seq_end) { |     if(!m->animation_seq_end) { | ||||||
|         canvas_draw_icon(canvas, m->door_left_x, 0, &I_DoorLeft_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, &I_DoorRight_70x55); |         canvas_draw_icon(canvas, m->door_right_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if(m->animation && m->animation_seq_end) { |     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(now < m->hint_expire_at) { | ||||||
|         if(!m->animation_seq_end) { |         if(!m->animation_seq_end) { | ||||||
|             canvas_set_font(canvas, FontPrimary); |             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) { |         } else if(!m->pin_lock) { | ||||||
|             canvas_set_font(canvas, FontSecondary); |             canvas_set_font(canvas, FontSecondary); | ||||||
|             canvas_draw_icon(canvas, 13, 2, &I_LockPopup_100x49); |             canvas_draw_icon(canvas, 13, 2 + STATUS_BAR_Y_SHIFT, &I_LockPopup_100x49); | ||||||
|             elements_multiline_text(canvas, 65, 20, "To unlock\npress:"); |             elements_multiline_text(canvas, 65, 20 + STATUS_BAR_Y_SHIFT, "To unlock\npress:"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -43,6 +43,7 @@ typedef struct { | |||||||
|     IconAnimation* animation; |     IconAnimation* animation; | ||||||
|     uint32_t hint_expire_at; |     uint32_t hint_expire_at; | ||||||
| 
 | 
 | ||||||
|  |     bool status_bar_background_black; | ||||||
|     uint8_t scene_num; |     uint8_t scene_num; | ||||||
|     int8_t door_left_x; |     int8_t door_left_x; | ||||||
|     int8_t door_right_x; |     int8_t door_right_x; | ||||||
| @ -56,7 +57,10 @@ void desktop_locked_set_callback( | |||||||
|     DesktopLockedViewCallback callback, |     DesktopLockedViewCallback callback, | ||||||
|     void* context); |     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_update_hint_timeout(DesktopLockedView* locked_view); | ||||||
| void desktop_locked_reset_counter(DesktopLockedView* locked_view); | void desktop_locked_reset_counter(DesktopLockedView* locked_view); | ||||||
| void desktop_locked_reset_door_pos(DesktopLockedView* locked_view); | void desktop_locked_reset_door_pos(DesktopLockedView* locked_view); | ||||||
|  | |||||||
| @ -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( |     with_view_model( | ||||||
|         main_view->view, (DesktopMainViewModel * model) { |         main_view->view, (DesktopMainViewModel * model) { | ||||||
|             if(model->animation) icon_animation_free(model->animation); |             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); |             view_tie_icon_animation(main_view->view, model->animation); | ||||||
|             icon_animation_start(model->animation); |             icon_animation_start(model->animation); | ||||||
|             model->icon = NULL; |             model->icon = NULL; | ||||||
|  |             model->status_bar_background_black = status_bar_background_black; | ||||||
|             return true; |             return true; | ||||||
|         }); |         }); | ||||||
| } | } | ||||||
| @ -49,15 +53,18 @@ void desktop_main_render(Canvas* canvas, void* model) { | |||||||
|     DesktopMainViewModel* m = model; |     DesktopMainViewModel* m = model; | ||||||
|     uint32_t now = osKernelGetTickCount(); |     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) { |     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) { |     } 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) { |     if(now < m->hint_expire_at) { | ||||||
|         canvas_set_font(canvas, FontPrimary); |         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"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -32,6 +32,7 @@ typedef struct { | |||||||
|     IconAnimation* animation; |     IconAnimation* animation; | ||||||
|     const Icon* icon; |     const Icon* icon; | ||||||
|     uint8_t scene_num; |     uint8_t scene_num; | ||||||
|  |     bool status_bar_background_black; | ||||||
|     uint32_t hint_expire_at; |     uint32_t hint_expire_at; | ||||||
| } DesktopMainViewModel; | } DesktopMainViewModel; | ||||||
| 
 | 
 | ||||||
| @ -43,7 +44,10 @@ void desktop_main_set_callback( | |||||||
| View* desktop_main_get_view(DesktopMainView* main_view); | View* desktop_main_get_view(DesktopMainView* main_view); | ||||||
| DesktopMainView* desktop_main_alloc(); | DesktopMainView* desktop_main_alloc(); | ||||||
| void desktop_main_free(DesktopMainView* main_view); | 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_unlocked(DesktopMainView* main_view); | ||||||
| void desktop_main_reset_hint(DesktopMainView* main_view); | void desktop_main_reset_hint(DesktopMainView* main_view); | ||||||
| void desktop_main_switch_dolphin_icon(DesktopMainView* main_view, const Icon* icon); | void desktop_main_switch_dolphin_icon(DesktopMainView* main_view, const Icon* icon); | ||||||
|  | |||||||
| @ -1,3 +1,4 @@ | |||||||
|  | #include "gui/canvas.h" | ||||||
| #include "gui_i.h" | #include "gui_i.h" | ||||||
| 
 | 
 | ||||||
| #define TAG "GuiSrv" | #define TAG "GuiSrv" | ||||||
| @ -53,7 +54,19 @@ void gui_redraw_status_bar(Gui* gui) { | |||||||
|     canvas_set_orientation(gui->canvas, CanvasOrientationHorizontal); |     canvas_set_orientation(gui->canvas, CanvasOrientationHorizontal); | ||||||
|     canvas_frame_set( |     canvas_frame_set( | ||||||
|         gui->canvas, GUI_STATUS_BAR_X, GUI_STATUS_BAR_Y, GUI_DISPLAY_WIDTH, GUI_STATUS_BAR_HEIGHT); |         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_draw_icon(gui->canvas, 0, 0, &I_Background_128x11); | ||||||
|  |     canvas_set_bitmap_mode(gui->canvas, 0); | ||||||
| 
 | 
 | ||||||
|     // Right side
 |     // Right side
 | ||||||
|     x = GUI_DISPLAY_WIDTH; |     x = GUI_DISPLAY_WIDTH; | ||||||
| @ -66,25 +79,22 @@ void gui_redraw_status_bar(Gui* gui) { | |||||||
|             if(!width) width = 8; |             if(!width) width = 8; | ||||||
|             x_used += width; |             x_used += width; | ||||||
|             x -= (width + 2); |             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_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_set_color(gui->canvas, ColorBlack); | ||||||
| 
 | 
 | ||||||
|             canvas_draw_box(gui->canvas, 1, 0, 1, 12); |             canvas_draw_rframe( | ||||||
|             canvas_draw_box(gui->canvas, 0, 1, 1, 11); |                 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_box(gui->canvas, 1, 11, width + 4, 2); |             canvas_draw_line( | ||||||
|             canvas_draw_box(gui->canvas, 1, 0, width + 4, 1); |                 gui->canvas, | ||||||
|             canvas_draw_box(gui->canvas, width + 4, 1, 1, 11); |                 2, | ||||||
| 
 |                 canvas_height(gui->canvas) - 2, | ||||||
|             canvas_set_color(gui->canvas, ColorWhite); |                 canvas_width(gui->canvas) - 2, | ||||||
|             canvas_draw_dot(gui->canvas, width + 4, 0); |                 canvas_height(gui->canvas) - 2); | ||||||
|             canvas_draw_dot(gui->canvas, width + 4, 12); |  | ||||||
| 
 |  | ||||||
|             canvas_set_color(gui->canvas, ColorBlack); |  | ||||||
| 
 | 
 | ||||||
|             canvas_frame_set( |             canvas_frame_set( | ||||||
|                 gui->canvas, x, GUI_STATUS_BAR_Y + 2, width, GUI_STATUS_BAR_WORKAREA_HEIGHT); |                 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); |             width = view_port_get_width(view_port); | ||||||
|             if(!width) width = 8; |             if(!width) width = 8; | ||||||
|             x_used += width; |             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_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); |  | ||||||
| 
 |  | ||||||
|             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_set_color(gui->canvas, ColorBlack); | ||||||
| 
 | 
 | ||||||
|             canvas_frame_set( |             canvas_frame_set( | ||||||
| @ -148,7 +155,7 @@ bool gui_redraw_window(Gui* gui) { | |||||||
| 
 | 
 | ||||||
| bool gui_redraw_desktop(Gui* gui) { | bool gui_redraw_desktop(Gui* gui) { | ||||||
|     canvas_set_orientation(gui->canvas, CanvasOrientationHorizontal); |     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]); |     ViewPort* view_port = gui_view_port_find_enabled(gui->layers[GuiLayerDesktop]); | ||||||
|     if(view_port) { |     if(view_port) { | ||||||
|         view_port_draw(view_port, gui->canvas); |         view_port_draw(view_port, gui->canvas); | ||||||
|  | |||||||
| @ -23,7 +23,13 @@ | |||||||
| #define GUI_STATUS_BAR_X 0 | #define GUI_STATUS_BAR_X 0 | ||||||
| #define GUI_STATUS_BAR_Y 0 | #define GUI_STATUS_BAR_Y 0 | ||||||
| #define GUI_STATUS_BAR_WIDTH GUI_DISPLAY_WIDTH | #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 | #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_STATUS_BAR_WORKAREA_HEIGHT 8 | ||||||
| 
 | 
 | ||||||
| #define GUI_WINDOW_X 0 | #define GUI_WINDOW_X 0 | ||||||
|  | |||||||
| @ -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) { | static void code_input_view_draw_callback(Canvas* canvas, void* _model) { | ||||||
|     CodeInputModel* model = _model; |     CodeInputModel* model = _model; | ||||||
|     uint8_t y_offset = 0; |     uint8_t y_offset = 0; | ||||||
|     if(!strlen(model->header)) y_offset = 5; |  | ||||||
|     canvas_clear(canvas); |     canvas_clear(canvas); | ||||||
|     canvas_set_color(canvas, ColorBlack); |     canvas_set_color(canvas, ColorBlack); | ||||||
| 
 | 
 | ||||||
|  |     if(model->header && strlen(model->header)) { | ||||||
|         canvas_draw_str(canvas, 2, 9, model->header); |         canvas_draw_str(canvas, 2, 9, model->header); | ||||||
|  |     } else { | ||||||
|  |         y_offset = 4; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     canvas_set_font(canvas, FontSecondary); |     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->local_buffer[CodeInputFirst], | ||||||
|             model->input_length[CodeInputFirst], |             model->input_length[CodeInputFirst], | ||||||
|             6, |             6, | ||||||
|             30 - y_offset, |             30 + y_offset, | ||||||
|             true); |             true); | ||||||
|         break; |         break; | ||||||
|     case CodeInputStateUpdate: |     case CodeInputStateUpdate: | ||||||
| @ -299,14 +302,14 @@ static void code_input_view_draw_callback(Canvas* canvas, void* _model) { | |||||||
|             model->local_buffer[CodeInputFirst], |             model->local_buffer[CodeInputFirst], | ||||||
|             model->input_length[CodeInputFirst], |             model->input_length[CodeInputFirst], | ||||||
|             6, |             6, | ||||||
|             14 - y_offset, |             14 + y_offset, | ||||||
|             !model->current); |             !model->current); | ||||||
|         code_input_draw_sequence( |         code_input_draw_sequence( | ||||||
|             canvas, |             canvas, | ||||||
|             model->local_buffer[CodeInputSecond], |             model->local_buffer[CodeInputSecond], | ||||||
|             model->input_length[CodeInputSecond], |             model->input_length[CodeInputSecond], | ||||||
|             6, |             6, | ||||||
|             44 - y_offset, |             44 + y_offset, | ||||||
|             model->current); |             model->current); | ||||||
| 
 | 
 | ||||||
|         if(model->current) canvas_draw_str(canvas, 2, 39 - y_offset, "Repeat code"); |         if(model->current) canvas_draw_str(canvas, 2, 39 - y_offset, "Repeat code"); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Albert Kharisov
						Albert Kharisov