From 00bbf1e113eab83c152214f9bd2d3c97eab5b4e0 Mon Sep 17 00:00:00 2001 From: Minidoracat Date: Tue, 3 Jun 2025 18:55:42 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E5=84=AA=E5=8C=96GUI=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=AE=A1=E7=90=86=E7=B5=B1=E4=B8=80=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E4=BF=9D=E5=AD=98=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E8=A1=9D=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/tabs/settings_tab.py | 8 ++-- .../gui/window/config_manager.py | 38 +++++++++++++++---- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/mcp_feedback_enhanced/gui/tabs/settings_tab.py b/src/mcp_feedback_enhanced/gui/tabs/settings_tab.py index 865a13c..4d867e4 100644 --- a/src/mcp_feedback_enhanced/gui/tabs/settings_tab.py +++ b/src/mcp_feedback_enhanced/gui/tabs/settings_tab.py @@ -462,9 +462,11 @@ class SettingsTab(QWidget): # 檢查是否真的有變更 if new_combined_mode != self.combined_mode or new_orientation != self.layout_orientation: - # 先保存配置 - self.config_manager.set_layout_mode(new_combined_mode) - self.config_manager.set_layout_orientation(new_orientation) + # 批量保存配置(避免多次寫入文件) + self.config_manager.update_partial_config({ + 'combined_mode': new_combined_mode, + 'layout_orientation': new_orientation + }) # 更新內部狀態 self.combined_mode = new_combined_mode diff --git a/src/mcp_feedback_enhanced/gui/window/config_manager.py b/src/mcp_feedback_enhanced/gui/window/config_manager.py index ff2479b..6ba3bfe 100644 --- a/src/mcp_feedback_enhanced/gui/window/config_manager.py +++ b/src/mcp_feedback_enhanced/gui/window/config_manager.py @@ -60,13 +60,37 @@ class ConfigManager: self._config_cache[key] = value self._save_config() + def update_partial_config(self, updates: Dict[str, Any]) -> None: + """批量更新配置項目,只保存指定的設定而不影響其他參數""" + try: + # 重新載入當前磁碟上的配置,確保我們有最新的數據 + current_config = {} + if self._config_file.exists(): + with open(self._config_file, 'r', encoding='utf-8') as f: + current_config = json.load(f) + + # 只更新指定的項目 + for key, value in updates.items(): + current_config[key] = value + # 同時更新內存緩存 + self._config_cache[key] = value + + # 保存到文件 + with open(self._config_file, 'w', encoding='utf-8') as f: + json.dump(current_config, f, ensure_ascii=False, indent=2) + + debug_log(f"部分配置已更新: {list(updates.keys())}") + + except Exception as e: + debug_log(f"更新部分配置失敗: {e}") + def get_layout_mode(self) -> bool: """獲取佈局模式(False=分離模式,True=合併模式)""" return self.get('combined_mode', False) def set_layout_mode(self, combined_mode: bool) -> None: """設置佈局模式""" - self.set('combined_mode', combined_mode) + self.update_partial_config({'combined_mode': combined_mode}) debug_log(f"佈局模式設置: {'合併模式' if combined_mode else '分離模式'}") def get_layout_orientation(self) -> str: @@ -77,7 +101,7 @@ class ConfigManager: """設置佈局方向""" if orientation not in ['vertical', 'horizontal']: orientation = 'vertical' - self.set('layout_orientation', orientation) + self.update_partial_config({'layout_orientation': orientation}) debug_log(f"佈局方向設置: {'垂直(上下)' if orientation == 'vertical' else '水平(左右)'}") def get_language(self) -> str: @@ -86,7 +110,7 @@ class ConfigManager: def set_language(self, language: str) -> None: """設置語言""" - self.set('language', language) + self.update_partial_config({'language': language}) debug_log(f"語言設置: {language}") def get_splitter_sizes(self, splitter_name: str) -> list: @@ -98,7 +122,7 @@ class ConfigManager: def set_splitter_sizes(self, splitter_name: str, sizes: list) -> None: """設置分割器尺寸""" - self.set(f'splitter_sizes.{splitter_name}', sizes) + self.update_partial_config({f'splitter_sizes.{splitter_name}': sizes}) debug_log(f"保存分割器 {splitter_name} 尺寸: {sizes}") def get_window_geometry(self) -> dict: @@ -109,8 +133,8 @@ class ConfigManager: return geometry def set_window_geometry(self, geometry: dict) -> None: - """設置窗口幾何信息""" - self.set('window_geometry', geometry) + """設置窗口幾何信息(使用部分更新避免覆蓋其他設定)""" + self.update_partial_config({'window_geometry': geometry}) debug_log(f"保存窗口幾何信息: {geometry}") def get_always_center_window(self) -> bool: @@ -119,7 +143,7 @@ class ConfigManager: def set_always_center_window(self, always_center: bool) -> None: """設置總是在主螢幕中心顯示視窗""" - self.set('always_center_window', always_center) + self.update_partial_config({'always_center_window': always_center}) debug_log(f"視窗定位設置: {'總是中心顯示' if always_center else '智能定位'}") def reset_settings(self) -> None: