[patch] 优化更新提示逻辑 与 样式细节

This commit is contained in:
2025-10-30 16:54:24 +08:00
parent 5440aa7d6d
commit 8575de6ea5
2 changed files with 459 additions and 34 deletions

149
main.py
View File

@@ -84,6 +84,10 @@ class LoginWindow(QMainWindow):
# 横幅相关
self.promo_banner = None
self.banner_shadow = None # 阴影效果引用
# 🔥 版本更新提示状态管理
self.notified_version = None # 已提示过的版本号(本次运行期间)
self.pending_update_info = None # 待更新的版本信息 {version, url, content}
self.initUI()
@@ -167,6 +171,11 @@ class LoginWindow(QMainWindow):
self.status_label.setAlignment(Qt.AlignCenter)
self.status_label.setFont(QFont('Microsoft YaHei', 9))
self.status_label.setStyleSheet("color: #95a5a6; margin-top: 2px;")
self.status_label.setCursor(Qt.ArrowCursor) # 默认鼠标样式
# 🔥 让状态标签可点击(用于更新提示)
self.status_label.mousePressEvent = self.on_status_label_clicked
main_layout.addWidget(self.status_label)
# 添加最小间距(为横幅留出位置)
@@ -1203,6 +1212,53 @@ class LoginWindow(QMainWindow):
self.quit_application()
event.accept()
def on_status_label_clicked(self, event):
"""状态标签被点击时的处理"""
try:
# 如果有待更新信息,点击打开更新对话框
if self.pending_update_info:
self.add_log("📱 用户点击状态标签,打开更新对话框", "INFO")
self.show_update_dialog_manual()
except Exception as e:
self.add_log(f"处理状态标签点击失败: {e}", "ERROR")
def show_update_dialog_manual(self):
"""手动打开更新对话框(用户点击状态标签时)"""
if not self.pending_update_info:
return
version = self.pending_update_info['version']
url = self.pending_update_info['url']
content = self.pending_update_info.get('content', '')
self.add_log(f"显示更新对话框: v{version}", "INFO")
self._show_update_dialog_internal(version, url, content)
def update_status_label_for_pending_update(self, latest_version, download_url):
"""更新状态标签显示待更新信息"""
try:
# 保存待更新信息
update_content = self._get_update_content(latest_version)
self.pending_update_info = {
'version': latest_version,
'url': download_url,
'content': update_content
}
# 更新状态标签
self.status_label.setText(f"🔔 新版本 v{latest_version} 可用(点击更新)")
self.status_label.setStyleSheet(
"color: #ff9800; background: rgba(255, 152, 0, 0.1); "
"border-radius: 12px; padding: 5px 10px; font-weight: bold; "
"cursor: pointer;" # 鼠标变手型
)
self.status_label.setCursor(Qt.PointingHandCursor) # 手型光标
self.add_log(f"✅ 状态标签已更新为待更新状态: v{latest_version}", "INFO")
except Exception as e:
self.add_log(f"更新状态标签失败: {e}", "ERROR")
def setup_version_checker(self):
"""设置版本检查器的GUI回调"""
try:
@@ -1233,8 +1289,18 @@ class LoginWindow(QMainWindow):
"""显示更新对话框(信号槽函数,始终在主线程中执行)"""
try:
self.add_log(f"🎯 主线程收到更新信号: v{latest_version}", "INFO")
# 🔥 修改调用新的trigger_update方法支持自动更新
# 🔥 检查是否已经提示过这个版本
if self.notified_version == latest_version:
self.add_log(f" 版本 {latest_version} 已提示过,本次运行不再弹窗", "INFO")
# 只更新状态标签,不弹窗
self.update_status_label_for_pending_update(latest_version, download_url)
return
# 🔥 首次提示这个版本,显示对话框
self.add_log(f"🔔 首次提示版本 {latest_version},显示更新对话框", "INFO")
self.trigger_update(download_url, latest_version)
except Exception as e:
self.add_log(f"❌ 显示更新对话框失败: {e}", "ERROR")
import traceback
@@ -1325,7 +1391,23 @@ class LoginWindow(QMainWindow):
return ""
def trigger_update(self, download_url, latest_version):
"""触发更新下载(支持自动更新和手动下载"""
"""触发更新提示(首次检测到新版本时调用"""
try:
# 🔥 获取更新内容(如果没有则传空字符串,对话框会自动隐藏该区域)
update_content = self._get_update_content(latest_version)
if not update_content:
update_content = "" # 确保是空字符串而非None
# 调用内部方法显示对话框
self._show_update_dialog_internal(latest_version, download_url, update_content)
except Exception as e:
self.add_log(f"触发更新失败: {e}", "ERROR")
import traceback
self.add_log(f"详细错误: {traceback.format_exc()}", "ERROR")
def _show_update_dialog_internal(self, latest_version, download_url, update_content):
"""内部方法:显示更新对话框(使用自定义对话框)"""
try:
# 检查下载地址是否有效
if not download_url or download_url.strip() == "":
@@ -1338,46 +1420,45 @@ class LoginWindow(QMainWindow):
)
return
# 获取更新内容
update_content = self._get_update_content(latest_version)
if update_content:
content_preview = update_content[:100] + "..." if len(update_content) > 100 else update_content
else:
content_preview = "(暂无更新说明)"
# 🔥 使用自定义对话框(美观布局)
from custom_update_dialog import UpdateNotificationDialog
# 🔥 新增:弹出三选一对话框(自动更新/手动下载/取消)
msg_box = QMessageBox(self)
msg_box.setWindowTitle("版本更新")
msg_box.setText(f"发现新版本 v{latest_version},是否更新?")
msg_box.setInformativeText(
f"更新内容:\n{content_preview}\n\n"
f"推荐使用「自动更新」,程序将自动下载并安装新版本。"
dialog = UpdateNotificationDialog(
version=latest_version,
download_url=download_url,
update_content=update_content,
parent=self
)
msg_box.setIcon(QMessageBox.Information)
# 添加三个按钮
auto_button = msg_box.addButton("自动更新", QMessageBox.YesRole)
manual_button = msg_box.addButton("手动下载", QMessageBox.NoRole)
cancel_button = msg_box.addButton("取消", QMessageBox.RejectRole)
msg_box.setDefaultButton(auto_button)
dialog.exec_()
choice = dialog.get_user_choice()
msg_box.exec_()
clicked_button = msg_box.clickedButton()
if clicked_button == auto_button:
# 🔥 自动更新:下载并安装
self.add_log("用户选择自动更新", "INFO")
# 处理用户选择
if choice == UpdateNotificationDialog.CHOICE_UPDATE_NOW:
# 🔥 立即更新:启动自动更新流程
self.add_log("用户选择立即更新", "INFO")
self.notified_version = latest_version # 标记已提示
self.start_auto_update(download_url, latest_version)
elif clicked_button == manual_button:
# 🔥 手动下载:打开浏览器
self.add_log("用户选择手动下载", "INFO")
self.start_manual_download(download_url, latest_version)
elif choice == UpdateNotificationDialog.CHOICE_UPDATE_LATER:
# 🔥 稍后更新:更新状态标签,保留提示
self.add_log("用户选择稍后更新", "INFO")
self.notified_version = latest_version # 标记已提示(避免重复弹窗)
self.update_status_label_for_pending_update(latest_version, download_url)
elif choice == UpdateNotificationDialog.CHOICE_IGNORE:
# 🔥 忽略此版本:标记已提示,清除待更新信息
self.add_log(f"用户忽略版本 {latest_version}", "INFO")
self.notified_version = latest_version # 标记已提示
self.pending_update_info = None # 清除待更新信息
else:
# 取消更新
self.add_log("用户取消更新", "INFO")
# 用户直接关闭对话框(等同于稍后更新
self.add_log("用户关闭更新对话框", "INFO")
self.notified_version = latest_version
self.update_status_label_for_pending_update(latest_version, download_url)
except Exception as e:
self.add_log(f"更新失败: {e}", "ERROR")
self.add_log(f"显示更新对话框失败: {e}", "ERROR")
import traceback
self.add_log(f"详细错误: {traceback.format_exc()}", "ERROR")