Files
vaiola/modules/ui/gui/MainWindow.py
2025-10-16 18:42:32 +07:00

132 lines
4.2 KiB
Python

import os.path
from pkgutil import extend_path
import flet as ft
from Workspaces import *
MainWindowDarkTheme = {
'logo_large_path': os.path.join('assets', 'logo_dark_large.png'),
'logo_small_path': os.path.join('assets', 'logo_dark_small.png'),
'background_color': "#1f1e23",
'text_color': "#ffffff",
'accent_color': "#7B1FA2",
'icon': ft.Icons.NIGHTLIGHT_ROUNDED
}
MainWindowLightTheme = {
'logo_large_path': os.path.join('assets', 'logo_light_large.png'),
'logo_small_path': os.path.join('assets', 'logo_light_small.png'),
'background_color': "#ffffff",
'text_color': "#1f1e23",
'accent_color': "#9C27B0",
'icon': ft.Icons.SUNNY
}
class MainWindow:
def __init__(self):
self.title = 'Vaiola'
self.themes = [MainWindowDarkTheme, MainWindowLightTheme]
self.active_theme_number = 0
self.active_theme = self.themes[self.active_theme_number]
self.side_bar = MainWindowSideBar(self)
self.active_workspace = self.side_bar.get_active_workspace()
self.page: ft.Page | None = None
def build(self, page: ft.Page):
self.page = page
page.clean()
page.title = self.title
page.padding = 0
page.bgcolor = self.active_theme['background_color']
self.active_workspace = self.side_bar.get_active_workspace()
layout = ft.Row(controls=[self.side_bar.build(), ft.VerticalDivider(thickness=4, ), self.active_workspace.build()],
spacing=0,
vertical_alignment=ft.CrossAxisAlignment.START,
alignment=ft.MainAxisAlignment.START,
)
page.add(layout)
def set_theme(self):
self.active_theme_number += 1
if self.active_theme_number >= len(self.themes): self.active_theme_number = 0
self.active_theme = self.themes[self.active_theme_number]
self.side_bar.set_theme(self.active_theme)
self.rebuild()
def rebuild(self):
self.build(self.page)
self.page.update()
class MainWindowSideBar:
logo_dark_large_path = os.path.join('assets', 'logo_dark_large.png')
logo_dark_small_path = os.path.join('assets', 'logo_dark_small.png')
logo_light_large_path = os.path.join('assets', 'logo_light_large.png')
logo_light_small_path = os.path.join('assets', 'logo_light_small.png')
def __init__(self, parent):
self.tabs: list[MainWindowSideBarTab] = list()
self.active_tab: MainWindowSideBarTab = MainWindowSideBarTab()
self.extended = True
self.theme = parent.active_theme
self.parent = parent
def set_theme(self, theme): self.theme = theme
def get_active_workspace(self) -> Workspace: return self.active_tab.get_active_workspace()
def build(self) -> ft.Container:
logo = ft.Container(
content=ft.Image(
src=self.theme['logo_large_path'] if self.extended else self.theme['logo_small_path'],
width=200 if self.extended else 60,
fit=ft.ImageFit.CONTAIN
),
width=200 if self.extended else 60,
# on_click
)
theme_button = ft.Button(
content=ft.Row(
controls=[
ft.Icon(self.theme['icon'], color=self.theme['background_color']),
ft.Text('Переключить тему', color=self.theme['background_color'])
] if self.extended else [
ft.Icon(self.theme['icon'], color=self.theme['background_color'])
]
),
bgcolor=self.theme['text_color'],
on_click=self.switch_theme
)
settings = ft.Container(content=theme_button, padding=8)
layout = ft.Column(
controls=[logo, ft.Text('Область вкладок', color=self.theme['text_color']), settings]
)
return ft.Container(content=layout, width=200 if self.extended else 60,)
def switch_theme(self, e):
self.parent.set_theme()
class MainWindowSideBarTab:
def __init__(self):
self.workspace = Workspace()
def get_active_workspace(self) -> Workspace:
return self.workspace
if __name__ == "__main__":
ft.app(target=MainWindow().build)