mirror of
https://github.com/hyb-oyqq/FRAISEMOE-Addons-Installer-NEXT.git
synced 2026-04-05 18:56:33 +00:00
feat(core): 优化主窗口和UI管理功能
- 移除不再使用的UI组件,简化主窗口代码结构。 - 更新按钮状态管理,统一通过UIManager控制安装按钮状态,提升代码可读性。 - 优化解压和下载管理逻辑,确保在操作过程中提供清晰的用户反馈。 - 增强日志记录,确保在关键操作中提供详细的调试信息,便于后续排查和用户反馈。
This commit is contained in:
@@ -5,6 +5,7 @@ from PySide6.QtWidgets import QMessageBox
|
|||||||
from PySide6.QtCore import QTimer, QCoreApplication
|
from PySide6.QtCore import QTimer, QCoreApplication
|
||||||
|
|
||||||
from utils.logger import setup_logger
|
from utils.logger import setup_logger
|
||||||
|
from workers.extraction_thread import ExtractionThread
|
||||||
|
|
||||||
# 初始化logger
|
# 初始化logger
|
||||||
logger = setup_logger("extraction_handler")
|
logger = setup_logger("extraction_handler")
|
||||||
@@ -45,8 +46,8 @@ class ExtractionHandler:
|
|||||||
QCoreApplication.processEvents()
|
QCoreApplication.processEvents()
|
||||||
|
|
||||||
# 创建并启动解压线程
|
# 创建并启动解压线程
|
||||||
self.main_window.extraction_thread = self.main_window.create_extraction_thread(
|
self.main_window.extraction_thread = ExtractionThread(
|
||||||
_7z_path, game_folder, plugin_path, game_version, extracted_path
|
_7z_path, game_folder, plugin_path, game_version, self.main_window, extracted_path
|
||||||
)
|
)
|
||||||
|
|
||||||
# 连接进度信号
|
# 连接进度信号
|
||||||
@@ -109,7 +110,7 @@ class ExtractionHandler:
|
|||||||
self.main_window.download_manager.on_extraction_finished(True)
|
self.main_window.download_manager.on_extraction_finished(True)
|
||||||
else:
|
else:
|
||||||
# 用户选择停止,保持窗口启用状态
|
# 用户选择停止,保持窗口启用状态
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
# 通知DownloadManager停止下载队列
|
# 通知DownloadManager停止下载队列
|
||||||
self.main_window.download_manager.on_extraction_finished(False)
|
self.main_window.download_manager.on_extraction_finished(False)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ class PatchToggleHandler(QObject):
|
|||||||
|
|
||||||
selected_game_dirs = {game: games_with_patch[game]["dir"] for game in selected_games if game in games_with_patch}
|
selected_game_dirs = {game: games_with_patch[game]["dir"] for game in selected_games if game in games_with_patch}
|
||||||
|
|
||||||
self._execute_batch_toggle(selected_game_dirs, operation, self.debug_manager.debug_mode)
|
self._execute_batch_toggle(selected_game_dirs, operation, self.debug_manager._is_debug_mode)
|
||||||
|
|
||||||
def _handle_multiple_games(self, game_dirs, debug_mode):
|
def _handle_multiple_games(self, game_dirs, debug_mode):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ class MultiStageAnimations(QObject):
|
|||||||
widget.show()
|
widget.show()
|
||||||
|
|
||||||
# 禁用所有按钮,直到动画完成
|
# 禁用所有按钮,直到动画完成
|
||||||
self.ui.start_install_btn.setEnabled(False)
|
self.ui.start_install_btn.setEnabled(False) # 动画期间禁用
|
||||||
self.ui.uninstall_btn.setEnabled(False)
|
self.ui.uninstall_btn.setEnabled(False)
|
||||||
self.ui.exit_btn.setEnabled(False)
|
self.ui.exit_btn.setEnabled(False)
|
||||||
|
|
||||||
@@ -358,7 +358,7 @@ class MultiStageAnimations(QObject):
|
|||||||
self.clear_animations()
|
self.clear_animations()
|
||||||
|
|
||||||
# 确保按钮在动画开始时被禁用
|
# 确保按钮在动画开始时被禁用
|
||||||
self.ui.start_install_btn.setEnabled(False)
|
self.ui.start_install_btn.setEnabled(False) # 动画期间禁用
|
||||||
self.ui.uninstall_btn.setEnabled(False)
|
self.ui.uninstall_btn.setEnabled(False)
|
||||||
self.ui.exit_btn.setEnabled(False)
|
self.ui.exit_btn.setEnabled(False)
|
||||||
|
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ class CloudflareOptimizer:
|
|||||||
|
|
||||||
# 恢复主窗口状态
|
# 恢复主窗口状态
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
|
|
||||||
# 显示取消消息
|
# 显示取消消息
|
||||||
QtWidgets.QMessageBox.information(
|
QtWidgets.QMessageBox.information(
|
||||||
@@ -332,7 +332,7 @@ class CloudflareOptimizer:
|
|||||||
if msg_box.clickedButton() == cancel_button:
|
if msg_box.clickedButton() == cancel_button:
|
||||||
# 恢复主窗口状态
|
# 恢复主窗口状态
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# 用户点击了继续,重新禁用主窗口
|
# 用户点击了继续,重新禁用主窗口
|
||||||
@@ -403,7 +403,7 @@ class CloudflareOptimizer:
|
|||||||
if msg_box.clickedButton() == cancel_button:
|
if msg_box.clickedButton() == cancel_button:
|
||||||
# 恢复主窗口状态
|
# 恢复主窗口状态
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
QtWidgets.QMessageBox.critical(
|
QtWidgets.QMessageBox.critical(
|
||||||
@@ -412,7 +412,7 @@ class CloudflareOptimizer:
|
|||||||
"\n修改hosts文件失败,请检查程序是否以管理员权限运行。\n"
|
"\n修改hosts文件失败,请检查程序是否以管理员权限运行。\n"
|
||||||
)
|
)
|
||||||
# 恢复主窗口状态
|
# 恢复主窗口状态
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# 用户点击了继续,重新禁用主窗口
|
# 用户点击了继续,重新禁用主窗口
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class DownloadManager:
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
self.main_window.ui.start_install_text.setText("正在安装")
|
self.main_window.ui_manager.set_install_button_state("installing")
|
||||||
|
|
||||||
self.main_window.setEnabled(False)
|
self.main_window.setEnabled(False)
|
||||||
|
|
||||||
@@ -264,7 +264,7 @@ class DownloadManager:
|
|||||||
self.main_window, f"通知 - {APP_NAME}", "\n未在选择的目录中找到支持的游戏\n"
|
self.main_window, f"通知 - {APP_NAME}", "\n未在选择的目录中找到支持的游戏\n"
|
||||||
)
|
)
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
return
|
return
|
||||||
|
|
||||||
# 关闭可能存在的哈希校验窗口
|
# 关闭可能存在的哈希校验窗口
|
||||||
@@ -281,7 +281,7 @@ class DownloadManager:
|
|||||||
install_paths = self.get_install_paths()
|
install_paths = self.get_install_paths()
|
||||||
|
|
||||||
# 创建并启动哈希线程进行预检查
|
# 创建并启动哈希线程进行预检查
|
||||||
self.main_window.hash_thread = self.main_window.create_hash_thread("pre", install_paths)
|
self.main_window.hash_thread = self.main_window.patch_detector.create_hash_thread("pre", install_paths)
|
||||||
self.main_window.hash_thread.pre_finished.connect(
|
self.main_window.hash_thread.pre_finished.connect(
|
||||||
lambda updated_status: self.on_pre_hash_finished_with_dirs(updated_status, game_dirs)
|
lambda updated_status: self.on_pre_hash_finished_with_dirs(updated_status, game_dirs)
|
||||||
)
|
)
|
||||||
@@ -384,7 +384,16 @@ class DownloadManager:
|
|||||||
|
|
||||||
layout.addWidget(list_widget)
|
layout.addWidget(list_widget)
|
||||||
|
|
||||||
# 添加按钮
|
# 添加全选/取消全选按钮
|
||||||
|
select_all_layout = QtWidgets.QHBoxLayout()
|
||||||
|
select_all_button = QtWidgets.QPushButton("全选")
|
||||||
|
deselect_all_button = QtWidgets.QPushButton("取消全选")
|
||||||
|
select_all_layout.addWidget(select_all_button)
|
||||||
|
select_all_layout.addWidget(deselect_all_button)
|
||||||
|
select_all_layout.addStretch() # 添加弹性空间,将按钮左对齐
|
||||||
|
layout.addLayout(select_all_layout)
|
||||||
|
|
||||||
|
# 添加主要操作按钮
|
||||||
button_layout = QtWidgets.QHBoxLayout()
|
button_layout = QtWidgets.QHBoxLayout()
|
||||||
ok_button = QtWidgets.QPushButton("确定")
|
ok_button = QtWidgets.QPushButton("确定")
|
||||||
cancel_button = QtWidgets.QPushButton("取消")
|
cancel_button = QtWidgets.QPushButton("取消")
|
||||||
@@ -394,7 +403,22 @@ class DownloadManager:
|
|||||||
|
|
||||||
dialog.setLayout(layout)
|
dialog.setLayout(layout)
|
||||||
|
|
||||||
|
# 全选功能的实现
|
||||||
|
def select_all_items():
|
||||||
|
"""选择所有游戏项目"""
|
||||||
|
for i in range(list_widget.count()):
|
||||||
|
item = list_widget.item(i)
|
||||||
|
item.setSelected(True)
|
||||||
|
|
||||||
|
def deselect_all_items():
|
||||||
|
"""取消选择所有游戏项目"""
|
||||||
|
for i in range(list_widget.count()):
|
||||||
|
item = list_widget.item(i)
|
||||||
|
item.setSelected(False)
|
||||||
|
|
||||||
# 连接按钮信号
|
# 连接按钮信号
|
||||||
|
select_all_button.clicked.connect(select_all_items)
|
||||||
|
deselect_all_button.clicked.connect(deselect_all_items)
|
||||||
ok_button.clicked.connect(dialog.accept)
|
ok_button.clicked.connect(dialog.accept)
|
||||||
cancel_button.clicked.connect(dialog.reject)
|
cancel_button.clicked.connect(dialog.reject)
|
||||||
|
|
||||||
@@ -435,7 +459,7 @@ class DownloadManager:
|
|||||||
else:
|
else:
|
||||||
if debug_mode:
|
if debug_mode:
|
||||||
logger.debug("DEBUG: 用户取消了游戏选择")
|
logger.debug("DEBUG: 用户取消了游戏选择")
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
else:
|
else:
|
||||||
# 如果没有可安装的游戏,显示提示
|
# 如果没有可安装的游戏,显示提示
|
||||||
if already_installed_games:
|
if already_installed_games:
|
||||||
@@ -448,7 +472,7 @@ class DownloadManager:
|
|||||||
f"通知 - {APP_NAME}",
|
f"通知 - {APP_NAME}",
|
||||||
msg
|
msg
|
||||||
)
|
)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
|
|
||||||
def _continue_download_after_config_fetch(self, data, error, selected_game_dirs):
|
def _continue_download_after_config_fetch(self, data, error, selected_game_dirs):
|
||||||
"""云端配置获取完成后继续下载流程
|
"""云端配置获取完成后继续下载流程
|
||||||
@@ -486,7 +510,7 @@ class DownloadManager:
|
|||||||
self.main_window, f"错误 - {APP_NAME}", "\n网络状态异常或服务器故障,请重试\n"
|
self.main_window, f"错误 - {APP_NAME}", "\n网络状态异常或服务器故障,请重试\n"
|
||||||
)
|
)
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
return
|
return
|
||||||
|
|
||||||
self._fill_download_queue(config, selected_game_dirs)
|
self._fill_download_queue(config, selected_game_dirs)
|
||||||
@@ -659,7 +683,7 @@ class DownloadManager:
|
|||||||
clicked_button = msg_box.clickedButton()
|
clicked_button = msg_box.clickedButton()
|
||||||
if clicked_button == cancel_button:
|
if clicked_button == cancel_button:
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
self.download_queue.clear()
|
self.download_queue.clear()
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -916,7 +940,7 @@ class DownloadManager:
|
|||||||
logger.info("下载已全部停止。")
|
logger.info("下载已全部停止。")
|
||||||
|
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
|
|
||||||
QtWidgets.QMessageBox.information(
|
QtWidgets.QMessageBox.information(
|
||||||
self.main_window,
|
self.main_window,
|
||||||
@@ -960,7 +984,7 @@ class DownloadManager:
|
|||||||
self.main_window, f"通知 - {APP_NAME}", "\n未在选择的目录中找到支持的游戏\n"
|
self.main_window, f"通知 - {APP_NAME}", "\n未在选择的目录中找到支持的游戏\n"
|
||||||
)
|
)
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
return
|
return
|
||||||
|
|
||||||
# 过滤出存在的游戏目录
|
# 过滤出存在的游戏目录
|
||||||
@@ -971,7 +995,7 @@ class DownloadManager:
|
|||||||
self.main_window, f"通知 - {APP_NAME}", "\n未找到指定游戏的安装目录\n"
|
self.main_window, f"通知 - {APP_NAME}", "\n未找到指定游戏的安装目录\n"
|
||||||
)
|
)
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
return
|
return
|
||||||
|
|
||||||
self.main_window.setEnabled(False)
|
self.main_window.setEnabled(False)
|
||||||
@@ -983,7 +1007,7 @@ class DownloadManager:
|
|||||||
self.main_window, f"错误 - {APP_NAME}", "\n网络状态异常或服务器故障,请重试\n"
|
self.main_window, f"错误 - {APP_NAME}", "\n网络状态异常或服务器故障,请重试\n"
|
||||||
)
|
)
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
return
|
return
|
||||||
|
|
||||||
# 填充下载队列
|
# 填充下载队列
|
||||||
@@ -1104,6 +1128,32 @@ class DownloadManager:
|
|||||||
Args:
|
Args:
|
||||||
game_dirs: 识别到的游戏目录
|
game_dirs: 识别到的游戏目录
|
||||||
"""
|
"""
|
||||||
self.main_window.hide_loading_dialog()
|
self.main_window.ui_manager.hide_loading_dialog()
|
||||||
self.main_window.setEnabled(True)
|
|
||||||
self.main_window.patch_detector.on_offline_pre_hash_finished(updated_status, game_dirs)
|
if not game_dirs:
|
||||||
|
self.main_window.setEnabled(True)
|
||||||
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
|
from PySide6.QtWidgets import QMessageBox
|
||||||
|
from config.config import APP_NAME
|
||||||
|
QMessageBox.warning(
|
||||||
|
self.main_window,
|
||||||
|
f"目录错误 - {APP_NAME}",
|
||||||
|
"\n未能识别到任何游戏目录。\n\n请确认您选择的是游戏的上级目录,并且该目录中包含NEKOPARA系列游戏文件夹。\n"
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
self.main_window.ui_manager.show_loading_dialog("正在检查补丁状态...")
|
||||||
|
|
||||||
|
install_paths = self.get_install_paths()
|
||||||
|
|
||||||
|
# 使用异步方式进行哈希预检查
|
||||||
|
self.main_window.pre_hash_thread = self.main_window.patch_detector.create_hash_thread("pre", install_paths)
|
||||||
|
self.main_window.pre_hash_thread.pre_finished.connect(
|
||||||
|
lambda updated_status: self.on_pre_hash_finished_with_dirs(updated_status, game_dirs)
|
||||||
|
)
|
||||||
|
# 在线程自然结束时清理引用
|
||||||
|
try:
|
||||||
|
self.main_window.pre_hash_thread.finished.connect(lambda: setattr(self.main_window, 'pre_hash_thread', None))
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
self.main_window.pre_hash_thread.start()
|
||||||
@@ -4,6 +4,7 @@ from PySide6.QtWidgets import QDialog, QVBoxLayout, QRadioButton, QPushButton, Q
|
|||||||
from PySide6.QtGui import QFont
|
from PySide6.QtGui import QFont
|
||||||
|
|
||||||
from config.config import DOWNLOAD_THREADS
|
from config.config import DOWNLOAD_THREADS
|
||||||
|
from workers.download import DownloadThread
|
||||||
|
|
||||||
|
|
||||||
class DownloadTaskManager:
|
class DownloadTaskManager:
|
||||||
@@ -34,7 +35,7 @@ class DownloadTaskManager:
|
|||||||
# 按钮在file_dialog中已设置为禁用状态
|
# 按钮在file_dialog中已设置为禁用状态
|
||||||
|
|
||||||
# 创建并连接下载线程
|
# 创建并连接下载线程
|
||||||
self.current_download_thread = self.main_window.create_download_thread(url, _7z_path, game_version)
|
self.current_download_thread = DownloadThread(url, _7z_path, game_version, self.main_window)
|
||||||
self.current_download_thread.progress.connect(self.main_window.progress_window.update_progress)
|
self.current_download_thread.progress.connect(self.main_window.progress_window.update_progress)
|
||||||
self.current_download_thread.finished.connect(
|
self.current_download_thread.finished.connect(
|
||||||
lambda success, error: self.main_window.download_manager.on_download_finished(
|
lambda success, error: self.main_window.download_manager.on_download_finished(
|
||||||
|
|||||||
@@ -111,41 +111,25 @@ class OfflineModeManager:
|
|||||||
# 要查找的补丁文件名
|
# 要查找的补丁文件名
|
||||||
patch_files = ["vol.1.7z", "vol.2.7z", "vol.3.7z", "vol.4.7z", "after.7z"]
|
patch_files = ["vol.1.7z", "vol.2.7z", "vol.3.7z", "vol.4.7z", "after.7z"]
|
||||||
|
|
||||||
# 尝试多个可能的目录位置,从指定目录开始,然后是其父目录
|
# 只在指定目录中查找,不查找父目录和其他目录
|
||||||
search_dirs = [directory]
|
search_dirs = [directory]
|
||||||
|
|
||||||
# 添加可能的父目录
|
|
||||||
current = directory
|
|
||||||
for i in range(3): # 最多向上查找3层目录
|
|
||||||
parent = os.path.dirname(current)
|
|
||||||
if parent and parent != current: # 确保不是根目录
|
|
||||||
search_dirs.append(parent)
|
|
||||||
current = parent
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
|
|
||||||
# 添加工作目录(如果与指定目录不同)
|
|
||||||
work_dir = os.getcwd()
|
|
||||||
if work_dir not in search_dirs:
|
|
||||||
search_dirs.append(work_dir)
|
|
||||||
|
|
||||||
if debug_mode:
|
if debug_mode:
|
||||||
logger.debug(f"DEBUG: 将在以下目录中查找补丁文件: {search_dirs}")
|
logger.debug(f"DEBUG: 将在以下目录中查找补丁文件: {search_dirs}")
|
||||||
|
|
||||||
found_patches = {}
|
found_patches = {}
|
||||||
|
|
||||||
# 扫描所有可能的目录查找补丁文件
|
# 扫描目录查找补丁文件
|
||||||
try:
|
try:
|
||||||
# 首先尝试在指定目录查找
|
# 搜索指定目录
|
||||||
for search_dir in search_dirs:
|
search_dir = directory
|
||||||
|
if debug_mode:
|
||||||
|
logger.debug(f"DEBUG: 正在搜索目录: {search_dir}")
|
||||||
|
|
||||||
|
if not os.path.exists(search_dir):
|
||||||
if debug_mode:
|
if debug_mode:
|
||||||
logger.debug(f"DEBUG: 正在搜索目录: {search_dir}")
|
logger.debug(f"DEBUG: 目录不存在,跳过: {search_dir}")
|
||||||
|
else:
|
||||||
if not os.path.exists(search_dir):
|
|
||||||
if debug_mode:
|
|
||||||
logger.debug(f"DEBUG: 目录不存在,跳过: {search_dir}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
for file in os.listdir(search_dir):
|
for file in os.listdir(search_dir):
|
||||||
if file.lower() in patch_files:
|
if file.lower() in patch_files:
|
||||||
file_path = os.path.join(search_dir, file)
|
file_path = os.path.join(search_dir, file)
|
||||||
@@ -156,13 +140,6 @@ class OfflineModeManager:
|
|||||||
logger.info(f"找到离线补丁文件: {patch_name} 路径: {file_path}")
|
logger.info(f"找到离线补丁文件: {patch_name} 路径: {file_path}")
|
||||||
if debug_mode:
|
if debug_mode:
|
||||||
logger.debug(f"DEBUG: 找到离线补丁文件: {patch_name} 路径: {file_path}")
|
logger.debug(f"DEBUG: 找到离线补丁文件: {patch_name} 路径: {file_path}")
|
||||||
|
|
||||||
# 如果在当前目录找到了补丁文件,停止继续查找
|
|
||||||
if found_patches:
|
|
||||||
if debug_mode:
|
|
||||||
logger.debug(f"DEBUG: 在目录 {search_dir} 找到补丁文件,停止继续搜索")
|
|
||||||
break
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"扫描目录时出错: {str(e)}")
|
logger.error(f"扫描目录时出错: {str(e)}")
|
||||||
|
|
||||||
@@ -870,7 +847,7 @@ class OfflineModeManager:
|
|||||||
QMessageBox.StandardButton.Ok
|
QMessageBox.StandardButton.Ok
|
||||||
).exec()
|
).exec()
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -930,7 +907,7 @@ class OfflineModeManager:
|
|||||||
else:
|
else:
|
||||||
# 恢复UI状态
|
# 恢复UI状态
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -956,8 +933,9 @@ class OfflineModeManager:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
# 启动解压线程
|
# 启动解压线程
|
||||||
self.extraction_thread = self.main_window.create_extraction_thread(
|
from workers.extraction_thread import ExtractionThread
|
||||||
patch_file, game_folder, plugin_path, game_version
|
self.extraction_thread = ExtractionThread(
|
||||||
|
patch_file, game_folder, plugin_path, game_version, self.main_window
|
||||||
)
|
)
|
||||||
|
|
||||||
# 连接进度更新到窗口控件
|
# 连接进度更新到窗口控件
|
||||||
@@ -1062,4 +1040,4 @@ class OfflineModeManager:
|
|||||||
|
|
||||||
# 恢复UI状态
|
# 恢复UI状态
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
@@ -268,7 +268,7 @@ class PatchDetector:
|
|||||||
QMessageBox.critical(self.main_window, f"文件校验失败 - {APP_NAME}", message)
|
QMessageBox.critical(self.main_window, f"文件校验失败 - {APP_NAME}", message)
|
||||||
|
|
||||||
self.main_window.setEnabled(True)
|
self.main_window.setEnabled(True)
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
QTimer.singleShot(100, self.main_window.show_result)
|
QTimer.singleShot(100, self.main_window.show_result)
|
||||||
|
|
||||||
def on_offline_pre_hash_finished(self, updated_status, game_dirs):
|
def on_offline_pre_hash_finished(self, updated_status, game_dirs):
|
||||||
@@ -333,7 +333,7 @@ class PatchDetector:
|
|||||||
"\n未检测到任何需要安装补丁的游戏。\n\n请确保游戏文件夹位于选择的目录中。\n",
|
"\n未检测到任何需要安装补丁的游戏。\n\n请确保游戏文件夹位于选择的目录中。\n",
|
||||||
)
|
)
|
||||||
|
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
return
|
return
|
||||||
|
|
||||||
from PySide6 import QtWidgets
|
from PySide6 import QtWidgets
|
||||||
@@ -367,7 +367,7 @@ class PatchDetector:
|
|||||||
|
|
||||||
result = dialog.exec()
|
result = dialog.exec()
|
||||||
if result != QtWidgets.QDialog.DialogCode.Accepted or not list_widget.selectedItems():
|
if result != QtWidgets.QDialog.DialogCode.Accepted or not list_widget.selectedItems():
|
||||||
self.main_window.ui.start_install_text.setText("开始安装")
|
self.main_window.ui_manager.set_install_button_state("ready")
|
||||||
return
|
return
|
||||||
|
|
||||||
selected_games = [item.text() for item in list_widget.selectedItems()]
|
selected_games = [item.text() for item in list_widget.selectedItems()]
|
||||||
|
|||||||
@@ -977,9 +977,8 @@ class UIManager:
|
|||||||
self.main_window.config["offline_mode"] = True
|
self.main_window.config["offline_mode"] = True
|
||||||
self.main_window.save_config(self.main_window.config)
|
self.main_window.save_config(self.main_window.config)
|
||||||
|
|
||||||
# 在离线模式下始终启用开始安装按钮
|
# 在离线模式下启用开始安装按钮
|
||||||
if hasattr(self.main_window, 'set_start_button_enabled'):
|
self.set_install_button_state("ready")
|
||||||
self.main_window.set_start_button_enabled(True)
|
|
||||||
|
|
||||||
# 清除版本警告标志
|
# 清除版本警告标志
|
||||||
if hasattr(self.main_window, 'version_warning'):
|
if hasattr(self.main_window, 'version_warning'):
|
||||||
@@ -1073,4 +1072,34 @@ class UIManager:
|
|||||||
"""隐藏并销毁加载对话框."""
|
"""隐藏并销毁加载对话框."""
|
||||||
if self.loading_dialog:
|
if self.loading_dialog:
|
||||||
self.loading_dialog.hide()
|
self.loading_dialog.hide()
|
||||||
self.loading_dialog = None
|
self.loading_dialog = None
|
||||||
|
|
||||||
|
def set_install_button_state(self, state):
|
||||||
|
"""统一的安装按钮状态管理方法
|
||||||
|
|
||||||
|
Args:
|
||||||
|
state (str): 按钮状态 - "ready", "installing", "disabled", "completed"
|
||||||
|
"""
|
||||||
|
if hasattr(self.main_window, 'window_manager'):
|
||||||
|
if state == "ready":
|
||||||
|
self.main_window.window_manager.change_window_state(self.main_window.window_manager.STATE_READY)
|
||||||
|
elif state == "installing":
|
||||||
|
self.main_window.window_manager.change_window_state(self.main_window.window_manager.STATE_INSTALLING)
|
||||||
|
elif state == "disabled":
|
||||||
|
self.main_window.window_manager.change_window_state(self.main_window.window_manager.STATE_ERROR)
|
||||||
|
elif state == "completed":
|
||||||
|
self.main_window.window_manager.change_window_state(self.main_window.window_manager.STATE_COMPLETED)
|
||||||
|
else:
|
||||||
|
# 降级处理,直接设置按钮状态
|
||||||
|
if state == "ready":
|
||||||
|
self.main_window.ui.start_install_btn.setEnabled(True)
|
||||||
|
self.main_window.ui.start_install_text.setText("开始安装")
|
||||||
|
elif state == "installing":
|
||||||
|
self.main_window.ui.start_install_btn.setEnabled(False)
|
||||||
|
self.main_window.ui.start_install_text.setText("正在安装")
|
||||||
|
elif state == "disabled":
|
||||||
|
self.main_window.ui.start_install_btn.setEnabled(False)
|
||||||
|
self.main_window.ui.start_install_text.setText("!无法安装!")
|
||||||
|
elif state == "completed":
|
||||||
|
self.main_window.ui.start_install_btn.setEnabled(True)
|
||||||
|
self.main_window.ui.start_install_text.setText("安装完成")
|
||||||
@@ -8,23 +8,22 @@ import traceback
|
|||||||
|
|
||||||
from PySide6 import QtWidgets
|
from PySide6 import QtWidgets
|
||||||
from PySide6.QtCore import QTimer, Qt, QPoint, QRect, QSize
|
from PySide6.QtCore import QTimer, Qt, QPoint, QRect, QSize
|
||||||
from PySide6.QtWidgets import QMainWindow, QMessageBox, QGraphicsOpacityEffect, QGraphicsColorizeEffect, QDialog, QVBoxLayout, QProgressBar, QLabel
|
from PySide6.QtWidgets import QMainWindow, QMessageBox, QGraphicsOpacityEffect, QGraphicsColorizeEffect
|
||||||
from PySide6.QtGui import QPalette, QColor, QPainterPath, QRegion, QFont
|
from PySide6.QtGui import QPalette, QColor, QPainterPath, QRegion, QFont
|
||||||
from PySide6.QtGui import QAction # Added for menu actions
|
from PySide6.QtGui import QAction
|
||||||
# Removed QDialog, QVBoxLayout, QProgressBar, QLabel from here as they are managed by UIManager
|
|
||||||
|
|
||||||
from ui.Ui_install import Ui_MainWindows
|
from ui.Ui_install import Ui_MainWindows
|
||||||
from config.config import (
|
from config.config import (
|
||||||
APP_NAME, PLUGIN, GAME_INFO, BLOCK_SIZE,
|
APP_NAME, PLUGIN, GAME_INFO, BLOCK_SIZE,
|
||||||
PLUGIN_HASH, UA, CONFIG_URL, LOG_FILE,
|
PLUGIN_HASH, UA, CONFIG_URL, LOG_FILE,
|
||||||
DOWNLOAD_THREADS, DEFAULT_DOWNLOAD_THREAD_LEVEL, APP_VERSION # 添加APP_VERSION导入
|
DOWNLOAD_THREADS, DEFAULT_DOWNLOAD_THREAD_LEVEL, APP_VERSION
|
||||||
)
|
)
|
||||||
from utils import (
|
from utils import (
|
||||||
load_config, save_config, HashManager, AdminPrivileges, msgbox_frame, load_image_from_file
|
load_config, save_config, HashManager, AdminPrivileges, msgbox_frame, load_image_from_file
|
||||||
)
|
)
|
||||||
from workers import (
|
from workers import (
|
||||||
IpOptimizerThread,
|
IpOptimizerThread,
|
||||||
HashThread, ExtractionThread, ConfigFetchThread, DownloadThread
|
HashThread, ConfigFetchThread
|
||||||
)
|
)
|
||||||
from core import (
|
from core import (
|
||||||
MultiStageAnimations, UIManager, DownloadManager, DebugManager,
|
MultiStageAnimations, UIManager, DownloadManager, DebugManager,
|
||||||
@@ -328,9 +327,9 @@ class MainWindow(QMainWindow):
|
|||||||
self.animation_in_progress = False
|
self.animation_in_progress = False
|
||||||
|
|
||||||
# 启用所有菜单按钮
|
# 启用所有菜单按钮
|
||||||
self.ui.start_install_btn.setEnabled(True)
|
# 按钮状态由WindowManager统一管理
|
||||||
self.ui.uninstall_btn.setEnabled(True)
|
self.ui.uninstall_btn.setEnabled(True)
|
||||||
self.ui.toggle_patch_btn.setEnabled(True) # 启用禁/启用补丁按钮
|
self.ui.toggle_patch_btn.setEnabled(True)
|
||||||
self.ui.exit_btn.setEnabled(True)
|
self.ui.exit_btn.setEnabled(True)
|
||||||
|
|
||||||
# 检查是否处于离线模式
|
# 检查是否处于离线模式
|
||||||
@@ -348,25 +347,20 @@ class MainWindow(QMainWindow):
|
|||||||
self.set_start_button_enabled(False)
|
self.set_start_button_enabled(False)
|
||||||
|
|
||||||
def set_start_button_enabled(self, enabled, installing=False):
|
def set_start_button_enabled(self, enabled, installing=False):
|
||||||
"""[已弃用] 设置按钮启用状态的旧方法,保留以兼容旧代码
|
"""[过渡方法] 设置按钮状态,将调用委托给WindowManager
|
||||||
|
|
||||||
现在推荐使用主窗口的setEnabled方法和直接设置按钮文本
|
这个方法将逐步被淘汰,请使用 self.window_manager.change_window_state()
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
enabled: 是否启用按钮
|
enabled: 是否启用按钮
|
||||||
installing: 是否正在安装中
|
installing: 是否正在安装中
|
||||||
"""
|
"""
|
||||||
# 直接设置按钮文本,不改变窗口启用状态
|
|
||||||
if installing:
|
if installing:
|
||||||
self.ui.start_install_text.setText("正在安装")
|
self.window_manager.change_window_state(self.window_manager.STATE_INSTALLING)
|
||||||
self.install_button_enabled = False
|
elif enabled:
|
||||||
|
self.window_manager.change_window_state(self.window_manager.STATE_READY)
|
||||||
else:
|
else:
|
||||||
if enabled:
|
self.window_manager.change_window_state(self.window_manager.STATE_ERROR)
|
||||||
self.ui.start_install_text.setText("开始安装")
|
|
||||||
else:
|
|
||||||
self.ui.start_install_text.setText("!无法安装!")
|
|
||||||
|
|
||||||
self.install_button_enabled = enabled
|
|
||||||
|
|
||||||
def fetch_cloud_config(self):
|
def fetch_cloud_config(self):
|
||||||
"""获取云端配置(异步方式)"""
|
"""获取云端配置(异步方式)"""
|
||||||
@@ -421,19 +415,6 @@ class MainWindow(QMainWindow):
|
|||||||
def save_config(self, config):
|
def save_config(self, config):
|
||||||
"""保存配置的便捷方法"""
|
"""保存配置的便捷方法"""
|
||||||
self.config_manager.save_config(config)
|
self.config_manager.save_config(config)
|
||||||
|
|
||||||
# Remove create_progress_window, create_extraction_progress_window, show_loading_dialog, hide_loading_dialog
|
|
||||||
# These are now handled by UIManager
|
|
||||||
# def create_progress_window(self): ...
|
|
||||||
# def create_extraction_progress_window(self): ...
|
|
||||||
# def show_loading_dialog(self, message): ...
|
|
||||||
# def hide_loading_dialog(self): ...
|
|
||||||
|
|
||||||
# Remove create_download_thread, create_extraction_thread, create_hash_thread
|
|
||||||
# These are now handled by their respective managers or a new ThreadManager if we create one
|
|
||||||
# def create_download_thread(self, ...): ...
|
|
||||||
# def create_extraction_thread(self, ...): ...
|
|
||||||
# def create_hash_thread(self, ...): ...
|
|
||||||
|
|
||||||
def show_result(self):
|
def show_result(self):
|
||||||
"""显示安装结果,调用patch_manager的show_result方法"""
|
"""显示安装结果,调用patch_manager的show_result方法"""
|
||||||
@@ -470,9 +451,7 @@ class MainWindow(QMainWindow):
|
|||||||
|
|
||||||
self.download_manager.graceful_stop_threads(threads_to_stop)
|
self.download_manager.graceful_stop_threads(threads_to_stop)
|
||||||
|
|
||||||
# 移除此处的hosts操作
|
|
||||||
# self.download_manager.hosts_manager.restore()
|
|
||||||
# self.download_manager.hosts_manager.check_and_clean_all_entries()
|
|
||||||
self.debug_manager.stop_logging()
|
self.debug_manager.stop_logging()
|
||||||
|
|
||||||
if not force_exit:
|
if not force_exit:
|
||||||
@@ -595,7 +574,7 @@ class MainWindow(QMainWindow):
|
|||||||
|
|
||||||
if not game_dirs:
|
if not game_dirs:
|
||||||
self.setEnabled(True)
|
self.setEnabled(True)
|
||||||
self.ui.start_install_text.setText("开始安装")
|
self.window_manager.change_window_state(self.window_manager.STATE_READY)
|
||||||
QtWidgets.QMessageBox.warning(
|
QtWidgets.QMessageBox.warning(
|
||||||
self,
|
self,
|
||||||
f"目录错误 - {APP_NAME}",
|
f"目录错误 - {APP_NAME}",
|
||||||
@@ -624,7 +603,7 @@ class MainWindow(QMainWindow):
|
|||||||
self.setEnabled(True)
|
self.setEnabled(True)
|
||||||
self.patch_detector.on_offline_pre_hash_finished(updated_status, game_dirs)
|
self.patch_detector.on_offline_pre_hash_finished(updated_status, game_dirs)
|
||||||
|
|
||||||
# 移除on_offline_pre_hash_finished方法
|
|
||||||
|
|
||||||
def check_and_set_offline_mode(self):
|
def check_and_set_offline_mode(self):
|
||||||
"""检查是否有离线补丁文件,如果有则自动启用离线模式
|
"""检查是否有离线补丁文件,如果有则自动启用离线模式
|
||||||
@@ -721,29 +700,26 @@ class MainWindow(QMainWindow):
|
|||||||
logger.error(f"关闭哈希校验窗口时发生错误: {e}")
|
logger.error(f"关闭哈希校验窗口时发生错误: {e}")
|
||||||
self.hash_msg_box = None
|
self.hash_msg_box = None
|
||||||
|
|
||||||
|
def create_progress_window(self, title="下载进度", initial_text="准备中..."):
|
||||||
|
"""创建一个用于显示下载进度的窗口
|
||||||
|
|
||||||
|
Args:
|
||||||
|
title (str): 窗口标题,默认为"下载进度"
|
||||||
|
initial_text (str): 初始状态文本,默认为"准备中..."
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
进度窗口实例
|
||||||
|
"""
|
||||||
|
return self.ui_manager.create_progress_window(title, initial_text)
|
||||||
|
|
||||||
def create_extraction_progress_window(self):
|
def create_extraction_progress_window(self):
|
||||||
"""创建一个用于显示解压进度的窗口
|
"""创建一个用于显示解压进度的窗口
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
QDialog: 配置好的解压进度窗口实例
|
解压进度窗口实例
|
||||||
"""
|
"""
|
||||||
return self.ui_manager.create_progress_window("解压进度", "正在准备解压...")
|
return self.ui_manager.create_progress_window("解压进度", "正在准备解压...")
|
||||||
|
|
||||||
def create_extraction_thread(self, patch_file, game_folder, plugin_path, game_version):
|
|
||||||
"""创建一个解压线程
|
|
||||||
|
|
||||||
Args:
|
|
||||||
patch_file: 补丁文件路径
|
|
||||||
game_folder: 游戏目录路径
|
|
||||||
plugin_path: 插件路径
|
|
||||||
game_version: 游戏版本
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
ExtractionThread: 配置好的解压线程实例
|
|
||||||
"""
|
|
||||||
from workers.extraction_thread import ExtractionThread
|
|
||||||
return ExtractionThread(patch_file, game_folder, plugin_path, game_version, self)
|
|
||||||
|
|
||||||
def show_loading_dialog(self, message):
|
def show_loading_dialog(self, message):
|
||||||
"""显示加载对话框
|
"""显示加载对话框
|
||||||
|
|
||||||
@@ -754,8 +730,4 @@ class MainWindow(QMainWindow):
|
|||||||
|
|
||||||
def hide_loading_dialog(self):
|
def hide_loading_dialog(self):
|
||||||
"""隐藏加载对话框"""
|
"""隐藏加载对话框"""
|
||||||
self.ui_manager.hide_loading_dialog()
|
self.ui_manager.hide_loading_dialog()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user