feat(core): 增强离线模式和日志记录功能

- 在主窗口中添加离线模式提示弹窗,用户可清晰了解离线模式切换情况。
- 更新离线模式管理器,优化补丁文件扫描和日志记录,确保无论调试模式下均能记录相关信息。
- 在下载管理器和补丁管理器中增强调试信息的记录,提升错误处理能力。
- 更新卸载处理程序,增加详细的日志记录,确保用户操作的透明性和可追溯性。
This commit is contained in:
hyb-oyqq
2025-08-07 16:10:11 +08:00
parent bf80c19fe1
commit 575116e45c
6 changed files with 333 additions and 38 deletions

View File

@@ -28,6 +28,11 @@ class UninstallHandler(QObject):
self.game_detector = main_window.game_detector
self.patch_manager = main_window.patch_manager
self.app_name = main_window.patch_manager.app_name
# 记录初始化日志
debug_mode = self.debug_manager._is_debug_mode() if hasattr(self.debug_manager, '_is_debug_mode') else False
if debug_mode:
logger.debug("DEBUG: 卸载处理程序已初始化")
def handle_uninstall_button_click(self):
"""
@@ -37,22 +42,33 @@ class UninstallHandler(QObject):
# 获取游戏目录
debug_mode = self.debug_manager._is_debug_mode()
logger.info("用户点击了卸载补丁按钮")
if debug_mode:
logger.debug("DEBUG: 处理卸载补丁按钮点击事件")
# 提示用户选择目录
file_dialog_info = "选择游戏上级目录" if debug_mode else "选择游戏目录"
selected_folder = QFileDialog.getExistingDirectory(self.main_window, file_dialog_info, "")
if not selected_folder or selected_folder == "":
logger.info("用户取消了目录选择")
if debug_mode:
logger.debug("DEBUG: 用户取消了目录选择,退出卸载流程")
return # 用户取消了选择
logger.info(f"用户选择了目录: {selected_folder}")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 用户选择了目录: {selected_folder}")
# 首先尝试将选择的目录视为上级目录,使用增强的目录识别功能
logger.info("尝试识别游戏目录")
game_dirs = self.game_detector.identify_game_directories_improved(selected_folder)
if game_dirs and len(game_dirs) > 0:
logger.info(f"在上级目录中找到游戏: {list(game_dirs.keys())}")
self._handle_multiple_games(game_dirs, debug_mode)
else:
logger.info("未在上级目录找到游戏,尝试将选择的目录作为单个游戏目录处理")
self._handle_single_game(selected_folder, debug_mode)
def _handle_multiple_games(self, game_dirs, debug_mode):
@@ -67,15 +83,26 @@ class UninstallHandler(QObject):
logger.debug(f"DEBUG: 卸载功能 - 在上级目录中找到以下游戏: {list(game_dirs.keys())}")
# 查找已安装补丁的游戏,只处理那些已安装补丁的游戏
logger.info("检查哪些游戏已安装补丁")
games_with_patch = {}
for game_version, game_dir in game_dirs.items():
if self.patch_manager.check_patch_installed(game_dir, game_version):
is_installed = self.patch_manager.check_patch_installed(game_dir, game_version)
if is_installed:
games_with_patch[game_version] = game_dir
logger.info(f"游戏 {game_version} 已安装补丁")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - {game_version} 已安装补丁")
logger.debug(f"DEBUG: 卸载功能 - {game_version} 已安装补丁,目录: {game_dir}")
else:
logger.info(f"游戏 {game_version} 未安装补丁")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - {game_version} 未安装补丁,跳过")
# 检查是否有已安装补丁的游戏
if not games_with_patch:
logger.info("未找到已安装补丁的游戏")
if debug_mode:
logger.debug("DEBUG: 卸载功能 - 未找到已安装补丁的游戏,显示提示消息")
QMessageBox.information(
self.main_window,
f"提示 - {self.app_name}",
@@ -85,16 +112,31 @@ class UninstallHandler(QObject):
return
# 显示选择对话框
logger.info("显示游戏选择对话框")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 显示游戏选择对话框,可选游戏: {list(games_with_patch.keys())}")
selected_games = self._show_game_selection_dialog(games_with_patch)
if not selected_games:
logger.info("用户未选择任何游戏或取消了选择")
if debug_mode:
logger.debug("DEBUG: 卸载功能 - 用户未选择任何游戏或取消了选择,退出卸载流程")
return # 用户取消了选择
logger.info(f"用户选择了以下游戏: {selected_games}")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 用户选择了以下游戏: {selected_games}")
# 过滤game_dirs只保留选中的游戏
selected_game_dirs = {game: games_with_patch[game] for game in selected_games if game in games_with_patch}
# 确认卸载
game_list = '\n'.join(selected_games)
logger.info("显示卸载确认对话框")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 显示卸载确认对话框,选择的游戏: {selected_games}")
reply = QMessageBox.question(
self.main_window,
f"确认卸载 - {self.app_name}",
@@ -104,10 +146,26 @@ class UninstallHandler(QObject):
)
if reply == QMessageBox.StandardButton.No:
logger.info("用户取消了卸载操作")
if debug_mode:
logger.debug("DEBUG: 卸载功能 - 用户取消了卸载操作,退出卸载流程")
return
logger.info("开始批量卸载补丁")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 开始批量卸载补丁,游戏: {list(selected_game_dirs.keys())}")
# 使用批量卸载方法
success_count, fail_count, results = self.patch_manager.batch_uninstall_patches(selected_game_dirs)
logger.info(f"批量卸载完成,成功: {success_count},失败: {fail_count}")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 批量卸载完成,成功: {success_count},失败: {fail_count}")
if results:
for result in results:
status = "成功" if result["success"] else "失败"
logger.debug(f"DEBUG: 卸载结果 - {result['version']}: {status}, 消息: {result['message']}, 删除文件数: {result['files_removed']}")
self.patch_manager.show_uninstall_result(success_count, fail_count, results)
def _handle_single_game(self, selected_folder, debug_mode):
@@ -122,15 +180,28 @@ class UninstallHandler(QObject):
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 未在上级目录找到游戏,尝试将选择的目录视为游戏目录")
logger.info("尝试识别单个游戏版本")
game_version = self.game_detector.identify_game_version(selected_folder)
if game_version:
logger.info(f"识别为游戏: {game_version}")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 识别为游戏: {game_version}")
# 检查是否已安装补丁
if self.patch_manager.check_patch_installed(selected_folder, game_version):
logger.info(f"检查 {game_version} 是否已安装补丁")
is_installed = self.patch_manager.check_patch_installed(selected_folder, game_version)
if is_installed:
logger.info(f"{game_version} 已安装补丁")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - {game_version} 已安装补丁")
# 确认卸载
logger.info("显示卸载确认对话框")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 显示卸载确认对话框,游戏: {game_version}")
reply = QMessageBox.question(
self.main_window,
f"确认卸载 - {self.app_name}",
@@ -140,11 +211,37 @@ class UninstallHandler(QObject):
)
if reply == QMessageBox.StandardButton.Yes:
logger.info(f"开始卸载 {game_version} 的补丁")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 用户确认卸载 {game_version} 的补丁")
# 创建单个游戏的目录字典,使用批量卸载流程
single_game_dir = {game_version: selected_folder}
logger.info("执行批量卸载方法(单游戏)")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 执行批量卸载方法(单游戏): {game_version}")
success_count, fail_count, results = self.patch_manager.batch_uninstall_patches(single_game_dir)
logger.info(f"卸载完成,成功: {success_count},失败: {fail_count}")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 卸载完成,成功: {success_count},失败: {fail_count}")
if results:
for result in results:
status = "成功" if result["success"] else "失败"
logger.debug(f"DEBUG: 卸载结果 - {result['version']}: {status}, 消息: {result['message']}, 删除文件数: {result['files_removed']}")
self.patch_manager.show_uninstall_result(success_count, fail_count, results)
else:
logger.info("用户取消了卸载操作")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 用户取消了卸载 {game_version} 的补丁")
else:
logger.info(f"{game_version} 未安装补丁")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - {game_version} 未安装补丁,显示提示消息")
# 没有安装补丁
QMessageBox.information(
self.main_window,
@@ -154,8 +251,9 @@ class UninstallHandler(QObject):
)
else:
# 两种方式都未识别到游戏
logger.info("无法识别游戏")
if debug_mode:
logger.debug(f"DEBUG: 卸载功能 - 无法识别游戏")
logger.debug(f"DEBUG: 卸载功能 - 无法识别游戏,显示错误消息")
msg_box = msgbox_frame(
f"错误 - {self.app_name}",
@@ -182,7 +280,7 @@ class UninstallHandler(QObject):
# 添加"已安装补丁的游戏"标签
already_installed_label = QLabel("已安装补丁的游戏:", dialog)
already_installed_label.setFont(QFont(already_installed_label.font().family(), already_installed_label.font().pointSize(), QFont.Bold))
already_installed_label.setFont(QFont(already_installed_label.font().family(), already_installed_label.font().pointSize(), QFont.Weight.Bold))
layout.addWidget(already_installed_label)
# 添加已安装游戏列表(可选,这里使用静态标签替代,保持一致性)
@@ -195,7 +293,7 @@ class UninstallHandler(QObject):
# 添加"请选择要卸载补丁的游戏"标签
info_label = QLabel("请选择要卸载补丁的游戏:", dialog)
info_label.setFont(QFont(info_label.font().family(), info_label.font().pointSize(), QFont.Bold))
info_label.setFont(QFont(info_label.font().family(), info_label.font().pointSize(), QFont.Weight.Bold))
layout.addWidget(info_label)
# 添加列表控件,只显示已安装补丁的游戏