237 lines
9.1 KiB
Python
237 lines
9.1 KiB
Python
|
|
# coding:utf-8
|
||
|
|
from PySide6.QtCore import Qt, Signal, QUrl, QEvent
|
||
|
|
from PySide6.QtGui import QImage, QPixmap, QDesktopServices, QPainter, QPen, QColor
|
||
|
|
from PySide6.QtWidgets import QWidget, QLabel, QVBoxLayout, QHBoxLayout, QFrame
|
||
|
|
|
||
|
|
from qfluentwidgets import (Pivot, ScrollArea, PushButton, ToolButton, FluentIcon,
|
||
|
|
isDarkTheme, IconWidget, Theme, ToolTipFilter, TitleLabel, CaptionLabel,
|
||
|
|
StrongBodyLabel, BodyLabel, toggleTheme)
|
||
|
|
from ..common.config import cfg, FEEDBACK_URL, HELP_URL, EXAMPLE_URL
|
||
|
|
from ..common.icon import Icon
|
||
|
|
from ..common.style_sheet import StyleSheet
|
||
|
|
from ..common.signal_bus import signalBus
|
||
|
|
|
||
|
|
|
||
|
|
class SeparatorWidget(QWidget):
|
||
|
|
""" Seperator widget """
|
||
|
|
|
||
|
|
def __init__(self, parent=None):
|
||
|
|
super().__init__(parent=parent)
|
||
|
|
self.setFixedSize(6, 16)
|
||
|
|
|
||
|
|
def paintEvent(self, e):
|
||
|
|
painter = QPainter(self)
|
||
|
|
pen = QPen(1)
|
||
|
|
pen.setCosmetic(True)
|
||
|
|
c = QColor(255, 255, 255, 21) if isDarkTheme() else QColor(0, 0, 0, 15)
|
||
|
|
pen.setColor(c)
|
||
|
|
painter.setPen(pen)
|
||
|
|
|
||
|
|
x = self.width() // 2
|
||
|
|
painter.drawLine(x, 0, x, self.height())
|
||
|
|
|
||
|
|
|
||
|
|
class ToolBar(QWidget):
|
||
|
|
""" Tool bar """
|
||
|
|
|
||
|
|
def __init__(self, title, subtitle, parent=None):
|
||
|
|
super().__init__(parent=parent)
|
||
|
|
#self.titleLabel = TitleLabel(title, self)
|
||
|
|
#self.subtitleLabel = CaptionLabel(subtitle, self)
|
||
|
|
|
||
|
|
#顶部导航
|
||
|
|
self.pivot = Pivot(self)
|
||
|
|
|
||
|
|
self.pivot.addItem(routeKey="songInterface", text="投料中心", onClick=lambda: print("Song"))
|
||
|
|
self.pivot.addItem(routeKey="albumInterface", text="捏合中心", onClick=lambda: print("Album"))
|
||
|
|
self.pivot.addItem(routeKey="artistInterface", text="成品", onClick=lambda: print("Artist"))
|
||
|
|
self.pivot.addItem(routeKey="contorlInterface", text="控制中心", onClick=lambda: print("Artist"))
|
||
|
|
|
||
|
|
self.pivot.setCurrentItem("albumInterface")
|
||
|
|
|
||
|
|
#self.documentButton = PushButton(
|
||
|
|
#self.tr('Documentation'), self, FluentIcon.DOCUMENT)
|
||
|
|
#self.sourceButton = PushButton(self.tr('Source'), self, FluentIcon.GITHUB)
|
||
|
|
#self.themeButton = ToolButton(FluentIcon.CONSTRACT, self)
|
||
|
|
self.separator = SeparatorWidget(self)
|
||
|
|
self.supportButton = ToolButton(FluentIcon.HEART, self)
|
||
|
|
self.feedbackButton = ToolButton(FluentIcon.FEEDBACK, self)
|
||
|
|
|
||
|
|
self.vBoxLayout = QVBoxLayout(self)
|
||
|
|
self.buttonLayout = QHBoxLayout()
|
||
|
|
#self.vBoxLayout2 = QVBoxLayout()
|
||
|
|
|
||
|
|
self.__initWidget()
|
||
|
|
|
||
|
|
def __initWidget(self):
|
||
|
|
self.setFixedHeight(88)
|
||
|
|
self.vBoxLayout.setSpacing(0)
|
||
|
|
self.vBoxLayout.setContentsMargins(36, 22, 36, 12)
|
||
|
|
#self.vBoxLayout.addWidget(self.titleLabel)
|
||
|
|
self.vBoxLayout.addSpacing(4)
|
||
|
|
#self.vBoxLayout.addWidget(self.subtitleLabel)
|
||
|
|
self.vBoxLayout.addSpacing(4)
|
||
|
|
self.vBoxLayout.addLayout(self.buttonLayout, 1)
|
||
|
|
#self.vBoxLayout.addLayout(self.vBoxLayout2, 1)
|
||
|
|
self.vBoxLayout.setAlignment(Qt.AlignTop)
|
||
|
|
|
||
|
|
# image=QImage("D:/Downloads/PyQt-Fluent-Widgets-PySide6/app/resource/images/chidanta4.jpg")
|
||
|
|
# pixmap = QPixmap.fromImage(image)
|
||
|
|
# label = QLabel()
|
||
|
|
# label.setPixmap(pixmap)
|
||
|
|
# self.vBoxLayout2.addWidget(label, 0, Qt.AlignRight)
|
||
|
|
|
||
|
|
self.buttonLayout.setSpacing(4)
|
||
|
|
self.buttonLayout.setContentsMargins(0, 0, 0, 0)
|
||
|
|
self.buttonLayout.addWidget(self.pivot, 0, Qt.AlignLeft)
|
||
|
|
#self.buttonLayout.addWidget(self.documentButton, 0, Qt.AlignLeft)
|
||
|
|
#self.buttonLayout.addWidget(self.sourceButton, 0, Qt.AlignLeft)
|
||
|
|
self.buttonLayout.addStretch(1)
|
||
|
|
#self.buttonLayout.addWidget(self.themeButton, 0, Qt.AlignRight)
|
||
|
|
self.buttonLayout.addWidget(self.separator, 0, Qt.AlignRight)
|
||
|
|
self.buttonLayout.addWidget(self.supportButton, 0, Qt.AlignRight)
|
||
|
|
self.buttonLayout.addWidget(self.feedbackButton, 0, Qt.AlignRight)
|
||
|
|
self.buttonLayout.setAlignment(Qt.AlignVCenter | Qt.AlignLeft)
|
||
|
|
|
||
|
|
#self.themeButton.installEventFilter(ToolTipFilter(self.themeButton))
|
||
|
|
self.supportButton.installEventFilter(ToolTipFilter(self.supportButton))
|
||
|
|
self.feedbackButton.installEventFilter(
|
||
|
|
ToolTipFilter(self.feedbackButton))
|
||
|
|
#self.themeButton.setToolTip(self.tr('Toggle theme'))
|
||
|
|
self.supportButton.setToolTip(self.tr('Support me'))
|
||
|
|
self.feedbackButton.setToolTip(self.tr('Send feedback'))
|
||
|
|
|
||
|
|
#self.themeButton.clicked.connect(lambda: toggleTheme(True))
|
||
|
|
self.supportButton.clicked.connect(signalBus.supportSignal)
|
||
|
|
# self.documentButton.clicked.connect(
|
||
|
|
# lambda: QDesktopServices.openUrl(QUrl(HELP_URL)))
|
||
|
|
# self.sourceButton.clicked.connect(
|
||
|
|
# lambda: QDesktopServices.openUrl(QUrl(EXAMPLE_URL)))
|
||
|
|
self.feedbackButton.clicked.connect(
|
||
|
|
lambda: QDesktopServices.openUrl(QUrl(FEEDBACK_URL)))
|
||
|
|
|
||
|
|
#self.subtitleLabel.setTextColor(QColor(96, 96, 96), QColor(216, 216, 216))
|
||
|
|
|
||
|
|
|
||
|
|
class ExampleCard(QWidget):
|
||
|
|
""" Example card """
|
||
|
|
|
||
|
|
def __init__(self, title, widget: QWidget, sourcePath, stretch=0, parent=None):
|
||
|
|
super().__init__(parent=parent)
|
||
|
|
self.widget = widget
|
||
|
|
self.stretch = stretch
|
||
|
|
|
||
|
|
self.titleLabel = StrongBodyLabel(title, self)
|
||
|
|
self.card = QFrame(self)
|
||
|
|
|
||
|
|
#self.sourceWidget = QFrame(self.card)
|
||
|
|
self.sourcePath = sourcePath
|
||
|
|
# self.sourcePathLabel = BodyLabel(
|
||
|
|
# self.tr('Source code'), self.sourceWidget)
|
||
|
|
#self.linkIcon = IconWidget(FluentIcon.LINK, self.sourceWidget)
|
||
|
|
|
||
|
|
self.vBoxLayout = QVBoxLayout(self)
|
||
|
|
self.cardLayout = QVBoxLayout(self.card)
|
||
|
|
self.topLayout = QHBoxLayout()
|
||
|
|
#self.bottomLayout = QHBoxLayout(self.sourceWidget)
|
||
|
|
|
||
|
|
self.__initWidget()
|
||
|
|
|
||
|
|
def __initWidget(self):
|
||
|
|
#self.linkIcon.setFixedSize(16, 16)
|
||
|
|
self.__initLayout()
|
||
|
|
|
||
|
|
#self.sourceWidget.setCursor(Qt.PointingHandCursor)
|
||
|
|
#self.sourceWidget.installEventFilter(self)
|
||
|
|
|
||
|
|
self.card.setObjectName('card')
|
||
|
|
#self.sourceWidget.setObjectName('sourceWidget')
|
||
|
|
|
||
|
|
def __initLayout(self):
|
||
|
|
self.vBoxLayout.setSizeConstraint(QVBoxLayout.SetMinimumSize)
|
||
|
|
self.cardLayout.setSizeConstraint(QVBoxLayout.SetMinimumSize)
|
||
|
|
self.topLayout.setSizeConstraint(QHBoxLayout.SetMinimumSize)
|
||
|
|
|
||
|
|
self.vBoxLayout.setSpacing(12)
|
||
|
|
self.vBoxLayout.setContentsMargins(0, 0, 0, 0)
|
||
|
|
self.topLayout.setContentsMargins(12, 12, 12, 12)
|
||
|
|
#self.bottomLayout.setContentsMargins(18, 18, 18, 18)
|
||
|
|
self.cardLayout.setContentsMargins(0, 0, 0, 0)
|
||
|
|
|
||
|
|
self.vBoxLayout.addWidget(self.titleLabel, 0, Qt.AlignTop)
|
||
|
|
self.vBoxLayout.addWidget(self.card, 0, Qt.AlignTop)
|
||
|
|
self.vBoxLayout.setAlignment(Qt.AlignTop)
|
||
|
|
|
||
|
|
self.cardLayout.setSpacing(0)
|
||
|
|
self.cardLayout.setAlignment(Qt.AlignTop)
|
||
|
|
self.cardLayout.addLayout(self.topLayout, 0)
|
||
|
|
#self.cardLayout.addWidget(self.sourceWidget, 0, Qt.AlignBottom)
|
||
|
|
|
||
|
|
self.widget.setParent(self.card)
|
||
|
|
self.topLayout.addWidget(self.widget)
|
||
|
|
if self.stretch == 0:
|
||
|
|
self.topLayout.addStretch(1)
|
||
|
|
|
||
|
|
self.widget.show()
|
||
|
|
|
||
|
|
#self.bottomLayout.addWidget(self.sourcePathLabel, 0, Qt.AlignLeft)
|
||
|
|
#self.bottomLayout.addStretch(1)
|
||
|
|
#self.bottomLayout.addWidget(self.linkIcon, 0, Qt.AlignRight)
|
||
|
|
#self.bottomLayout.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
|
||
|
|
|
||
|
|
def eventFilter(self, obj, e):
|
||
|
|
if obj is self.sourceWidget:
|
||
|
|
if e.type() == QEvent.MouseButtonRelease:
|
||
|
|
QDesktopServices.openUrl(QUrl(self.sourcePath))
|
||
|
|
|
||
|
|
return super().eventFilter(obj, e)
|
||
|
|
|
||
|
|
|
||
|
|
class GalleryInterface(ScrollArea):
|
||
|
|
""" Gallery interface """
|
||
|
|
|
||
|
|
def __init__(self, title: str, subtitle: str, parent=None):
|
||
|
|
"""
|
||
|
|
Parameters
|
||
|
|
----------
|
||
|
|
title: str
|
||
|
|
The title of gallery
|
||
|
|
|
||
|
|
subtitle: str
|
||
|
|
The subtitle of gallery
|
||
|
|
|
||
|
|
parent: QWidget
|
||
|
|
parent widget
|
||
|
|
"""
|
||
|
|
super().__init__(parent=parent)
|
||
|
|
self.view = QWidget(self)
|
||
|
|
#顶部导航栏
|
||
|
|
#self.toolBar = ToolBar(title, subtitle, self)
|
||
|
|
self.vBoxLayout = QVBoxLayout(self.view)
|
||
|
|
|
||
|
|
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
||
|
|
#self.setViewportMargins(0, self.toolBar.height(), 0, 0)
|
||
|
|
self.setWidget(self.view)
|
||
|
|
self.setWidgetResizable(True)
|
||
|
|
|
||
|
|
self.vBoxLayout.setSpacing(30)
|
||
|
|
self.vBoxLayout.setAlignment(Qt.AlignTop)
|
||
|
|
self.vBoxLayout.setContentsMargins(36, 20, 36, 36)
|
||
|
|
|
||
|
|
self.view.setObjectName('view')
|
||
|
|
StyleSheet.GALLERY_INTERFACE.apply(self)
|
||
|
|
|
||
|
|
def addExampleCard(self, title, widget, sourcePath: str, stretch=0):
|
||
|
|
card = ExampleCard(title, widget, sourcePath, stretch, self.view)
|
||
|
|
self.vBoxLayout.addWidget(card, 0, Qt.AlignTop)
|
||
|
|
return card
|
||
|
|
|
||
|
|
def scrollToCard(self, index: int):
|
||
|
|
""" scroll to example card """
|
||
|
|
w = self.vBoxLayout.itemAt(index).widget()
|
||
|
|
self.verticalScrollBar().setValue(w.y())
|
||
|
|
|
||
|
|
def resizeEvent(self, e):
|
||
|
|
super().resizeEvent(e)
|
||
|
|
#self.toolBar.resize(self.width(), self.toolBar.height())
|