98 lines
3.8 KiB
Python
98 lines
3.8 KiB
Python
# side_menu.py
|
||
import os.path
|
||
|
||
import flet as ft
|
||
|
||
class NavPanel:
|
||
"""Пустая панель навигации. Добавьте свои пункты позже."""
|
||
def __init__(self, page: ft.Page):
|
||
self.page = page
|
||
|
||
def build(self) -> ft.Container:
|
||
"""Возвращаем контейнер с кнопками навигации."""
|
||
# Пример пунктов – замените/добавьте свои
|
||
return ft.Container(
|
||
padding=ft.padding.symmetric(vertical=10, horizontal=5),
|
||
content=ft.Column(
|
||
controls=[
|
||
ft.TextButton(
|
||
text="Главная",
|
||
icon=ft.Icons.HOME,
|
||
on_click=lambda e: self.page.views.append(ft.View("/home")),
|
||
style=ft.ButtonStyle(overlay_color=ft.Colors.GREY_200)
|
||
),
|
||
ft.TextButton(
|
||
text="Настройки",
|
||
icon=ft.Icons.SETTINGS,
|
||
on_click=lambda e: self.page.views.append(ft.View("/settings")),
|
||
style=ft.ButtonStyle(overlay_color=ft.Colors.GREY_200)
|
||
),
|
||
],
|
||
spacing=5,
|
||
),
|
||
)
|
||
|
||
class SideMenu:
|
||
"""
|
||
Класс, представляющий боковое меню.
|
||
На данный момент оно «пустое», но можно легко добавить пункты в будущем.
|
||
"""
|
||
def __init__(self):
|
||
# Любые начальные данные можно хранить здесь
|
||
self.width = 200 # ширина меню
|
||
self.bgcolor = ft.Colors.SURFACE
|
||
self.logo_path = os.path.join('assets', 'side_menu_logo_dark.png')
|
||
|
||
def build(self, page: ft.Page) -> ft.Container:
|
||
"""
|
||
Возвращает контейнер, который можно вставить в страницу.
|
||
"""
|
||
logo = ft.Image(
|
||
src=self.logo_path,
|
||
width=self.width, # растягиваем до ширины меню
|
||
fit=ft.ImageFit.CONTAIN, # сохраняем пропорции
|
||
# height может быть не задан; Flet будет авто‑подбирать
|
||
)
|
||
|
||
# 2️⃣ Панель навигации
|
||
nav_panel = NavPanel(page).build()
|
||
|
||
# 3️⃣ Кнопка‑тогглер темы
|
||
def toggle_theme(e):
|
||
# Переключаем режим и обновляем страницу
|
||
page.theme_mode = (
|
||
ft.ThemeMode.DARK if page.theme_mode == ft.ThemeMode.LIGHT
|
||
else ft.ThemeMode.LIGHT
|
||
)
|
||
page.update()
|
||
|
||
toggle_btn = ft.TextButton(
|
||
text="Тёмная тема" if page.theme_mode == ft.ThemeMode.LIGHT else "Светлая тема",
|
||
icon=ft.Icons.BOOKMARK,
|
||
on_click=toggle_theme,
|
||
style=ft.ButtonStyle(
|
||
padding=ft.padding.all(10),
|
||
alignment=ft.alignment.center_left
|
||
)
|
||
)
|
||
|
||
# 4️⃣ Ставим всё в колонку с выравниванием по краям
|
||
return ft.Container(
|
||
width=self.width,
|
||
bgcolor=self.bgcolor,
|
||
padding=ft.padding.symmetric(vertical=15, horizontal=10),
|
||
content=ft.Column(
|
||
controls=[
|
||
logo,
|
||
ft.Divider(height=15),
|
||
nav_panel,
|
||
ft.Divider(height=15),
|
||
ft.Container(
|
||
content=toggle_btn,
|
||
alignment=ft.alignment.bottom_left
|
||
),
|
||
],
|
||
spacing=10,
|
||
alignment=ft.MainAxisAlignment.START,
|
||
),
|
||
) |