"""Flet GUI router and shell. Provides: - Top navigation bar with the 6 pages (Главная / Команды / Макросы / Расписание / Память / Плагины / Настройки) - Page swap on click, no full reload - Dark theme matching the Tauri GUI vibe Each page lives in `gui/pages/.py` and exposes `build(page) -> Control`. """ import flet as ft from gui.pages import home, commands, macros, scheduler, memory, plugins, settings PAGES = [ ("Главная", home.build), ("Команды", commands.build), ("Макросы", macros.build), ("Расписание", scheduler.build), ("Память", memory.build), ("Плагины", plugins.build), ("Настройки", settings.build), ] def _make_app(page: ft.Page): page.title = "J.A.R.V.I.S. — Python GUI" page.theme_mode = ft.ThemeMode.DARK page.window.width = 940 page.window.height = 720 page.padding = 0 page.bgcolor = "#0a1419" content_holder = ft.Container(expand=True, padding=20) def go(idx: int): nav.selected_index = idx title, builder = PAGES[idx] try: content_holder.content = builder(page) except (RuntimeError, ValueError, OSError) as exc: content_holder.content = ft.Text( f"Не удалось открыть «{title}»:\n{exc}", color="red", ) page.update() nav = ft.NavigationRail( selected_index=0, label_type=ft.NavigationRailLabelType.ALL, min_width=80, min_extended_width=180, bgcolor="#0d1b21", destinations=[ ft.NavigationRailDestination(icon=ft.Icons.HOME, label="Главная"), ft.NavigationRailDestination(icon=ft.Icons.LIST_ALT, label="Команды"), ft.NavigationRailDestination(icon=ft.Icons.PLAY_CIRCLE_OUTLINE, label="Макросы"), ft.NavigationRailDestination(icon=ft.Icons.SCHEDULE, label="Расписание"), ft.NavigationRailDestination(icon=ft.Icons.MEMORY, label="Память"), ft.NavigationRailDestination(icon=ft.Icons.EXTENSION, label="Плагины"), ft.NavigationRailDestination(icon=ft.Icons.SETTINGS, label="Настройки"), ], on_change=lambda e: go(int(e.control.selected_index)), ) layout = ft.Row( controls=[ nav, ft.VerticalDivider(width=1, color="#1f3540"), content_holder, ], expand=True, ) page.add(layout) go(0) def run(): ft.app(target=_make_app)