feat(lite): add tray settings and reset controls

This commit is contained in:
RoyirinRosmontis
2026-09-18 21:43:09 +08:00
parent 26926f6469
commit f4d777113c
3 changed files with 239 additions and 9 deletions
+105 -4
View File
@@ -9,6 +9,7 @@ from PyQt5.QtCore import Qt, QTimer, pyqtSignal
from PyQt5.QtWidgets import (
QApplication, QComboBox, QDialog, QFileDialog, QHBoxLayout, QLabel, QLineEdit,
QListWidget, QListWidgetItem, QPushButton, QVBoxLayout, QWidget, QTextEdit,
QButtonGroup, QMessageBox,
)
from .theme import C_BG, C_BORDER, C_CARD, C_GREEN, C_RED, C_SUBTEXT, C_TEXT, C_TITLE
@@ -933,11 +934,16 @@ class SettingsServices:
get_builtin_pac: object
get_update_via_proxy: object
get_skip_update_check: object
get_node_display_mode: object
get_close_behavior: object
parse_port: object
set_port: object
set_builtin_pac: object
set_update_via_proxy: object
set_skip_update_check: object
set_node_display_mode: object
set_close_behavior: object
reset_user_config: object
open_whitelist: object
open_jump: object
open_third_party: object
@@ -955,7 +961,7 @@ class SettingsDialog(QDialog):
self._services = services
self.setWindowTitle("设置")
self.setWindowIcon(services.load_icon())
self.setFixedSize(300, 380)
self.setFixedSize(300, 470)
self.setStyleSheet(f"""
QDialog {{ background-color: {C_BG}; }}
QLabel {{ color: {C_TEXT}; font-family: "Microsoft YaHei", "Segoe UI", sans-serif; font-size: 12px; }}
@@ -963,8 +969,8 @@ class SettingsDialog(QDialog):
padding: 2px 8px; color: {C_TEXT}; font-size: 12px; }}
""")
layout = QVBoxLayout(self)
layout.setSpacing(10)
layout.setContentsMargins(20, 10, 20, 10)
layout.setSpacing(7)
layout.setContentsMargins(20, 8, 20, 8)
title = QLabel("设置")
title.setStyleSheet(f"color: {C_TITLE}; font-size: 15px; font-weight: bold;")
title.setAlignment(Qt.AlignCenter)
@@ -991,7 +997,7 @@ class SettingsDialog(QDialog):
self.lb_hint.setFixedHeight(14)
self.lb_hint.setAlignment(Qt.AlignCenter)
layout.addWidget(self.lb_hint)
layout.addStretch()
layout.addSpacing(2)
whitelist_row = QHBoxLayout()
whitelist_label = QLabel("域名路由")
@@ -1092,6 +1098,74 @@ class SettingsDialog(QDialog):
self.cb_skip_update.setToolTip("跳过 PAC 数据与程序版本检查(节点更新与登录不受影响),被跳过的检查不输出日志")
skip_row.addWidget(self.cb_skip_update)
layout.addLayout(skip_row)
option_style = f"""
QPushButton {{ background-color: {C_CARD}; color: {C_SUBTEXT}; border: 1px solid {C_BORDER};
border-radius: 6px; padding: 2px 8px; font-size: 11px; min-width: 32px; }}
QPushButton:hover {{ background-color: #e3e8ee; color: {C_TEXT}; }}
QPushButton:checked {{ background-color: {C_TITLE}; color: #ffffff; border-color: {C_TITLE}; }}
"""
node_display_row = QHBoxLayout()
node_display_label = QLabel("节点信息显示")
node_display_label.setStyleSheet(f"color: {C_SUBTEXT}; font-size: 12px;")
node_display_label.setToolTip("控制主页面节点副标题显示域名还是节点备注")
node_display_row.addWidget(node_display_label)
node_display_row.addStretch()
self.btn_node_domain = QPushButton("域名")
self.btn_node_remark = QPushButton("备注")
for button in (self.btn_node_domain, self.btn_node_remark):
button.setCheckable(True)
button.setCursor(Qt.PointingHandCursor)
button.setStyleSheet(option_style)
node_display_row.addWidget(button)
self.node_display_group = QButtonGroup(self)
self.node_display_group.setExclusive(True)
self.node_display_group.addButton(self.btn_node_domain)
self.node_display_group.addButton(self.btn_node_remark)
if services.get_node_display_mode() == "remark":
self.btn_node_remark.setChecked(True)
else:
self.btn_node_domain.setChecked(True)
layout.addLayout(node_display_row)
close_behavior_row = QHBoxLayout()
close_behavior_label = QLabel("默认关闭行为")
close_behavior_label.setStyleSheet(f"color: {C_SUBTEXT}; font-size: 12px;")
close_behavior_label.setToolTip("点击主窗口关闭按钮时退出程序,或隐藏到系统托盘")
close_behavior_row.addWidget(close_behavior_label)
close_behavior_row.addStretch()
self.btn_close_exit = QPushButton("退出")
self.btn_close_tray = QPushButton("托盘")
for button in (self.btn_close_exit, self.btn_close_tray):
button.setCheckable(True)
button.setCursor(Qt.PointingHandCursor)
button.setStyleSheet(option_style)
close_behavior_row.addWidget(button)
self.close_behavior_group = QButtonGroup(self)
self.close_behavior_group.setExclusive(True)
self.close_behavior_group.addButton(self.btn_close_exit)
self.close_behavior_group.addButton(self.btn_close_tray)
if services.get_close_behavior() == "tray":
self.btn_close_tray.setChecked(True)
else:
self.btn_close_exit.setChecked(True)
layout.addLayout(close_behavior_row)
reset_row = QHBoxLayout()
reset_label = QLabel("重置用户配置")
reset_label.setStyleSheet(f"color: {C_SUBTEXT}; font-size: 12px;")
reset_label.setToolTip("重置本地偏好、域名路由、跳板和当前节点选择;不会删除登录和订阅")
reset_row.addWidget(reset_label)
reset_row.addStretch()
self.btn_reset = QPushButton("重置")
self.btn_reset.setCursor(Qt.PointingHandCursor)
self.btn_reset.setStyleSheet(option_style)
self.btn_reset.setEnabled(not port_locked)
self.btn_reset.clicked.connect(self._reset_user_config)
reset_row.addWidget(self.btn_reset)
layout.addLayout(reset_row)
layout.addLayout(log_row)
layout.addStretch()
@@ -1148,6 +1222,27 @@ class SettingsDialog(QDialog):
def _open_logs(self):
self._services.open_logs(self)
def _reset_user_config(self):
reply = QMessageBox.question(
self,
"重置用户配置",
"确定要恢复本地偏好、域名路由、跳板和当前节点选择的默认值吗?\n\n"
"登录凭据、节点缓存、第三方订阅和 PAC 数据不会被删除。",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No,
)
if reply != QMessageBox.Yes:
return
self._services.reset_user_config()
self.ed_port.setText(str(self._services.get_port()))
self.cb_builtin_pac.setChecked(self._services.get_builtin_pac())
self.cb_update_proxy.setChecked(self._services.get_update_via_proxy())
self.cb_skip_update.setChecked(self._services.get_skip_update_check())
self.btn_node_domain.setChecked(True)
self.btn_close_exit.setChecked(True)
self.lb_hint.setText("用户配置已重置")
self.lb_hint.setStyleSheet(f"color: {C_GREEN}; font-size: 11px;")
def _save_settings(self):
port = self._services.parse_port(self.ed_port.text())
if port is None:
@@ -1158,6 +1253,12 @@ class SettingsDialog(QDialog):
self._services.set_builtin_pac(bool(self.cb_builtin_pac.isChecked()))
self._services.set_update_via_proxy(bool(self.cb_update_proxy.isChecked()))
self._services.set_skip_update_check(bool(self.cb_skip_update.isChecked()))
self._services.set_node_display_mode(
"remark" if self.btn_node_remark.isChecked() else "domain"
)
self._services.set_close_behavior(
"tray" if self.btn_close_tray.isChecked() else "exit"
)
self.ed_port.setText(str(port))
self.lb_hint.setText("已保存,下次开启代理生效")
self.lb_hint.setStyleSheet(f"color: {C_GREEN}; font-size: 11px;")