修复若干bug
This commit is contained in:
+80
-1
@@ -6,10 +6,12 @@ from PyQt6.QtWidgets import (
|
||||
QCheckBox, QGroupBox, QFormLayout, QSpinBox, QFrame
|
||||
)
|
||||
from PyQt6.QtCore import Qt, QSize
|
||||
from PyQt6.QtWidgets import QMessageBox
|
||||
from PyQt6.QtGui import QIcon, QPixmap
|
||||
import qtawesome as qta
|
||||
from db import database
|
||||
import ui.theme as theme
|
||||
import ui.dialog_style as dialog_style
|
||||
|
||||
|
||||
class SettingsWindow(QDialog):
|
||||
@@ -50,7 +52,10 @@ class SettingsWindow(QDialog):
|
||||
("fa5s.window-maximize", "窗口"),
|
||||
("fa5s.rocket", "启动"),
|
||||
("fa5s.heart", "捐赠"),
|
||||
("fa5s.eraser", "初始化"),
|
||||
]
|
||||
self._nav_ready = False
|
||||
self._block_nav = False
|
||||
for icon_name, label in pages:
|
||||
try:
|
||||
icon = qta.icon(icon_name, color="#888")
|
||||
@@ -59,6 +64,8 @@ class SettingsWindow(QDialog):
|
||||
# 防止图标名不存在导致设置页直接报错
|
||||
icon = qta.icon("fa5s.rocket", color="#888")
|
||||
item = QListWidgetItem(icon, label)
|
||||
if label == "初始化":
|
||||
item.setData(Qt.ItemDataRole.UserRole, "init")
|
||||
self.nav.addItem(item)
|
||||
self.nav.setCurrentRow(0)
|
||||
self.nav.currentRowChanged.connect(self._on_nav)
|
||||
@@ -69,6 +76,11 @@ class SettingsWindow(QDialog):
|
||||
self.stack.addWidget(self._page_window())
|
||||
self.stack.addWidget(self._page_startup())
|
||||
self.stack.addWidget(self._page_donate())
|
||||
self.stack.addWidget(self._page_initialization())
|
||||
# 此时 stack 已就绪,允许导航回调正常工作
|
||||
self._nav_ready = True
|
||||
self._last_nav_index = self.nav.currentRow()
|
||||
self.stack.setCurrentIndex(self._last_nav_index)
|
||||
|
||||
# 分割线
|
||||
line = QFrame()
|
||||
@@ -312,6 +324,29 @@ class SettingsWindow(QDialog):
|
||||
self._donate_card = card
|
||||
return page
|
||||
|
||||
def _page_initialization(self) -> QWidget:
|
||||
page = QWidget()
|
||||
layout = QVBoxLayout(page)
|
||||
layout.setContentsMargins(24, 20, 24, 20)
|
||||
layout.setSpacing(16)
|
||||
|
||||
layout.addWidget(self._section_title("初始化"))
|
||||
|
||||
desc = QLabel(
|
||||
"点击左侧「初始化」页签后,将弹出确认提醒。\n"
|
||||
"确认后会清空所有分组和程序(不可撤销)。"
|
||||
)
|
||||
desc.setWordWrap(True)
|
||||
desc.setStyleSheet("color:#888; font-size:13px; line-height:1.6;")
|
||||
layout.addWidget(desc)
|
||||
|
||||
self._init_status_lbl = QLabel("")
|
||||
self._init_status_lbl.setStyleSheet("font-size:12px; color:#f90;")
|
||||
layout.addWidget(self._init_status_lbl)
|
||||
layout.addStretch()
|
||||
|
||||
return page
|
||||
|
||||
def _open_donate_image(self, img_path: str):
|
||||
"""点击二维码后的弹窗大图查看。"""
|
||||
t = theme.current()
|
||||
@@ -386,7 +421,51 @@ class SettingsWindow(QDialog):
|
||||
return line
|
||||
|
||||
def _on_nav(self, index: int):
|
||||
self.stack.setCurrentIndex(index)
|
||||
if self._block_nav:
|
||||
return
|
||||
|
||||
if not getattr(self, "_nav_ready", False) or not hasattr(self, "stack"):
|
||||
return
|
||||
|
||||
item = self.nav.item(index)
|
||||
is_init_tab = bool(item and item.data(Qt.ItemDataRole.UserRole) == "init")
|
||||
|
||||
if not is_init_tab:
|
||||
self.stack.setCurrentIndex(index)
|
||||
self._last_nav_index = index
|
||||
return
|
||||
|
||||
ret = dialog_style.question(
|
||||
self,
|
||||
"初始化",
|
||||
"提醒请谨慎操作!!!!!\n\n"
|
||||
"此操作会清空所有分组和程序,且无法撤销。是否继续?",
|
||||
icon=QMessageBox.Icon.Warning,
|
||||
)
|
||||
if ret == QMessageBox.StandardButton.Yes:
|
||||
try:
|
||||
self._panel.reset_groups_and_items()
|
||||
except Exception as e:
|
||||
# 初始化失败也要尽量让用户知道原因
|
||||
dialog_style.warning(self, "初始化失败", f"清空数据失败:{e}")
|
||||
# 初始化失败则回退到上一个页签
|
||||
self._block_nav = True
|
||||
self.nav.setCurrentRow(self._last_nav_index)
|
||||
self._block_nav = False
|
||||
self.stack.setCurrentIndex(self._last_nav_index)
|
||||
return
|
||||
|
||||
if hasattr(self, "_init_status_lbl"):
|
||||
self._init_status_lbl.setText("已完成初始化(分组和程序已清空)。")
|
||||
|
||||
self.stack.setCurrentIndex(index)
|
||||
self._last_nav_index = index
|
||||
else:
|
||||
# 用户取消:回退到上一个页签
|
||||
self._block_nav = True
|
||||
self.nav.setCurrentRow(self._last_nav_index)
|
||||
self._block_nav = False
|
||||
self.stack.setCurrentIndex(self._last_nav_index)
|
||||
|
||||
def _apply_theme(self):
|
||||
t = theme.current()
|
||||
|
||||
Reference in New Issue
Block a user