diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c index ccebe4740..b72c8062e 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c @@ -23,6 +23,7 @@ const char* const menu_style_names[MenuStyleCount] = { "C64", "Eurocorp", "Compact", + "Terminal", }; static void xtreme_app_scene_interface_mainmenu_menu_style_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index 41a5d321f..a865ab6c2 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -387,9 +387,56 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { break; } + case MenuStyleTerminal: { + canvas_set_font(canvas, FontBatteryPercent); + canvas_set_color(canvas, ColorBlack); + canvas_clear(canvas); + + // Draw a border around the screen + canvas_draw_frame(canvas, 0, 0, 128, 64); + + char prefix[20]; // 20 char buffer to be safe + char title[20]; // name should be 18 + 1(null terminator) + + snprintf(prefix, sizeof(prefix), "%s@fz:~$", furi_hal_version_get_name_ptr()); + snprintf(title, sizeof(prefix), "%s@fz: ~/Home", furi_hal_version_get_name_ptr()); + + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 20, 10, title); // current dir on the title bar + + canvas_draw_str(canvas, 118, 9, "x"); // "X" button on the top-right corner + canvas_draw_frame(canvas, 116, 2, 8, 9); + canvas_draw_frame(canvas, 0, 0, 128, 13); + canvas_set_font(canvas, FontBatteryPercent); + + // Display the user's name line at the bottom + canvas_draw_str(canvas, 2, 56, prefix); + + size_t name_start_x = 2 + (strlen(prefix) - 1) * 6; + + for(size_t i = 0; i < 4 && (position + i) < items_count; i++) { + item = MenuItemArray_get(model->items, position + i); + menu_short_name(item, name); + + size_t scroll_counter = menu_scroll_counter(model, item); + if(i == 0) { + // Display selected item to the right of the $ symbol + // May want to reduce spacing + elements_scrollable_text_line( + canvas, name_start_x, 56, 60, name, scroll_counter, false); + } else { + // Display the previous items above the user's name line + canvas_draw_str(canvas, 2, 56 - i * 12, item->label); + } + } + + break; + } + default: break; } + furi_string_free(name); } else { canvas_draw_str(canvas, 2, 32, "Empty"); @@ -639,6 +686,10 @@ static void menu_process_up(Menu* menu) { } vertical_offset = CLAMP(MAX((int)position - 4, 0), MAX((int)count - 8, 0), 0); break; + case MenuStyleTerminal: + position = (position + count - 1) % count; + break; + default: break; } @@ -689,6 +740,10 @@ static void menu_process_down(Menu* menu) { } vertical_offset = CLAMP(MAX((int)position - 4, 0), MAX((int)count - 8, 0), 0); break; + case MenuStyleTerminal: + position = (position + 1) % count; + break; + default: break; } @@ -751,6 +806,7 @@ static void menu_process_left(Menu* menu) { } vertical_offset = CLAMP(MAX((int)position - 4, 0), MAX((int)count - 8, 0), 0); break; + case MenuStyleTerminal: default: break; } @@ -818,6 +874,7 @@ static void menu_process_right(Menu* menu) { } vertical_offset = CLAMP(MAX((int)position - 4, 0), MAX((int)count - 8, 0), 0); break; + case MenuStyleTerminal: default: break; } diff --git a/lib/xtreme/xtreme.h b/lib/xtreme/xtreme.h index f11d6e70f..89a2fdb01 100644 --- a/lib/xtreme/xtreme.h +++ b/lib/xtreme/xtreme.h @@ -34,6 +34,7 @@ typedef enum { MenuStyleC64, MenuStyleEurocorp, MenuStyleCompact, + MenuStyleTerminal, MenuStyleCount, } MenuStyle;