From 8f8e3e4ba7f6d84b34039040f32cbbb7a8207134 Mon Sep 17 00:00:00 2001
From: KenanZhu <3471685733@qq.com>
Date: Fri, 19 Jun 2026 10:22:36 +0800
Subject: [PATCH] =?UTF-8?q?refactor(gui):=20=E8=87=AA=E5=AE=9A=E4=B9=89?=
=?UTF-8?q?=E4=B8=BB=E9=A2=98=E6=8E=A7=E4=BB=B6=E5=8F=8A=E5=87=BD=E6=95=B0?=
=?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=EF=BC=8C=E7=BB=9F=E4=B8=80=20Custom?=
=?UTF-8?q?Theme=20=E5=89=8D=E7=BC=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/gui/ALSettingsWidget.py | 157 +++----
src/gui/resources/ui/ALSettingsWidget.ui | 546 +++++++++++------------
2 files changed, 344 insertions(+), 359 deletions(-)
diff --git a/src/gui/ALSettingsWidget.py b/src/gui/ALSettingsWidget.py
index fd3d786..7dab1f1 100644
--- a/src/gui/ALSettingsWidget.py
+++ b/src/gui/ALSettingsWidget.py
@@ -115,22 +115,23 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
):
self.setWindowFlags(Qt.WindowType.Window)
- self.NavigationList.setCurrentRow(0)
- self.populateStyles()
self.setNavigationIcons()
color = QApplication.instance().palette().color(
QApplication.instance().palette().ColorRole.WindowText
).name()
- self.BrowseQssButton.setIcon(qta.icon("fa6s.plus", color=color))
- self.BrowseQssButton.setText("")
- self.RemoveThemeButton.setIcon(qta.icon("fa6s.minus", color=color))
- self.RemoveThemeButton.setText("")
- self.ThemeInfoLabel.setTextFormat(Qt.TextFormat.RichText)
- self.ThemeInfoLabel.setStyleSheet(
+ self.ImportCustomThemeButton.setIcon(qta.icon("fa6s.plus", color=color))
+ self.ImportCustomThemeButton.setText("")
+ self.RemoveCustomThemeButton.setIcon(qta.icon("fa6s.minus", color=color))
+ self.RemoveCustomThemeButton.setText("")
+ self.CustomThemeInfoLabel.setTextFormat(Qt.TextFormat.RichText)
+ self.CustomThemeInfoLabel.setStyleSheet(
"border: 1px solid palette(mid);"\
"border-radius: 2px;"\
"padding: 5px;"
)
+ self.NavigationList.setCurrentRow(0)
+ self.populateStyles()
+ self.populateCustomThemes()
def setNavigationIcons(
self
@@ -149,14 +150,32 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
self.StyleComboBox.clear()
self.StyleComboBox.addItems(QStyleFactory.keys())
+ def populateCustomThemes(
+ self
+ ):
+
+ self.CustomThemeComboBox.blockSignals(True)
+ self.CustomThemeComboBox.clear()
+ self.CustomThemeComboBox.addItem("默认", "")
+ self.__theme_cache = {}
+ themes = themeInstance().listThemes()
+ for t in themes:
+ name = t.get("name", "")
+ file = t.get("file", name)
+ author = t.get("author", "")
+ if name:
+ self.__theme_cache[file] = t
+ self.CustomThemeComboBox.addItem(name, file)
+ self.CustomThemeComboBox.blockSignals(False)
+
def connectSignals(
self
):
- self.BrowseQssButton.clicked.connect(self.onImportThemeButtonClicked)
- self.RemoveThemeButton.clicked.connect(self.onRemoveThemeButtonClicked)
- self.ThemeComboBox.currentIndexChanged.connect(self.onThemeComboBoxChanged)
- self.ResetThemeButton.clicked.connect(self.onResetThemeButtonClicked)
+ self.ImportCustomThemeButton.clicked.connect(self.onImportCustomThemeButtonClicked)
+ self.RemoveCustomThemeButton.clicked.connect(self.onRemoveCustomThemeButtonClicked)
+ self.CustomThemeComboBox.currentIndexChanged.connect(self.onCustomThemeComboBoxChanged)
+ self.ResetCustomThemeButton.clicked.connect(self.onResetCustomThemeButtonClicked)
self.CancelButton.clicked.connect(self.onCancelButtonClicked)
self.ApplyButton.clicked.connect(self.onApplyButtonClicked)
self.ConfirmButton.clicked.connect(self.onConfirmButtonClicked)
@@ -181,33 +200,20 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
if index < 0:
index = 0
self.StyleComboBox.setCurrentIndex(index)
- self.populateThemeList()
if custom_theme:
- idx = self.ThemeComboBox.findData(custom_theme)
+ idx = self.CustomThemeComboBox.findData(custom_theme)
if idx >= 0:
- self.ThemeComboBox.setCurrentIndex(idx)
- self.updateThemeStatus()
- self.updateThemeInfo()
+ self.CustomThemeComboBox.setCurrentIndex(idx)
+ self.updateCustomThemeInfo()
+ self.updateCustomThemeStatus()
- def updateThemeStatus(
+ def updateCustomThemeInfo(
self
):
- file = self.ThemeComboBox.currentData()
- t = self.__theme_cache.get(file) if file else None
- name = t.get("name", "") if t else ""
- if name:
- self.QssStatusLabel.setText(f"当前使用 {name} 主题。")
- else:
- self.QssStatusLabel.setText("当前使用 默认 主题。")
-
- def updateThemeInfo(
- self
- ):
-
- file = self.ThemeComboBox.currentData()
+ file = self.CustomThemeComboBox.currentData()
if not file:
- self.ThemeInfoLabel.setText("")
+ self.CustomThemeInfoLabel.setText("")
return
t = self.__theme_cache.get(file)
if t:
@@ -215,13 +221,25 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
author = t.get("author", "未知作者")
need_theme = t.get("need_theme", "both")
brief = t.get("brief", "没有相关简介")
- self.ThemeInfoLabel.setText(
+ self.CustomThemeInfoLabel.setText(
f"{name} - 适用于 {_themeToReadable(need_theme)} 主题
"
f"作者:{author}
"
f"{brief}"
)
else:
- self.ThemeInfoLabel.setText("")
+ self.CustomThemeInfoLabel.setText("")
+
+ def updateCustomThemeStatus(
+ self
+ ):
+
+ file = self.CustomThemeComboBox.currentData()
+ t = self.__theme_cache.get(file) if file else None
+ name = t.get("name", "") if t else ""
+ if name:
+ self.CustomThemeStatusLabel.setText(f"当前使用 {name} 主题。")
+ else:
+ self.CustomThemeStatusLabel.setText("当前使用 默认 主题。")
def syncRadioFromNeedTheme(
self,
@@ -247,7 +265,7 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
else:
theme = "system"
style = self.StyleComboBox.currentText()
- custom_theme = self.ThemeComboBox.currentData() or ""
+ custom_theme = self.CustomThemeComboBox.currentData() or ""
if not custom_theme:
custom_theme = ""
return theme, style, custom_theme
@@ -268,8 +286,8 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
theme, _, _ = self.collectSettings()
self.__cfg_mgr.set(CfgKey.GLOBAL.APPEARANCE.THEME, theme)
self.setNavigationIcons()
- self.updateThemeStatus()
- self.updateThemeInfo()
+ self.updateCustomThemeStatus()
+ self.updateCustomThemeInfo()
self.__original_theme = theme
self.__original_custom_theme = custom_theme if custom_theme else ""
self.__original_style = getActiveStyle()
@@ -290,30 +308,12 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
return True
return False
- def populateThemeList(
- self
- ):
-
- self.ThemeComboBox.blockSignals(True)
- self.ThemeComboBox.clear()
- self.ThemeComboBox.addItem("默认", "")
- self.__theme_cache = {}
- themes = themeInstance().listThemes()
- for t in themes:
- name = t.get("name", "")
- file = t.get("file", name)
- author = t.get("author", "")
- if name:
- self.__theme_cache[file] = t
- self.ThemeComboBox.addItem(name, file)
- self.ThemeComboBox.blockSignals(False)
-
@Slot()
- def onRemoveThemeButtonClicked(
+ def onRemoveCustomThemeButtonClicked(
self
):
- file = self.ThemeComboBox.currentData()
+ file = self.CustomThemeComboBox.currentData()
if not file:
QMessageBox.information(
self,
@@ -334,10 +334,10 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
return
try:
themeInstance().removeTheme(file)
- self.populateThemeList()
- self.ThemeComboBox.setCurrentIndex(0)
- self.updateThemeStatus()
- self.updateThemeInfo()
+ self.populateCustomThemes()
+ self.CustomThemeComboBox.setCurrentIndex(0)
+ self.updateCustomThemeStatus()
+ self.updateCustomThemeInfo()
except Exception as e:
QMessageBox.warning(
self,
@@ -346,7 +346,7 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
)
@Slot()
- def onImportThemeButtonClicked(
+ def onImportCustomThemeButtonClicked(
self
):
@@ -360,12 +360,12 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
return
try:
file_id = themeInstance().importTheme(file_path)
- self.populateThemeList()
- idx = self.ThemeComboBox.findData(file_id)
+ self.populateCustomThemes()
+ idx = self.CustomThemeComboBox.findData(file_id)
if idx >= 0:
- self.ThemeComboBox.setCurrentIndex(idx)
- self.updateThemeStatus()
- self.updateThemeInfo()
+ self.CustomThemeComboBox.setCurrentIndex(idx)
+ self.updateCustomThemeStatus()
+ self.updateCustomThemeInfo()
except Exception as e:
QMessageBox.warning(
self,
@@ -374,36 +374,37 @@ class ALSettingsWidget(CenterOnParentMixin, QWidget, Ui_ALSettingsWidget):
)
@Slot()
- def onThemeComboBoxChanged(
+ def onCustomThemeComboBoxChanged(
self,
index: int
):
- self.updateThemeInfo()
+ self.updateCustomThemeInfo()
+ # no status update, because custom theme is not applied yet.
@Slot()
- def onResetThemeButtonClicked(
+ def onResetCustomThemeButtonClicked(
self
):
- self.ThemeComboBox.blockSignals(True)
+ self.CustomThemeComboBox.blockSignals(True)
if self.__original_custom_theme:
- idx = self.ThemeComboBox.findData(self.__original_custom_theme)
+ idx = self.CustomThemeComboBox.findData(self.__original_custom_theme)
if idx >= 0:
- self.ThemeComboBox.setCurrentIndex(idx)
+ self.CustomThemeComboBox.setCurrentIndex(idx)
else:
- self.ThemeComboBox.setCurrentIndex(0)
+ self.CustomThemeComboBox.setCurrentIndex(0)
else:
- self.ThemeComboBox.setCurrentIndex(0)
- self.ThemeComboBox.blockSignals(False)
+ self.CustomThemeComboBox.setCurrentIndex(0)
+ self.CustomThemeComboBox.blockSignals(False)
if self.__original_theme == "light":
self.LightThemeRadio.setChecked(True)
elif self.__original_theme == "dark":
self.DarkThemeRadio.setChecked(True)
else:
self.SystemThemeRadio.setChecked(True)
- self.updateThemeStatus()
- self.updateThemeInfo()
+ self.updateCustomThemeInfo()
+ self.updateCustomThemeStatus()
@Slot()
def onCancelButtonClicked(
diff --git a/src/gui/resources/ui/ALSettingsWidget.ui b/src/gui/resources/ui/ALSettingsWidget.ui
index 413f8f6..45ed0e8 100644
--- a/src/gui/resources/ui/ALSettingsWidget.ui
+++ b/src/gui/resources/ui/ALSettingsWidget.ui
@@ -115,9 +115,9 @@
0
- 0
- 450
- 380
+ -51
+ 397
+ 434
@@ -138,324 +138,308 @@
-
-
- 主题模式
-
-
-
- 5
-
-
- 3
-
-
- 3
-
-
- 3
-
-
- 3
-
-
-
-
-
- 浅色
-
-
-
- -
-
-
- 深色
-
-
-
- -
-
-
- 跟随系统
-
-
- true
-
-
-
-
-
-
- -
-
-
- 界面风格
-
-
-
- 5
-
-
- 3
-
-
- 3
-
-
- 3
-
-
- 3
-
-
-
-
+
+ 主题模式
+
+
5
+
+ 3
+
+
+ 3
+
+
+ 3
+
+
+ 3
+
-
-
-
-
- 100
- 25
-
-
-
-
- 100
- 25
-
-
+
- 应用程序样式:
+ 浅色
-
-
-
-
- 160
- 25
-
+
+
+ 深色
+
+
+
+ -
+
+
+ 跟随系统
+
+
+ true
-
- -
-
-
- 更改样式将在下次启动应用程序时生效。
-
-
-
-
-
-
- -
-
-
- 自定义外观
-
-
-
- 5
-
-
- 3
-
-
- 3
-
-
- 3
-
-
- 3
-
-
-
-
-
- 选择一个主题,或导入新的主题文件:
-
-
- true
-
-
-
- -
-
+
+
+ -
+
+
+ 界面风格
+
+
5
+
+ 3
+
+
+ 3
+
+
+ 3
+
+
+ 3
+
-
-
-
-
- 160
- 25
-
+
+
+ 5
+
+
-
+
+
+
+ 100
+ 25
+
+
+
+
+ 100
+ 25
+
+
+
+ 应用程序样式:
+
+
+
+ -
+
+
+
+ 160
+ 25
+
+
+
+
+
+
+ -
+
+
+ 更改样式将在下次启动应用程序时生效。
+
+
+
+
+
+
+ -
+
+
+ 自定义外观
+
+
+
+ 5
+
+
+ 3
+
+
+ 3
+
+
+ 3
+
+
+ 3
+
+
-
+
+
+ 选择一个主题,或导入新的主题文件:
+
+
+ true
-
-
+
+
+ 5
+
+
-
+
+
+
+ 160
+ 25
+
+
+
+
+ -
+
+
+
+ 0
+ 25
+
+
+
+ false
+
+
+ 选择或输入 QSS 样式表文件路径...
+
+
+
+ -
+
+
+
+ 25
+ 25
+
+
+
+
+ 25
+ 25
+
+
+
+ +
+
+
+
+ -
+
+
+
+ 25
+ 25
+
+
+
+
+ 25
+ 25
+
+
+
+ -
+
+
+
+
+
+ -
+
0
- 25
+ 60
-
- false
+
+
-
- 选择或输入 QSS 样式表文件路径...
+
+ Qt::TextFormat::RichText
+
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
+
+ true
-
-
-
-
- 25
- 25
-
+
+
+ 5
-
-
- 25
- 25
-
-
-
- +
-
-
+
-
+
+
+
+ 80
+ 25
+
+
+
+ 重置主题
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
-
-
-
-
- 25
- 25
-
-
-
-
- 25
- 25
-
-
+
- -
+ 当前使用程序 默认 外观。
+
+
+ true
-
- -
-
-
-
- 0
- 60
-
-
-
-
-
-
- Qt::TextFormat::RichText
-
-
- Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignTop
-
-
- true
-
-
-
- -
-
-
- 5
-
-
-
-
-
-
- 80
- 25
-
-
-
- false
-
-
- 应用样式
-
-
-
- -
-
-
-
- 80
- 25
-
-
-
- 重置主题
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
- -
-
-
- 当前使用程序 默认 外观。
-
-
- true
-
-
-
-
-
-
- -
-
-
- Qt::Orientation::Vertical
-
-
-
- 20
- 40
-
-
-
-
-
+
+
+ -
+
+
+ Qt::Orientation::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
-
-
-
-
+
+
+
-