Files
EZProxy/child/ui/update_dialog.py
2025-11-10 17:29:11 +08:00

143 lines
5.1 KiB
Python

from PyQt5.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QLabel,
QPushButton, QProgressBar, QTextEdit, QMessageBox
)
from PyQt5.QtCore import Qt, QThread, pyqtSignal
import webbrowser
import logging
class UpdateThread(QThread):
progress_updated = pyqtSignal(int, str)
finished = pyqtSignal(bool, str)
def __init__(self, update_manager, update_type):
super().__init__()
self.update_manager = update_manager
self.update_type = update_type
def run(self):
try:
self.progress_updated.emit(10, "准备更新...")
if self.update_type == 'config':
success = self.update_manager.update_config()
message = "配置模板更新成功" if success else "配置模板更新失败"
elif self.update_type == 'app':
success = self.update_manager.start_app_update()
message = "应用更新已启动,程序将自动重启" if success else "应用更新启动失败"
else:
success = False
message = "未知更新类型"
self.progress_updated.emit(100, "更新完成")
self.finished.emit(success, message)
except Exception as e:
logging.error(f"Update failed: {str(e)}")
self.finished.emit(False, f"更新失败: {str(e)}")
class UpdateDialog(QDialog):
def __init__(self, update_info, update_manager, parent=None):
super().__init__(parent)
self.update_info = update_info
self.update_manager = update_manager
self.setWindowTitle("更新可用")
self.setMinimumSize(500, 300)
layout = QVBoxLayout()
# 版本信息
if update_info['config']['available']:
config_label = QLabel(f"配置模板更新: {update_info['config']['version']}")
layout.addWidget(config_label)
if update_info['app']['available']:
app_label = QLabel(f"应用更新: {update_info['app']['version']}")
layout.addWidget(app_label)
# 更新日志
self.changelog_view = QTextEdit()
self.changelog_view.setReadOnly(True)
self.changelog_view.setHtml("<p>点击'查看详情'查看更新日志</p>")
layout.addWidget(QLabel("更新内容:"))
layout.addWidget(self.changelog_view)
# 按钮布局
btn_layout = QHBoxLayout()
self.details_btn = QPushButton("查看详情")
self.details_btn.clicked.connect(self.show_changelog)
self.skip_btn = QPushButton("跳过本次更新")
self.skip_btn.setEnabled(not (update_info['config'].get('force', False) or
update_info['app'].get('force', False)))
self.skip_btn.clicked.connect(self.skip_update)
self.update_btn = QPushButton("立即更新")
self.update_btn.clicked.connect(self.start_update)
btn_layout.addWidget(self.details_btn)
btn_layout.addStretch()
btn_layout.addWidget(self.skip_btn)
btn_layout.addWidget(self.update_btn)
layout.addLayout(btn_layout)
# 进度条
self.progress = QProgressBar()
self.progress.setVisible(False)
layout.addWidget(self.progress)
self.setLayout(layout)
def show_changelog(self):
"""在浏览器中打开更新日志"""
url = self.update_info.get('changelog_url', '')
if url:
webbrowser.open(url)
else:
QMessageBox.information(self, "无更新日志", "没有提供更新日志链接")
def skip_update(self):
"""跳过更新"""
reply = QMessageBox.question(
self, "跳过更新",
"您确定要跳过本次更新吗?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No
)
if reply == QMessageBox.Yes:
self.reject()
def start_update(self):
"""开始更新"""
# 禁用按钮
self.details_btn.setEnabled(False)
self.skip_btn.setEnabled(False)
self.update_btn.setEnabled(False)
# 显示进度条
self.progress.setVisible(True)
# 创建更新线程
self.update_thread = UpdateThread(self.update_manager, 'both')
self.update_thread.progress_updated.connect(self.update_progress)
self.update_thread.finished.connect(self.update_finished)
self.update_thread.start()
def update_progress(self, value, message):
"""更新进度"""
self.progress.setValue(value)
self.progress.setFormat(message)
def update_finished(self, success, message):
"""更新完成"""
if success:
QMessageBox.information(self, "更新成功", message)
self.accept()
else:
QMessageBox.critical(self, "更新失败", message)
self.details_btn.setEnabled(True)
self.skip_btn.setEnabled(True)
self.update_btn.setEnabled(True)
self.progress.setVisible(False)