diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index 2e7e9e021..e74adb8f6 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -38,6 +38,35 @@ static void menu_process_left(Menu* menu); static void menu_process_right(Menu* menu); static void menu_process_ok(Menu* menu); +static void menu_short_name(MenuItem* item, FuriString* name) { + furi_string_set(name, item->label); + if(furi_string_start_with_str(name, "[")) { + size_t trim = furi_string_search_str(name, "] ", 1); + if(trim != STRING_FAILURE) { + furi_string_right(name, trim + 2); + } + } +} + +static void menu_centered_icon(Canvas* canvas, MenuItem* item, size_t x, size_t y, size_t width, size_t height) { + if(item->icon) { + canvas_draw_icon_animation( + canvas, + x + (width - item->icon->icon->width) / 2, + y + (height - item->icon->icon->height) / 2, + item->icon); + } +} + +static size_t menu_scroll_counter(MenuModel* model, bool selected) { + if(!selected) return 0; + size_t scroll_counter = model->scroll_counter; + if(scroll_counter > 0) { + scroll_counter--; + } + return scroll_counter; +} + static void menu_draw_callback(Canvas* canvas, void* _model) { MenuModel* model = _model; @@ -50,49 +79,15 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { size_t shift_position; switch(XTREME_SETTINGS()->menu_style) { case MenuStyleList: { - // First line - canvas_set_font(canvas, FontSecondary); - shift_position = (0 + position + items_count - 1) % items_count; - item = MenuItemArray_get(model->items, shift_position); - if(item->icon) { - canvas_draw_icon_animation( - canvas, - 4 + (14 - item->icon->icon->width) / 2, - 3 + (14 - item->icon->icon->height) / 2, - item->icon); + for(uint8_t i = 0; i < 3; i++) { + 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); + size_t scroll_counter = menu_scroll_counter(model, i == 1); + elements_scrollable_text_line_str( + canvas, 22, 14 + 22 * i, 98, item->label, scroll_counter, false, false); } - canvas_draw_str(canvas, 22, 14, item->label); - // Second line main - canvas_set_font(canvas, FontPrimary); - shift_position = (1 + position + items_count - 1) % items_count; - item = MenuItemArray_get(model->items, shift_position); - if(item->icon) { - canvas_draw_icon_animation( - canvas, - 4 + (14 - item->icon->icon->width) / 2, - 25 + (14 - item->icon->icon->height) / 2, - item->icon); - } - size_t scroll_counter = model->scroll_counter; - if(scroll_counter < 1) { - scroll_counter = 0; - } else { - scroll_counter -= 1; - } - elements_scrollable_text_line_str( - canvas, 22, 36, 98, item->label, scroll_counter, false, false); - // Third line - canvas_set_font(canvas, FontSecondary); - shift_position = (2 + position + items_count - 1) % items_count; - item = MenuItemArray_get(model->items, shift_position); - if(item->icon) { - canvas_draw_icon_animation( - canvas, - 4 + (14 - item->icon->icon->width) / 2, - 47 + (14 - item->icon->icon->height) / 2, - item->icon); - } - canvas_draw_str(canvas, 22, 58, item->label); // Frame and scrollbar elements_frame(canvas, 0, 21, 128 - 5, 21); elements_scrollbar(canvas, position, items_count); @@ -117,35 +112,18 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { if(item_i >= items_count) continue; x_off = (i / 2) * 43 + 1; y_off = (i % 2) * 32; - size_t scroll_counter = 0; - if(item_i == position) { + bool selected = item_i == position; + size_t scroll_counter = menu_scroll_counter(model, selected); + if(selected) { elements_slightly_rounded_box(canvas, 0 + x_off, 0 + y_off, 40, 30); canvas_set_color(canvas, ColorWhite); - scroll_counter = model->scroll_counter; - if(scroll_counter < 1) { - scroll_counter = 0; - } else { - scroll_counter -= 1; - } } item = MenuItemArray_get(model->items, item_i); - if(item->icon) { - canvas_draw_icon_animation( - canvas, - (40 - item->icon->icon->width) / 2 + x_off, - (20 - item->icon->icon->height) / 2 + y_off, - item->icon); - } - furi_string_set(name, item->label); - if(furi_string_start_with_str(name, "[")) { - size_t trim = furi_string_search_str(name, "] ", 1); - if(trim != STRING_FAILURE) { - furi_string_right(name, trim + 2); - } - } + menu_centered_icon(canvas, item, x_off, y_off, 40, 20); + menu_short_name(item, name); elements_scrollable_text_line_centered( canvas, 20 + x_off, 26 + y_off, 36, name, scroll_counter, false, true); - if(item_i == position) { + if(selected) { canvas_set_color(canvas, ColorBlack); } else { elements_frame(canvas, 0 + x_off, 0 + y_off, 40, 30); @@ -184,26 +162,16 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { canvas_set_color(canvas, ColorBlack); canvas_set_font(canvas, FontPrimary); - canvas_draw_str_aligned( - canvas, - pos_x, - pos_y - height / 2 - 8, - AlignCenter, - AlignBottom, - item->label); + size_t scroll_counter = menu_scroll_counter(model, true); + elements_scrollable_text_line_str( + canvas, pos_x, pos_y - height / 2 - 8, 126, item->label, scroll_counter, false, true); } else { pos_x += (width + 6) * i; pos_y += 2; elements_slightly_rounded_frame( canvas, pos_x - width / 2, pos_y - height / 2, width, height); } - if(item->icon) { - canvas_draw_icon_animation( - canvas, - pos_x - item->icon->icon->width / 2, - pos_y - item->icon->icon->height / 2, - item->icon); - } + menu_centered_icon(canvas, item, pos_x - 7, pos_y - 7, 14, 14); } elements_scrollbar_horizontal(canvas, 0, 64, 128, position, items_count); break; @@ -411,6 +379,7 @@ static void menu_process_up(Menu* menu) { menu->view, MenuModel * model, { + model->scroll_counter = 0; size_t count = MenuItemArray_size(model->items); MenuItem* item = MenuItemArray_get(model->items, model->position); if(item && item->icon) { @@ -431,7 +400,6 @@ static void menu_process_up(Menu* menu) { } else { model->position++; } - model->scroll_counter = 0; break; default: break; @@ -452,6 +420,7 @@ static void menu_process_down(Menu* menu) { menu->view, MenuModel * model, { + model->scroll_counter = 0; size_t count = MenuItemArray_size(model->items); MenuItem* item = MenuItemArray_get(model->items, model->position); if(item && item->icon) { @@ -472,7 +441,6 @@ static void menu_process_down(Menu* menu) { } else { model->position++; } - model->scroll_counter = 0; break; default: break; @@ -493,6 +461,7 @@ static void menu_process_left(Menu* menu) { menu->view, MenuModel * model, { + model->scroll_counter = 0; size_t count = MenuItemArray_size(model->items); MenuItem* item = MenuItemArray_get(model->items, model->position); if(item && item->icon) { @@ -510,7 +479,6 @@ static void menu_process_left(Menu* menu) { } else { model->position -= 2; } - model->scroll_counter = 0; break; case MenuStyleDsi: if(model->position > 0) { @@ -538,6 +506,7 @@ static void menu_process_right(Menu* menu) { menu->view, MenuModel * model, { + model->scroll_counter = 0; size_t count = MenuItemArray_size(model->items); MenuItem* item = MenuItemArray_get(model->items, model->position); if(item && item->icon) { @@ -560,7 +529,6 @@ static void menu_process_right(Menu* menu) { model->position = model->position % 2; } } - model->scroll_counter = 0; break; case MenuStyleDsi: if(model->position < count - 1) {