From ef48b30d4b29d9cd38ef9b9574c6c684f058b51a Mon Sep 17 00:00:00 2001 From: Cody Tolene Date: Sun, 1 Dec 2024 17:22:19 -0600 Subject: [PATCH 1/2] Add coverflow menu style. --- .../main/lfrfid/views/lfrfid_view_read.c | 6 +- .../momentum_app_scene_interface_mainmenu.c | 1 + applications/services/gui/canvas.c | 22 ++- applications/services/gui/canvas.h | 4 + applications/services/gui/modules/loading.c | 2 +- applications/services/gui/modules/menu.c | 146 ++++++++++++++++-- .../clock_settings/clock_settings_alarm.c | 2 +- lib/momentum/settings.h | 2 + targets/f18/api_symbols.csv | 2 +- targets/f7/api_symbols.csv | 2 +- 10 files changed, 170 insertions(+), 19 deletions(-) diff --git a/applications/main/lfrfid/views/lfrfid_view_read.c b/applications/main/lfrfid/views/lfrfid_view_read.c index a1c859af9b..f9bbb50af3 100644 --- a/applications/main/lfrfid/views/lfrfid_view_read.c +++ b/applications/main/lfrfid/views/lfrfid_view_read.c @@ -26,7 +26,7 @@ static void lfrfid_view_read_draw_callback(Canvas* canvas, void* _model) { canvas_draw_str(canvas, 77, 29, "ASK"); canvas_draw_icon(canvas, 70, 22, &I_ButtonRight_4x7); - canvas_draw_icon_animation(canvas, 102, 21, model->icon); + canvas_draw_icon_animation(canvas, 102, 21, 100, 100, model->icon); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 77, 43, "PSK"); @@ -35,7 +35,7 @@ static void lfrfid_view_read_draw_callback(Canvas* canvas, void* _model) { canvas_draw_str(canvas, 77, 43, "PSK"); canvas_draw_icon(canvas, 70, 36, &I_ButtonRight_4x7); - canvas_draw_icon_animation(canvas, 102, 35, model->icon); + canvas_draw_icon_animation(canvas, 102, 35, 100, 100, model->icon); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 77, 29, "ASK"); @@ -47,7 +47,7 @@ static void lfrfid_view_read_draw_callback(Canvas* canvas, void* _model) { } else { canvas_draw_str(canvas, 77, 35, "PSK"); } - canvas_draw_icon_animation(canvas, 102, 27, model->icon); + canvas_draw_icon_animation(canvas, 102, 27, 100, 100, model->icon); } canvas_set_font(canvas, FontSecondary); diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c index 17f17f7295..afad8f7d24 100644 --- a/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c @@ -23,6 +23,7 @@ const char* const menu_style_names[MenuStyleCount] = { "C64", "Compact", "MNTM", + "CoverFlow", }; static void momentum_app_scene_interface_mainmenu_menu_style_changed(VariableItem* item) { MomentumApp* app = variable_item_get_context(item); diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index 2aace5ca73..d9b44e35ea 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -298,21 +298,37 @@ void canvas_draw_icon_animation( Canvas* canvas, int32_t x, int32_t y, + int32_t width_scale, + int32_t height_scale, IconAnimation* icon_animation) { furi_check(canvas); furi_check(icon_animation); + // Ensure scale % is > 0 + furi_assert(width_scale > 0 && height_scale > 0); + // Ensure scale % is <= 100; animated icons > 100% don't look good + furi_assert(width_scale <= 100 && height_scale <= 100); x += canvas->offset_x; y += canvas->offset_y; + uint8_t* icon_data = NULL; compress_icon_decode( - canvas->compress_icon, icon_animation_get_data(icon_animation), &icon_data); + canvas->compress_icon, + icon_animation_get_data(icon_animation), + &icon_data + ); + + int32_t width = icon_animation_get_width(icon_animation); + int32_t height = icon_animation_get_height(icon_animation); + int32_t width_scaled = (width * width_scale) / 100; + int32_t height_scaled = (height * height_scale) / 100; + canvas_draw_u8g2_bitmap( &canvas->fb, x, y, - icon_animation_get_width(icon_animation), - icon_animation_get_height(icon_animation), + width_scaled, + height_scaled, icon_data, IconRotation0); } diff --git a/applications/services/gui/canvas.h b/applications/services/gui/canvas.h index cd4719b3ff..25f24f10ab 100644 --- a/applications/services/gui/canvas.h +++ b/applications/services/gui/canvas.h @@ -262,12 +262,16 @@ void canvas_draw_icon_ex( * @param canvas Canvas instance * @param x x coordinate * @param y y coordinate + * @param width_scale scaled (%) width of icon + * @param height_scale scaled (%) height of icon * @param icon_animation IconAnimation instance */ void canvas_draw_icon_animation( Canvas* canvas, int32_t x, int32_t y, + int32_t width_scale, + int32_t height_scale, IconAnimation* icon_animation); /** Draw icon at position defined by x,y. diff --git a/applications/services/gui/modules/loading.c b/applications/services/gui/modules/loading.c index 7ef4ba8f3f..0aeedd5700 100644 --- a/applications/services/gui/modules/loading.c +++ b/applications/services/gui/modules/loading.c @@ -30,7 +30,7 @@ static void loading_draw_callback(Canvas* canvas, void* _model) { canvas_draw_icon(canvas, x, y, &A_Loading_24); - canvas_draw_icon_animation(canvas, x, y, model->icon); + canvas_draw_icon_animation(canvas, x, y, 100, 100, model->icon); } static bool loading_input_callback(InputEvent* event, void* context) { diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index c3b7bcd67e..7d2656511e 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -73,11 +73,15 @@ static void menu_centered_icon( size_t x, size_t y, size_t width, - size_t height) { + size_t height, + size_t width_scale, + size_t height_scale) { canvas_draw_icon_animation( canvas, x + (width - item->icon->icon->width) / 2, y + (height - item->icon->icon->height) / 2, + width_scale, + height_scale, item->icon); } @@ -107,7 +111,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { canvas_set_font(canvas, i == 1 ? FontPrimary : FontSecondary); shift_position = (position + items_count + i - 1) % items_count; item = MenuItemArray_get(model->items, shift_position); - menu_centered_icon(canvas, item, 4, 3 + 22 * i, 14, 14); + menu_centered_icon(canvas, item, 4, 3 + 22 * i, 14, 14, 100, 100); menu_get_name(item, name, false); size_t scroll_counter = menu_scroll_counter(model, i == 1); elements_scrollable_text_line( @@ -142,7 +146,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { canvas_set_color(canvas, ColorWhite); } item = MenuItemArray_get(model->items, item_i); - menu_centered_icon(canvas, item, x_off, y_off, 40, 20); + menu_centered_icon(canvas, item, x_off, y_off, 40, 20, 100, 100); menu_get_name(item, name, true); size_t scroll_counter = menu_scroll_counter(model, selected); elements_scrollable_text_line_centered( @@ -202,7 +206,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { elements_slightly_rounded_frame( canvas, pos_x - width / 2, pos_y - height / 2, width, height); } - menu_centered_icon(canvas, item, pos_x - 7, pos_y - 7, 14, 14); + menu_centered_icon(canvas, item, pos_x - 7, pos_y - 7, 14, 14, 100, 100); } elements_scrollbar_horizontal(canvas, 0, 64, 128, position, items_count); break; @@ -250,7 +254,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { pos_x += (width + 1) * i + (i < 0 ? -6 : 6); } canvas_draw_frame(canvas, pos_x - width / 2, pos_y - height / 2, width, height); - menu_centered_icon(canvas, item, pos_x - 7, pos_y - 7, 14, 14); + menu_centered_icon(canvas, item, pos_x - 7, pos_y - 7, 14, 14, 100, 100); } elements_scrollbar_horizontal(canvas, 0, 64, 128, position, items_count); break; @@ -279,7 +283,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { canvas_set_color(canvas, ColorWhite); } item = MenuItemArray_get(model->items, item_i); - menu_centered_icon(canvas, item, 0, y_off, 16, 16); + menu_centered_icon(canvas, item, 0, y_off, 16, 16, 100, 100); menu_get_name(item, name, true); size_t scroll_counter = menu_scroll_counter(model, selected); elements_scrollable_text_line( @@ -422,7 +426,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { MenuItem* item = MenuItemArray_get(model->items, position); menu_get_name(item, name, true); elements_bold_rounded_frame(canvas, 42, 23, 35, 33); - menu_centered_icon(canvas, item, 43, 24, 35, 32); + menu_centered_icon(canvas, item, 43, 24, 35, 32, 100, 100); canvas_draw_frame(canvas, 0, 0, 128, 64); uint8_t startY = 15; @@ -442,6 +446,126 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { } break; } + case MenuStyleCoverFlow: { + canvas_clear(canvas); + canvas_set_font(canvas, FontPrimary); + + // Draw frames + canvas_set_bitmap_mode(canvas, true); + canvas_draw_frame(canvas, 0, 0, 128, 64); + canvas_draw_frame(canvas, 44, 2, 40, 40); + + // Draw left side albums + canvas_draw_line(canvas, 6, 40, 17, 35); + canvas_draw_line(canvas, 19, 40, 30, 35); + canvas_draw_line(canvas, 32, 40, 43, 35); + canvas_draw_line(canvas, 6, 3, 17, 8); + canvas_draw_line(canvas, 19, 3, 30, 8); + canvas_draw_line(canvas, 32, 3, 43, 8); + canvas_draw_line(canvas, 18, 2, 18, 41); + canvas_draw_line(canvas, 31, 2, 31, 41); + canvas_draw_line(canvas, 5, 2, 5, 41); + canvas_draw_line(canvas, 4, 8, 1, 7); + canvas_draw_line(canvas, 5, 35, 1, 36); + + // Draw right side albums + canvas_draw_line(canvas, 95, 40, 84, 35); + canvas_draw_line(canvas, 108, 40, 97, 35); + canvas_draw_line(canvas, 121, 40, 110, 35); + canvas_draw_line(canvas, 84, 8, 95, 3); + canvas_draw_line(canvas, 97, 8, 108, 3); + canvas_draw_line(canvas, 110, 8, 121, 3); + canvas_draw_line(canvas, 96, 2, 96, 41); + canvas_draw_line(canvas, 109, 2, 109, 41); + canvas_draw_line(canvas, 122, 2, 122, 41); + canvas_draw_line(canvas, 123, 8, 126, 7); + canvas_draw_line(canvas, 123, 35, 126, 36); + + const int32_t pos_x_center = 128 / 2; + const int32_t pos_y_center = 64 / 2; + const int32_t pos_y_offset = 10; + const int32_t icon_size = 20; + const int32_t side_icon_width = icon_size / 2; + const int32_t padding_center_icon = 14; + const int32_t spacing_between_icons = 3; + const int32_t scale_base = 100; + + MenuItem* center_item = NULL; + + // Draw 7 icons, where index 0 is the center icon + // [-3, -2, -1, 0, 1, 2, 3] + for (int8_t i = -3; i <= 3; i++) { + shift_position = (position + items_count + i) % items_count; + item = MenuItemArray_get(model->items, shift_position); + + int32_t pos_x = pos_x_center; + int32_t pos_y = pos_y_center; + + int32_t scale_width = scale_base; + int32_t scale_height = scale_base; + + if (i < 0) { + // Left sided icons + pos_x -= padding_center_icon; + pos_x -= ((-i) * (side_icon_width + spacing_between_icons)); + pos_x -= (side_icon_width / 2) / 2; + pos_y = (pos_y_center - icon_size / 2) - pos_y_offset; + scale_width = 50; + } else if (i > 0) { + // Right sided icons + pos_x += padding_center_icon; + pos_x += (i * (side_icon_width + spacing_between_icons)); + pos_x -= side_icon_width; + pos_y = (pos_y_center - icon_size / 2) - pos_y_offset; + scale_width = 50; + } else if (i == 0) { + // Center icon + pos_x -= icon_size / 2; + pos_y = (pos_y_center - (icon_size / 2)) - pos_y_offset; + // Scaling > 100% doesn't look good, keep 100% for now + scale_width = scale_base; // TODO: 200% + scale_height = scale_base; // TODO: 200% + // Save center item pointer for later + center_item = item; + } + + // Draw the icon + menu_centered_icon( + canvas, + item, + pos_x, + pos_y, + icon_size, + icon_size, + scale_width, + scale_height + ); + } + + // Draw label for center item + if (center_item) { + FuriString* name = furi_string_alloc(); + menu_get_name(center_item, name, false); + elements_scrollable_text_line_centered( + canvas, + pos_x_center, + (pos_y_center + icon_size / 2) + pos_y_offset, + 126, + name, + 0, + false, + true + ); + furi_string_free(name); + } + + // Add scrollbar element + elements_scrollbar_horizontal( + canvas, 0, 60, 128, position, items_count + ); + + break; + } default: break; } @@ -818,7 +942,9 @@ static void menu_process_left(Menu* menu) { position = position - 8; } break; - + case MenuStyleCoverFlow: + position = (position + count - 1) % count; + break; default: break; } @@ -882,7 +1008,9 @@ static void menu_process_right(Menu* menu) { position = position - 8; } break; - + case MenuStyleCoverFlow: + position = (position + 1) % count; + break; default: break; } diff --git a/applications/settings/clock_settings/clock_settings_alarm.c b/applications/settings/clock_settings/clock_settings_alarm.c index 7b096ef706..b74c01c174 100644 --- a/applications/settings/clock_settings/clock_settings_alarm.c +++ b/applications/settings/clock_settings/clock_settings_alarm.c @@ -47,7 +47,7 @@ static void clock_settings_alarm_draw_callback(Canvas* canvas, void* ctx) { ClockSettingsAlramModel* model = ctx; char buffer[64] = {}; - canvas_draw_icon_animation(canvas, 5, 6, model->icon); + canvas_draw_icon_animation(canvas, 5, 6, 100, 100, model->icon); canvas_set_font(canvas, FontBigNumbers); snprintf(buffer, sizeof(buffer), "%02u:%02u", model->now.hour, model->now.minute); diff --git a/lib/momentum/settings.h b/lib/momentum/settings.h index ee13411313..166cbacc34 100644 --- a/lib/momentum/settings.h +++ b/lib/momentum/settings.h @@ -29,9 +29,11 @@ typedef enum { MenuStyleC64, MenuStyleCompact, MenuStyleMNTM, + MenuStyleCoverFlow, MenuStyleCount, } MenuStyle; + typedef enum { SpiDefault, // CS on pa4 SpiExtra, // CS on pc3 diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index c72569c641..d70b429172 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -737,7 +737,7 @@ Function,+,canvas_draw_dot,void,"Canvas*, int32_t, int32_t" Function,+,canvas_draw_frame,void,"Canvas*, int32_t, int32_t, size_t, size_t" Function,+,canvas_draw_glyph,void,"Canvas*, int32_t, int32_t, uint16_t" Function,+,canvas_draw_icon,void,"Canvas*, int32_t, int32_t, const Icon*" -Function,+,canvas_draw_icon_animation,void,"Canvas*, int32_t, int32_t, IconAnimation*" +Function,+,canvas_draw_icon_animation,void,"Canvas*, int32_t, int32_t, int32_t, int32_t, IconAnimation*" Function,+,canvas_draw_icon_ex,void,"Canvas*, int32_t, int32_t, const Icon*, IconRotation" Function,+,canvas_draw_line,void,"Canvas*, int32_t, int32_t, int32_t, int32_t" Function,+,canvas_draw_rbox,void,"Canvas*, int32_t, int32_t, size_t, size_t, size_t" diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index f5e79d7eec..cd4c9cb15a 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -833,7 +833,7 @@ Function,+,canvas_draw_dot,void,"Canvas*, int32_t, int32_t" Function,+,canvas_draw_frame,void,"Canvas*, int32_t, int32_t, size_t, size_t" Function,+,canvas_draw_glyph,void,"Canvas*, int32_t, int32_t, uint16_t" Function,+,canvas_draw_icon,void,"Canvas*, int32_t, int32_t, const Icon*" -Function,+,canvas_draw_icon_animation,void,"Canvas*, int32_t, int32_t, IconAnimation*" +Function,+,canvas_draw_icon_animation,void,"Canvas*, int32_t, int32_t, int32_t, int32_t, IconAnimation*" Function,+,canvas_draw_icon_ex,void,"Canvas*, int32_t, int32_t, const Icon*, IconRotation" Function,+,canvas_draw_line,void,"Canvas*, int32_t, int32_t, int32_t, int32_t" Function,+,canvas_draw_rbox,void,"Canvas*, int32_t, int32_t, size_t, size_t, size_t" From bbf2e7029027ebd0b112011b52814c53e9e15baa Mon Sep 17 00:00:00 2001 From: Cody Tolene Date: Sun, 1 Dec 2024 18:33:12 -0600 Subject: [PATCH 2/2] Update with new canvas extended function `canvas_draw_icon_animation_ex` --- .../main/lfrfid/views/lfrfid_view_read.c | 6 +- applications/services/gui/canvas.c | 36 +++++++----- applications/services/gui/canvas.h | 23 +++++++- applications/services/gui/modules/loading.c | 2 +- applications/services/gui/modules/menu.c | 57 ++++++++++--------- .../clock_settings/clock_settings_alarm.c | 2 +- lib/momentum/settings.h | 1 - targets/f7/api_symbols.csv | 3 +- 8 files changed, 81 insertions(+), 49 deletions(-) diff --git a/applications/main/lfrfid/views/lfrfid_view_read.c b/applications/main/lfrfid/views/lfrfid_view_read.c index f9bbb50af3..a1c859af9b 100644 --- a/applications/main/lfrfid/views/lfrfid_view_read.c +++ b/applications/main/lfrfid/views/lfrfid_view_read.c @@ -26,7 +26,7 @@ static void lfrfid_view_read_draw_callback(Canvas* canvas, void* _model) { canvas_draw_str(canvas, 77, 29, "ASK"); canvas_draw_icon(canvas, 70, 22, &I_ButtonRight_4x7); - canvas_draw_icon_animation(canvas, 102, 21, 100, 100, model->icon); + canvas_draw_icon_animation(canvas, 102, 21, model->icon); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 77, 43, "PSK"); @@ -35,7 +35,7 @@ static void lfrfid_view_read_draw_callback(Canvas* canvas, void* _model) { canvas_draw_str(canvas, 77, 43, "PSK"); canvas_draw_icon(canvas, 70, 36, &I_ButtonRight_4x7); - canvas_draw_icon_animation(canvas, 102, 35, 100, 100, model->icon); + canvas_draw_icon_animation(canvas, 102, 35, model->icon); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 77, 29, "ASK"); @@ -47,7 +47,7 @@ static void lfrfid_view_read_draw_callback(Canvas* canvas, void* _model) { } else { canvas_draw_str(canvas, 77, 35, "PSK"); } - canvas_draw_icon_animation(canvas, 102, 27, 100, 100, model->icon); + canvas_draw_icon_animation(canvas, 102, 27, model->icon); } canvas_set_font(canvas, FontSecondary); diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index d9b44e35ea..0a9ef66123 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -294,7 +294,7 @@ void canvas_draw_bitmap( canvas_draw_u8g2_bitmap(&canvas->fb, x, y, width, height, bitmap_data, IconRotation0); } -void canvas_draw_icon_animation( +static void _canvas_draw_icon_animation( Canvas* canvas, int32_t x, int32_t y, @@ -305,7 +305,8 @@ void canvas_draw_icon_animation( furi_check(icon_animation); // Ensure scale % is > 0 furi_assert(width_scale > 0 && height_scale > 0); - // Ensure scale % is <= 100; animated icons > 100% don't look good + // Ensure scale % is <= 100: animated icons > 100% are buggy + // TODO: Future, allow scaling > 100 furi_assert(width_scale <= 100 && height_scale <= 100); x += canvas->offset_x; @@ -313,10 +314,7 @@ void canvas_draw_icon_animation( uint8_t* icon_data = NULL; compress_icon_decode( - canvas->compress_icon, - icon_animation_get_data(icon_animation), - &icon_data - ); + canvas->compress_icon, icon_animation_get_data(icon_animation), &icon_data); int32_t width = icon_animation_get_width(icon_animation); int32_t height = icon_animation_get_height(icon_animation); @@ -324,13 +322,25 @@ void canvas_draw_icon_animation( int32_t height_scaled = (height * height_scale) / 100; canvas_draw_u8g2_bitmap( - &canvas->fb, - x, - y, - width_scaled, - height_scaled, - icon_data, - IconRotation0); + &canvas->fb, x, y, width_scaled, height_scaled, icon_data, IconRotation0); +} + +void canvas_draw_icon_animation( + Canvas* canvas, + int32_t x, + int32_t y, + IconAnimation* icon_animation) { + _canvas_draw_icon_animation(canvas, x, y, 100, 100, icon_animation); +} + +void canvas_draw_icon_animation_ex( + Canvas* canvas, + int32_t x, + int32_t y, + int32_t width_scale, + int32_t height_scale, + IconAnimation* icon_animation) { + _canvas_draw_icon_animation(canvas, x, y, width_scale, height_scale, icon_animation); } static void canvas_draw_u8g2_bitmap_int( diff --git a/applications/services/gui/canvas.h b/applications/services/gui/canvas.h index 25f24f10ab..2168a4ea44 100644 --- a/applications/services/gui/canvas.h +++ b/applications/services/gui/canvas.h @@ -258,15 +258,34 @@ void canvas_draw_icon_ex( IconRotation rotation); /** Draw animation at position defined by x,y. + * + * This function is retained for backward compatibility and draws the animation + * at the specified position without scaling. * * @param canvas Canvas instance * @param x x coordinate * @param y y coordinate - * @param width_scale scaled (%) width of icon - * @param height_scale scaled (%) height of icon * @param icon_animation IconAnimation instance */ void canvas_draw_icon_animation( + Canvas* canvas, + int32_t x, + int32_t y, + IconAnimation* icon_animation); + +/** Draw animation at position defined by x,y with scaling. + * + * This extended version allows scaling of the animation dimensions by percentage. + * The width and height are scaled independently. + * + * @param canvas Canvas instance + * @param x x coordinate + * @param y y coordinate + * @param width_scale Scaled (%) width of the icon (1–100%) + * @param height_scale Scaled (%) height of the icon (1–100%) + * @param icon_animation IconAnimation instance + */ +void canvas_draw_icon_animation_ex( Canvas* canvas, int32_t x, int32_t y, diff --git a/applications/services/gui/modules/loading.c b/applications/services/gui/modules/loading.c index 0aeedd5700..7ef4ba8f3f 100644 --- a/applications/services/gui/modules/loading.c +++ b/applications/services/gui/modules/loading.c @@ -30,7 +30,7 @@ static void loading_draw_callback(Canvas* canvas, void* _model) { canvas_draw_icon(canvas, x, y, &A_Loading_24); - canvas_draw_icon_animation(canvas, x, y, 100, 100, model->icon); + canvas_draw_icon_animation(canvas, x, y, model->icon); } static bool loading_input_callback(InputEvent* event, void* context) { diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index 7d2656511e..e66c151d16 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -68,6 +68,20 @@ static void menu_get_name(MenuItem* item, FuriString* name, bool shorter) { } static void menu_centered_icon( + Canvas* canvas, + MenuItem* item, + size_t x, + size_t y, + size_t width, + size_t height) { + canvas_draw_icon_animation( + canvas, + x + (width - item->icon->icon->width) / 2, + y + (height - item->icon->icon->height) / 2, + item->icon); +} + +static void menu_centered_icon_scaled( Canvas* canvas, MenuItem* item, size_t x, @@ -76,7 +90,7 @@ static void menu_centered_icon( size_t height, size_t width_scale, size_t height_scale) { - canvas_draw_icon_animation( + canvas_draw_icon_animation_ex( canvas, x + (width - item->icon->icon->width) / 2, y + (height - item->icon->icon->height) / 2, @@ -111,7 +125,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { canvas_set_font(canvas, i == 1 ? FontPrimary : FontSecondary); shift_position = (position + items_count + i - 1) % items_count; item = MenuItemArray_get(model->items, shift_position); - menu_centered_icon(canvas, item, 4, 3 + 22 * i, 14, 14, 100, 100); + menu_centered_icon(canvas, item, 4, 3 + 22 * i, 14, 14); menu_get_name(item, name, false); size_t scroll_counter = menu_scroll_counter(model, i == 1); elements_scrollable_text_line( @@ -146,7 +160,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { canvas_set_color(canvas, ColorWhite); } item = MenuItemArray_get(model->items, item_i); - menu_centered_icon(canvas, item, x_off, y_off, 40, 20, 100, 100); + menu_centered_icon(canvas, item, x_off, y_off, 40, 20); menu_get_name(item, name, true); size_t scroll_counter = menu_scroll_counter(model, selected); elements_scrollable_text_line_centered( @@ -206,7 +220,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { elements_slightly_rounded_frame( canvas, pos_x - width / 2, pos_y - height / 2, width, height); } - menu_centered_icon(canvas, item, pos_x - 7, pos_y - 7, 14, 14, 100, 100); + menu_centered_icon(canvas, item, pos_x - 7, pos_y - 7, 14, 14); } elements_scrollbar_horizontal(canvas, 0, 64, 128, position, items_count); break; @@ -254,7 +268,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { pos_x += (width + 1) * i + (i < 0 ? -6 : 6); } canvas_draw_frame(canvas, pos_x - width / 2, pos_y - height / 2, width, height); - menu_centered_icon(canvas, item, pos_x - 7, pos_y - 7, 14, 14, 100, 100); + menu_centered_icon(canvas, item, pos_x - 7, pos_y - 7, 14, 14); } elements_scrollbar_horizontal(canvas, 0, 64, 128, position, items_count); break; @@ -283,7 +297,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { canvas_set_color(canvas, ColorWhite); } item = MenuItemArray_get(model->items, item_i); - menu_centered_icon(canvas, item, 0, y_off, 16, 16, 100, 100); + menu_centered_icon(canvas, item, 0, y_off, 16, 16); menu_get_name(item, name, true); size_t scroll_counter = menu_scroll_counter(model, selected); elements_scrollable_text_line( @@ -426,7 +440,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { MenuItem* item = MenuItemArray_get(model->items, position); menu_get_name(item, name, true); elements_bold_rounded_frame(canvas, 42, 23, 35, 33); - menu_centered_icon(canvas, item, 43, 24, 35, 32, 100, 100); + menu_centered_icon(canvas, item, 43, 24, 35, 32); canvas_draw_frame(canvas, 0, 0, 128, 64); uint8_t startY = 15; @@ -494,7 +508,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { // Draw 7 icons, where index 0 is the center icon // [-3, -2, -1, 0, 1, 2, 3] - for (int8_t i = -3; i <= 3; i++) { + for(int8_t i = -3; i <= 3; i++) { shift_position = (position + items_count + i) % items_count; item = MenuItemArray_get(model->items, shift_position); @@ -504,21 +518,21 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { int32_t scale_width = scale_base; int32_t scale_height = scale_base; - if (i < 0) { + if(i < 0) { // Left sided icons pos_x -= padding_center_icon; pos_x -= ((-i) * (side_icon_width + spacing_between_icons)); pos_x -= (side_icon_width / 2) / 2; pos_y = (pos_y_center - icon_size / 2) - pos_y_offset; scale_width = 50; - } else if (i > 0) { + } else if(i > 0) { // Right sided icons pos_x += padding_center_icon; pos_x += (i * (side_icon_width + spacing_between_icons)); pos_x -= side_icon_width; pos_y = (pos_y_center - icon_size / 2) - pos_y_offset; scale_width = 50; - } else if (i == 0) { + } else if(i == 0) { // Center icon pos_x -= icon_size / 2; pos_y = (pos_y_center - (icon_size / 2)) - pos_y_offset; @@ -530,20 +544,12 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { } // Draw the icon - menu_centered_icon( - canvas, - item, - pos_x, - pos_y, - icon_size, - icon_size, - scale_width, - scale_height - ); + menu_centered_icon_scaled( + canvas, item, pos_x, pos_y, icon_size, icon_size, scale_width, scale_height); } // Draw label for center item - if (center_item) { + if(center_item) { FuriString* name = furi_string_alloc(); menu_get_name(center_item, name, false); elements_scrollable_text_line_centered( @@ -554,15 +560,12 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { name, 0, false, - true - ); + true); furi_string_free(name); } // Add scrollbar element - elements_scrollbar_horizontal( - canvas, 0, 60, 128, position, items_count - ); + elements_scrollbar_horizontal(canvas, 0, 60, 128, position, items_count); break; } diff --git a/applications/settings/clock_settings/clock_settings_alarm.c b/applications/settings/clock_settings/clock_settings_alarm.c index b74c01c174..7b096ef706 100644 --- a/applications/settings/clock_settings/clock_settings_alarm.c +++ b/applications/settings/clock_settings/clock_settings_alarm.c @@ -47,7 +47,7 @@ static void clock_settings_alarm_draw_callback(Canvas* canvas, void* ctx) { ClockSettingsAlramModel* model = ctx; char buffer[64] = {}; - canvas_draw_icon_animation(canvas, 5, 6, 100, 100, model->icon); + canvas_draw_icon_animation(canvas, 5, 6, model->icon); canvas_set_font(canvas, FontBigNumbers); snprintf(buffer, sizeof(buffer), "%02u:%02u", model->now.hour, model->now.minute); diff --git a/lib/momentum/settings.h b/lib/momentum/settings.h index 166cbacc34..b34b2b3325 100644 --- a/lib/momentum/settings.h +++ b/lib/momentum/settings.h @@ -33,7 +33,6 @@ typedef enum { MenuStyleCount, } MenuStyle; - typedef enum { SpiDefault, // CS on pa4 SpiExtra, // CS on pc3 diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index cd4c9cb15a..891998b270 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -833,7 +833,8 @@ Function,+,canvas_draw_dot,void,"Canvas*, int32_t, int32_t" Function,+,canvas_draw_frame,void,"Canvas*, int32_t, int32_t, size_t, size_t" Function,+,canvas_draw_glyph,void,"Canvas*, int32_t, int32_t, uint16_t" Function,+,canvas_draw_icon,void,"Canvas*, int32_t, int32_t, const Icon*" -Function,+,canvas_draw_icon_animation,void,"Canvas*, int32_t, int32_t, int32_t, int32_t, IconAnimation*" +Function,+,canvas_draw_icon_animation,void,"Canvas*, int32_t, int32_t, IconAnimation*" +Function,+,canvas_draw_icon_animation_ex,void,"Canvas*, int32_t, int32_t, int32_t, int32_t, IconAnimation*" Function,+,canvas_draw_icon_ex,void,"Canvas*, int32_t, int32_t, const Icon*, IconRotation" Function,+,canvas_draw_line,void,"Canvas*, int32_t, int32_t, int32_t, int32_t" Function,+,canvas_draw_rbox,void,"Canvas*, int32_t, int32_t, size_t, size_t, size_t"