initial fluent-widgets ui
This commit is contained in:
157
app/view/main_window.py
Normal file
157
app/view/main_window.py
Normal file
@ -0,0 +1,157 @@
|
||||
# coding: utf-8
|
||||
from typing import List
|
||||
from PySide6.QtCore import Qt, Signal, QEasingCurve, QUrl, QSize, QTimer
|
||||
from PySide6.QtGui import QIcon, QDesktopServices, QColor
|
||||
from PySide6.QtWidgets import QApplication, QHBoxLayout, QFrame, QWidget
|
||||
|
||||
from qfluentwidgets import (NavigationAvatarWidget, NavigationItemPosition, MessageBox, FluentWindow,
|
||||
SplashScreen, SystemThemeListener, isDarkTheme)
|
||||
from qfluentwidgets import FluentIcon as FIF
|
||||
|
||||
from .gallery_interface import GalleryInterface
|
||||
from .home_interface import HomeInterface
|
||||
from .basic_input_interface import BasicInputInterface
|
||||
from .date_time_interface import DateTimeInterface
|
||||
from .dialog_interface import DialogInterface
|
||||
from .layout_interface import LayoutInterface
|
||||
from .icon_interface import IconInterface
|
||||
from .material_interface import MaterialInterface
|
||||
from .menu_interface import MenuInterface
|
||||
from .navigation_view_interface import NavigationViewInterface
|
||||
from .scroll_interface import ScrollInterface
|
||||
from .status_info_interface import StatusInfoInterface
|
||||
from .setting_interface import SettingInterface
|
||||
from .text_interface import TextInterface
|
||||
from .view_interface import ViewInterface
|
||||
from ..common.config import ZH_SUPPORT_URL, EN_SUPPORT_URL, cfg
|
||||
from ..common.icon import Icon
|
||||
from ..common.signal_bus import signalBus
|
||||
from ..common.translator import Translator
|
||||
from ..common import resource
|
||||
|
||||
|
||||
class MainWindow(FluentWindow):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.initWindow()
|
||||
|
||||
# create system theme listener
|
||||
self.themeListener = SystemThemeListener(self)
|
||||
|
||||
# create sub interface
|
||||
self.homeInterface = HomeInterface(self)
|
||||
self.iconInterface = IconInterface(self)
|
||||
self.basicInputInterface = BasicInputInterface(self)
|
||||
self.dateTimeInterface = DateTimeInterface(self)
|
||||
self.dialogInterface = DialogInterface(self)
|
||||
self.layoutInterface = LayoutInterface(self)
|
||||
self.menuInterface = MenuInterface(self)
|
||||
self.materialInterface = MaterialInterface(self)
|
||||
self.navigationViewInterface = NavigationViewInterface(self)
|
||||
self.scrollInterface = ScrollInterface(self)
|
||||
self.statusInfoInterface = StatusInfoInterface(self)
|
||||
self.settingInterface = SettingInterface(self)
|
||||
self.textInterface = TextInterface(self)
|
||||
self.viewInterface = ViewInterface(self)
|
||||
|
||||
# enable acrylic effect
|
||||
self.navigationInterface.setAcrylicEnabled(True)
|
||||
|
||||
self.connectSignalToSlot()
|
||||
|
||||
# add items to navigation interface
|
||||
self.initNavigation()
|
||||
self.splashScreen.finish()
|
||||
|
||||
# start theme listener
|
||||
self.themeListener.start()
|
||||
|
||||
def connectSignalToSlot(self):
|
||||
signalBus.micaEnableChanged.connect(self.setMicaEffectEnabled)
|
||||
signalBus.switchToSampleCard.connect(self.switchToSample)
|
||||
signalBus.supportSignal.connect(self.onSupport)
|
||||
|
||||
def initNavigation(self):
|
||||
# add navigation items
|
||||
t = Translator()
|
||||
self.addSubInterface(self.homeInterface, FIF.HOME, self.tr('Home'))
|
||||
self.addSubInterface(self.iconInterface, Icon.EMOJI_TAB_SYMBOLS, t.icons)
|
||||
self.navigationInterface.addSeparator()
|
||||
|
||||
pos = NavigationItemPosition.SCROLL
|
||||
self.addSubInterface(self.basicInputInterface, FIF.CHECKBOX,t.basicInput, pos)
|
||||
self.addSubInterface(self.dateTimeInterface, FIF.DATE_TIME, t.dateTime, pos)
|
||||
self.addSubInterface(self.dialogInterface, FIF.MESSAGE, t.dialogs, pos)
|
||||
self.addSubInterface(self.layoutInterface, FIF.LAYOUT, t.layout, pos)
|
||||
self.addSubInterface(self.materialInterface, FIF.PALETTE, t.material, pos)
|
||||
self.addSubInterface(self.menuInterface, Icon.MENU, t.menus, pos)
|
||||
self.addSubInterface(self.navigationViewInterface, FIF.MENU, t.navigation, pos)
|
||||
self.addSubInterface(self.scrollInterface, FIF.SCROLL, t.scroll, pos)
|
||||
self.addSubInterface(self.statusInfoInterface, FIF.CHAT, t.statusInfo, pos)
|
||||
self.addSubInterface(self.textInterface, Icon.TEXT, t.text, pos)
|
||||
self.addSubInterface(self.viewInterface, Icon.GRID, t.view, pos)
|
||||
|
||||
# add custom widget to bottom
|
||||
self.navigationInterface.addItem(
|
||||
routeKey='price',
|
||||
icon=Icon.PRICE,
|
||||
text=t.price,
|
||||
onClick=self.onSupport,
|
||||
selectable=False,
|
||||
tooltip=t.price,
|
||||
position=NavigationItemPosition.BOTTOM
|
||||
)
|
||||
self.addSubInterface(
|
||||
self.settingInterface, FIF.SETTING, self.tr('Settings'), NavigationItemPosition.BOTTOM)
|
||||
|
||||
def initWindow(self):
|
||||
self.resize(960, 780)
|
||||
self.setMinimumWidth(760)
|
||||
self.setWindowIcon(QIcon(':/gallery/images/logo.png'))
|
||||
self.setWindowTitle('PyQt-Fluent-Widgets')
|
||||
|
||||
self.setMicaEffectEnabled(cfg.get(cfg.micaEnabled))
|
||||
|
||||
# create splash screen
|
||||
self.splashScreen = SplashScreen(self.windowIcon(), self)
|
||||
self.splashScreen.setIconSize(QSize(106, 106))
|
||||
self.splashScreen.raise_()
|
||||
|
||||
desktop = QApplication.screens()[0].availableGeometry()
|
||||
w, h = desktop.width(), desktop.height()
|
||||
self.move(w//2 - self.width()//2, h//2 - self.height()//2)
|
||||
self.show()
|
||||
QApplication.processEvents()
|
||||
|
||||
def onSupport(self):
|
||||
language = cfg.get(cfg.language).value
|
||||
if language.name() == "zh_CN":
|
||||
QDesktopServices.openUrl(QUrl(ZH_SUPPORT_URL))
|
||||
else:
|
||||
QDesktopServices.openUrl(QUrl(EN_SUPPORT_URL))
|
||||
|
||||
def resizeEvent(self, e):
|
||||
super().resizeEvent(e)
|
||||
if hasattr(self, 'splashScreen'):
|
||||
self.splashScreen.resize(self.size())
|
||||
|
||||
def closeEvent(self, e):
|
||||
self.themeListener.terminate()
|
||||
self.themeListener.deleteLater()
|
||||
super().closeEvent(e)
|
||||
|
||||
def _onThemeChangedFinished(self):
|
||||
super()._onThemeChangedFinished()
|
||||
|
||||
# retry
|
||||
if self.isMicaEffectEnabled():
|
||||
QTimer.singleShot(100, lambda: self.windowEffect.setMicaEffect(self.winId(), isDarkTheme()))
|
||||
|
||||
def switchToSample(self, routeKey, index):
|
||||
""" switch to sample """
|
||||
interfaces = self.findChildren(GalleryInterface)
|
||||
for w in interfaces:
|
||||
if w.objectName() == routeKey:
|
||||
self.stackedWidget.setCurrentWidget(w, False)
|
||||
w.scrollToCard(index)
|
||||
Reference in New Issue
Block a user