2025-08-01 17:54:38 +08:00
|
|
|
|
import os
|
|
|
|
|
|
from PySide6 import QtWidgets
|
|
|
|
|
|
from PySide6.QtWidgets import QMessageBox
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ExtractionHandler:
|
|
|
|
|
|
"""解压处理器,负责管理解压任务和结果处理"""
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, main_window):
|
|
|
|
|
|
"""初始化解压处理器
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
main_window: 主窗口实例,用于访问UI和状态
|
|
|
|
|
|
"""
|
|
|
|
|
|
self.main_window = main_window
|
|
|
|
|
|
self.APP_NAME = main_window.APP_NAME if hasattr(main_window, 'APP_NAME') else ""
|
|
|
|
|
|
|
|
|
|
|
|
def start_extraction(self, _7z_path, game_folder, plugin_path, game_version):
|
|
|
|
|
|
"""开始解压任务
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
_7z_path: 7z文件路径
|
|
|
|
|
|
game_folder: 游戏文件夹路径
|
|
|
|
|
|
plugin_path: 插件路径
|
|
|
|
|
|
game_version: 游戏版本名称
|
|
|
|
|
|
"""
|
2025-08-06 15:22:44 +08:00
|
|
|
|
# 检查是否处于离线模式
|
|
|
|
|
|
is_offline = False
|
|
|
|
|
|
if hasattr(self.main_window, 'offline_mode_manager'):
|
|
|
|
|
|
is_offline = self.main_window.offline_mode_manager.is_in_offline_mode()
|
|
|
|
|
|
|
2025-08-01 17:54:38 +08:00
|
|
|
|
# 显示解压中的消息窗口
|
2025-08-06 15:22:44 +08:00
|
|
|
|
self.main_window.hash_msg_box = self.main_window.hash_manager.hash_pop_window(
|
|
|
|
|
|
check_type="offline_extraction" if is_offline else "extraction",
|
|
|
|
|
|
is_offline=is_offline
|
|
|
|
|
|
)
|
2025-08-01 17:54:38 +08:00
|
|
|
|
|
|
|
|
|
|
# 创建并启动解压线程
|
|
|
|
|
|
self.main_window.extraction_thread = self.main_window.create_extraction_thread(
|
|
|
|
|
|
_7z_path, game_folder, plugin_path, game_version
|
|
|
|
|
|
)
|
|
|
|
|
|
self.main_window.extraction_thread.finished.connect(self.on_extraction_finished)
|
|
|
|
|
|
self.main_window.extraction_thread.start()
|
|
|
|
|
|
|
|
|
|
|
|
def on_extraction_finished(self, success, error_message, game_version):
|
|
|
|
|
|
"""解压完成后的处理
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
success: 是否解压成功
|
|
|
|
|
|
error_message: 错误信息
|
|
|
|
|
|
game_version: 游戏版本
|
|
|
|
|
|
"""
|
|
|
|
|
|
# 关闭哈希检查窗口
|
|
|
|
|
|
if self.main_window.hash_msg_box and self.main_window.hash_msg_box.isVisible():
|
|
|
|
|
|
self.main_window.hash_msg_box.close()
|
|
|
|
|
|
self.main_window.hash_msg_box = None
|
|
|
|
|
|
|
|
|
|
|
|
# 处理解压结果
|
|
|
|
|
|
if not success:
|
|
|
|
|
|
# 临时启用窗口以显示错误消息
|
|
|
|
|
|
self.main_window.setEnabled(True)
|
|
|
|
|
|
|
|
|
|
|
|
QtWidgets.QMessageBox.critical(self.main_window, f"错误 - {self.APP_NAME}", error_message)
|
|
|
|
|
|
self.main_window.installed_status[game_version] = False
|
|
|
|
|
|
|
|
|
|
|
|
# 询问用户是否继续其他游戏的安装
|
|
|
|
|
|
reply = QtWidgets.QMessageBox.question(
|
|
|
|
|
|
self.main_window,
|
|
|
|
|
|
f"继续安装? - {self.APP_NAME}",
|
|
|
|
|
|
f"\n{game_version} 的补丁安装失败。\n\n是否继续安装其他游戏的补丁?\n",
|
|
|
|
|
|
QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No,
|
|
|
|
|
|
QtWidgets.QMessageBox.StandardButton.Yes
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
if reply == QtWidgets.QMessageBox.StandardButton.Yes:
|
|
|
|
|
|
# 继续下一个,重新禁用窗口
|
|
|
|
|
|
self.main_window.setEnabled(False)
|
|
|
|
|
|
# 通知DownloadManager继续下一个下载任务
|
|
|
|
|
|
self.main_window.download_manager.on_extraction_finished(True)
|
|
|
|
|
|
else:
|
|
|
|
|
|
# 用户选择停止,保持窗口启用状态
|
|
|
|
|
|
self.main_window.ui.start_install_text.setText("开始安装")
|
|
|
|
|
|
# 通知DownloadManager停止下载队列
|
|
|
|
|
|
self.main_window.download_manager.on_extraction_finished(False)
|
|
|
|
|
|
else:
|
|
|
|
|
|
# 更新安装状态
|
|
|
|
|
|
self.main_window.installed_status[game_version] = True
|
|
|
|
|
|
# 通知DownloadManager继续下一个下载任务
|
|
|
|
|
|
self.main_window.download_manager.on_extraction_finished(True)
|