from PySide6.QtGui import QDesktopServices, Qt, QColor from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QWidget from qfluentwidgets import FluentIcon, GroupHeaderCardWidget, PushButton, ImageLabel, \ TitleLabel, HeaderCardWidget, BodyLabel, HyperlinkLabel, SingleDirectionScrollArea from qfluentwidgets.components.widgets.card_widget import CardSeparator from module.about.schema import ThirdParty from ui.components.widget import Widget from utils.function import RELEASE_ENV if RELEASE_ENV: from build_info import * class AboutCard(HeaderCardWidget): def __init__(self, parent=None): super().__init__(parent) self.setTitle('关于本程序') self.vBoxLayout = QVBoxLayout(self) self.vBoxLayout.setContentsMargins(0, 0, 0, 0) self.lineVBoxLayout = QVBoxLayout(self) self.lineVBoxLayout.setContentsMargins(24, 16, 24, 8) self.textVBoxLayout = QVBoxLayout(self) self.textVBoxLayout.setContentsMargins(24, 8, 24, 16) self.viewLayout.setContentsMargins(0, 0, 0, 0) self.addLine('程序名称', '教学工具箱') if RELEASE_ENV: self.addLine('程序版本', '1.0.0#' + GIT_HASH) self.addLine('作者', '许方杰') if RELEASE_ENV: self.addLine('构建时间', BUILD_TIME) self.addLine('许可证', 'GNU 通用公共许可证 第三版(GPLv3)') self.addLineUseLink('项目主页', 'https://cantyonion.site/git/cantyonion/JITToolBox') self.addText( '教学工具箱是自由软件;您可以依据自由软件基金会发布的 GNU 通用公共许可证第三版条款,重新发布或修改它;许可证应使用第三版或(按您的选择)任何其更新的版本。') self.addText( '教学工具箱是以希望它有用为目的而发布的,但不附带任何担保;甚至没有适销性或特定用途适用性的隐含担保。请参看 GNU GPL 第三版了解更详细的内容。') self.addTextWithLink('您应该已收到一份 GNU 通用公共许可证的副本;如果没有,请查看<', 'https://www.gnu.org/licenses/gpl-3.0.html') self.vBoxLayout.addLayout(self.lineVBoxLayout) self.vBoxLayout.addWidget(CardSeparator(self)) self.vBoxLayout.addLayout(self.textVBoxLayout) self.viewLayout.addLayout(self.vBoxLayout) def addLine(self, title: str, content: str): hBox = QHBoxLayout(self) mTitlte = BodyLabel(title, self) mContent = BodyLabel(content, self) mContent.setTextColor(QColor(96, 96, 96), QColor(206, 206, 206)) mTitlte.setFixedWidth(100) hBox.addWidget(mTitlte) hBox.addWidget(mContent) self.lineVBoxLayout.addLayout(hBox) def addLineUseLink(self, title: str, content: str): hBox = QHBoxLayout(self) mTitle = BodyLabel(title, self) mContent = HyperlinkLabel(content, content) mTitle.setFixedWidth(100) hBox.addWidget(mTitle) hBox.addWidget(mContent) self.lineVBoxLayout.addLayout(hBox) mContent.clicked.connect(lambda: QDesktopServices.openUrl(content)) def addText(self, text: str): label = BodyLabel(text, self) label.setWordWrap(True) self.textVBoxLayout.addWidget(label) def addLink(self, text: str, url: str): link = HyperlinkLabel(url, text) link.setUrl(url) self.textVBoxLayout.addWidget(link) def addTextWithLink(self, text: str, url: str): hBox = QHBoxLayout(self) label = BodyLabel(text, self) link = HyperlinkLabel(url, url) link.setContentsMargins(0, 0, 0, 0) hBox.addWidget(label) hBox.addWidget(link) hBox.addWidget(BodyLabel(">。", self)) self.textVBoxLayout.addLayout(hBox) link.clicked.connect(lambda: QDesktopServices.openUrl(url)) class AboutMain(QWidget): def __init__(self, parent=None): super().__init__(parent) self.logoImage = ImageLabel(':/images/logo.png') self.logoImage.scaledToHeight(100) self.appNameLabel = TitleLabel('教学工具箱 🛠️') self.hBox = QHBoxLayout() self.hBox.addWidget(self.logoImage, 0, Qt.AlignLeft) self.hBox.addWidget(self.appNameLabel, 1, Qt.AlignLeft) third_parties = [ ThirdParty("PySide6", "https://qt.io", ":/images/3rd/qt.png"), ThirdParty("QFluentWidgets", "https://qfluentwidgets.com", ":/images/3rd/qfluentwidgets.png"), ThirdParty("openpyxl", "https://openpyxl.readthedocs.io/en/stable"), ThirdParty("python-docx", "https://github.com/python-openxml/python-docx"), ThirdParty("Matplotlib", "https://matplotlib.org", ":/images/3rd/matplotlib.svg"), ThirdParty("packaging", "https://github.com/pypa/packaging", ":/images/3rd/packaging.png"), ThirdParty("pywin32", "https://github.com/mhammond/pywin32") ] third_parties.sort(key=lambda item: item.name.lower()) self.group_card = GroupHeaderCardWidget(self) self.group_card.setTitle("第三方框架") self.vbox = QVBoxLayout(self) self.vbox.addLayout(self.hBox) self.vbox.addWidget(AboutCard(self)) self.vbox.addWidget(self.group_card) self.vbox.addStretch(1) [self.addThirdParty(x) for x in third_parties] def addThirdParty(self, third_party: ThirdParty): button = PushButton(FluentIcon.LINK, "访问网站") button.setFixedWidth(120) self.group_card.addGroup(third_party.qrc if third_party.qrc else FluentIcon.LAYOUT, third_party.name, third_party.url, button) button.clicked.connect(lambda: QDesktopServices.openUrl(third_party.url)) class AboutWidget(Widget): def __init__(self, key: str, parent=None): super().__init__(key, parent) self.scrollArea = SingleDirectionScrollArea(orient=Qt.Vertical) self.scrollArea.setWidget(AboutMain(self)) self.scrollArea.setWidgetResizable(True) self.scrollArea.enableTransparentBackground() self.vBox = QVBoxLayout(self) self.vBox.setContentsMargins(0, 0, 0, 0) self.vBox.setSpacing(0) self.vBox.addWidget(self.scrollArea)