diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_mainmenu.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_mainmenu.c index a085fb0ea..a16539ecf 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_mainmenu.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_mainmenu.c @@ -1,6 +1,7 @@ #include "../xtreme_app.h" enum VarItemListIndex { + VarItemListIndexWiiMenu, VarItemListIndexApp, VarItemListIndexRemoveApp, VarItemListIndexAddApp, @@ -13,6 +14,14 @@ void xtreme_app_scene_mainmenu_var_item_list_callback( view_dispatcher_send_custom_event(app->view_dispatcher, index); } +static void xtreme_app_scene_mainmenu_wii_menu_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->wii_menu = value; + app->save_settings = true; +} + static void xtreme_app_scene_mainmenu_app_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); app->mainmenu_app_index = variable_item_get_current_value_index(item); @@ -21,9 +30,15 @@ static void xtreme_app_scene_mainmenu_app_changed(VariableItem* item) { void xtreme_app_scene_mainmenu_on_enter(void* context) { XtremeApp* app = context; + XtremeSettings* xtreme_settings = XTREME_SETTINGS(); VariableItemList* var_item_list = app->var_item_list; VariableItem* item; + item = variable_item_list_add( + var_item_list, "Wii menu", 2, xtreme_app_scene_mainmenu_wii_menu_changed, app); + variable_item_set_current_value_index(item, xtreme_settings->wii_menu); + variable_item_set_current_value_text(item, xtreme_settings->wii_menu ? "ON" : "OFF"); + item = variable_item_list_add( var_item_list, "App", diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index a695a8596..8fe8dcbc5 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -6,6 +6,7 @@ #include #include #include +#include struct Menu { View* view; @@ -47,51 +48,96 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { MenuItem* item; FuriString* name = furi_string_alloc(); size_t shift_position; - if(position < 2) { - shift_position = 0; - } else if(position >= items_count - 2 + (items_count % 2)) { - shift_position = position - (position % 2) - 4; - } else { - shift_position = position - (position % 2) - 2; - } - canvas_set_font(canvas, FontSecondary); - size_t item_i; - size_t x_off, y_off; - for(int i = 0; i < 6; i++) { - item_i = shift_position + i; - 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) { - 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; + if(XTREME_SETTINGS()->wii_menu) { + if(position < 2) { + shift_position = 0; + } else if(position >= items_count - 2 + (items_count % 2)) { + shift_position = position - (position % 2) - 4; + } else { + shift_position = position - (position % 2) - 2; + } + canvas_set_font(canvas, FontSecondary); + size_t item_i; + size_t x_off, y_off; + for(int i = 0; i < 6; i++) { + item_i = shift_position + i; + 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) { + 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); + elements_scrollable_text_line( + canvas, + 20 + x_off, + 26 + y_off, + 36, + name, + scroll_counter, + false, + true); + if(item_i == position) { + canvas_set_color(canvas, ColorBlack); } else { - scroll_counter -= 1; + elements_frame(canvas, 0 + x_off, 0 + y_off, 40, 30); } } - item = MenuItemArray_get(model->items, item_i); + } else { + // 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, (40 - item->icon->icon->width) / 2 + x_off, (20 - item->icon->icon->height) / 2 + y_off, item->icon); + canvas_draw_icon_animation(canvas, 4 + (14 - item->icon->icon->width) / 2, 3 + (14 - item->icon->icon->height) / 2, item->icon); + } + 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; } furi_string_set(name, item->label); elements_scrollable_text_line( canvas, - 20 + x_off, - 26 + y_off, + 22, 36, + 98, name, scroll_counter, false, - true); - if(item_i == position) { - canvas_set_color(canvas, ColorBlack); - } else { - elements_frame(canvas, 0 + x_off, 0 + y_off, 40, 30); + 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); } furi_string_free(name); } else { @@ -292,23 +338,31 @@ static void menu_process_up(Menu* menu) { MenuModel * model, { size_t count = MenuItemArray_size(model->items); - if(!(model->position == count - 1 && count % 2)) { - MenuItem* item = MenuItemArray_get(model->items, model->position); - if(item && item->icon) { - icon_animation_stop(item->icon); - } + MenuItem* item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_stop(item->icon); + } - if(model->position % 2) { + if(XTREME_SETTINGS()->wii_menu) { + if(!(model->position == count - 1 && count % 2)) { + if(model->position % 2) { + model->position--; + } else { + model->position++; + } + model->scroll_counter = 0; + } + } else { + if(model->position > 0) { model->position--; } else { - model->position++; + model->position = count - 1; } - model->scroll_counter = 0; + } - item = MenuItemArray_get(model->items, model->position); - if(item && item->icon) { - icon_animation_start(item->icon); - } + item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_start(item->icon); } }, true); @@ -320,29 +374,38 @@ static void menu_process_down(Menu* menu) { MenuModel * model, { size_t count = MenuItemArray_size(model->items); - if(!(model->position == count - 1 && count % 2)) { - MenuItem* item = MenuItemArray_get(model->items, model->position); - if(item && item->icon) { - icon_animation_stop(item->icon); - } + MenuItem* item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_stop(item->icon); + } - if(model->position % 2) { - model->position--; - } else { + if(XTREME_SETTINGS()->wii_menu) { + if(!(model->position == count - 1 && count % 2)) { + if(model->position % 2) { + model->position--; + } else { + model->position++; + } + model->scroll_counter = 0; + } + } else { + if(model->position < count - 1) { model->position++; + } else { + model->position = 0; } - model->scroll_counter = 0; + } - item = MenuItemArray_get(model->items, model->position); - if(item && item->icon) { - icon_animation_start(item->icon); - } + item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_start(item->icon); } }, true); } static void menu_process_left(Menu* menu) { + if(!XTREME_SETTINGS()->wii_menu) return; with_view_model( menu->view, MenuModel * model, @@ -373,6 +436,7 @@ static void menu_process_left(Menu* menu) { } static void menu_process_right(Menu* menu) { + if(!XTREME_SETTINGS()->wii_menu) return; with_view_model( menu->view, MenuModel * model, diff --git a/applications/services/xtreme/settings.c b/applications/services/xtreme/settings.c index 060f61bf0..c52db66c9 100644 --- a/applications/services/xtreme/settings.c +++ b/applications/services/xtreme/settings.c @@ -39,6 +39,7 @@ void XTREME_SETTINGS_LOAD() { xtreme_settings->anim_speed = 100; // 100% xtreme_settings->cycle_anims = 0; // Meta.txt xtreme_settings->unlock_anims = false; // OFF + xtreme_settings->wii_menu = true; // ON xtreme_settings->battery_icon = BatteryIconBarPercent; // Bar % xtreme_settings->status_icons = true; // ON xtreme_settings->bar_borders = true; // ON diff --git a/applications/services/xtreme/settings.h b/applications/services/xtreme/settings.h index 13c429446..295c8b2c4 100644 --- a/applications/services/xtreme/settings.h +++ b/applications/services/xtreme/settings.h @@ -15,7 +15,7 @@ extern "C" { #define MAX_PACK_NAME_LEN 32 -#define XTREME_SETTINGS_VERSION (5) +#define XTREME_SETTINGS_VERSION (6) #define XTREME_SETTINGS_PATH_OLD INT_PATH(XTREME_SETTINGS_FILE_NAME) #define XTREME_SETTINGS_PATH EXT_PATH(XTREME_SETTINGS_FILE_NAME) #define XTREME_SETTINGS_MAGIC (0x69) @@ -30,6 +30,7 @@ typedef struct { uint16_t anim_speed; int32_t cycle_anims; bool unlock_anims; + bool wii_menu; BatteryIcon battery_icon; bool status_icons; bool bar_borders;