132 lines
4.2 KiB
Python
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)
|
|
|