[patch] 优化更新提示逻辑 与 样式细节
This commit is contained in:
149
main.py
149
main.py
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user