From 5f6e8d1eefb0cb68e687489e2aaa39741a4d3b77 Mon Sep 17 00:00:00 2001 From: Minidoracat Date: Thu, 5 Jun 2025 05:46:47 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=BE=A9GUI=E9=87=8D?= =?UTF-8?q?=E8=A4=87=E8=B2=BC=E4=B8=8A=E5=9C=96=E7=89=87=E7=9A=84=E5=95=8F?= =?UTF-8?q?=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/tabs/feedback_tab.py | 30 ++++++++----------- .../gui/widgets/image_upload.py | 9 ++++++ .../gui/window/feedback_window.py | 5 +--- .../gui/window/tab_manager.py | 5 +--- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/mcp_feedback_enhanced/gui/tabs/feedback_tab.py b/src/mcp_feedback_enhanced/gui/tabs/feedback_tab.py index 7ec7ab6..d9eb01f 100644 --- a/src/mcp_feedback_enhanced/gui/tabs/feedback_tab.py +++ b/src/mcp_feedback_enhanced/gui/tabs/feedback_tab.py @@ -17,7 +17,6 @@ from ..window.config_manager import ConfigManager class FeedbackTab(QWidget): """回饋分頁組件""" - image_paste_requested = Signal() def __init__(self, parent=None): super().__init__(parent) @@ -80,6 +79,17 @@ class FeedbackTab(QWidget): } """) + # 創建圖片上傳區域(需要先創建以便連接信號) + image_upload_widget = QWidget() + image_upload_widget.setMinimumHeight(200) # 進一步增加最小高度 + image_upload_widget.setMaximumHeight(320) # 增加最大高度 + image_upload_layout = QVBoxLayout(image_upload_widget) + image_upload_layout.setSpacing(8) + image_upload_layout.setContentsMargins(0, 8, 0, 0) # 與回饋輸入區域保持一致的邊距 + + self.image_upload = ImageUploadWidget(config_manager=self.config_manager) + image_upload_layout.addWidget(self.image_upload, 1) + # 回饋輸入區域 self.feedback_input = SmartTextEdit() placeholder_text = t('feedback.placeholder').replace("Ctrl+Enter", "Ctrl+Enter/Cmd+Enter").replace("Ctrl+V", "Ctrl+V/Cmd+V") @@ -96,18 +106,8 @@ class FeedbackTab(QWidget): line-height: 1.4; } """) - self.feedback_input.image_paste_requested.connect(self.image_paste_requested) - - # 圖片上傳區域(確保固定高度和滾動支持) - image_upload_widget = QWidget() - image_upload_widget.setMinimumHeight(200) # 進一步增加最小高度 - image_upload_widget.setMaximumHeight(320) # 增加最大高度 - image_upload_layout = QVBoxLayout(image_upload_widget) - image_upload_layout.setSpacing(8) - image_upload_layout.setContentsMargins(0, 8, 0, 0) # 與回饋輸入區域保持一致的邊距 - - self.image_upload = ImageUploadWidget(config_manager=self.config_manager) - image_upload_layout.addWidget(self.image_upload, 1) + # 直接連接文字輸入框的圖片貼上信號到圖片上傳組件 + self.feedback_input.image_paste_requested.connect(self.image_upload.paste_from_clipboard) # 添加到分割器 feedback_splitter.addWidget(self.feedback_input) @@ -161,10 +161,6 @@ class FeedbackTab(QWidget): if hasattr(self, 'image_upload'): self.image_upload.update_texts() - - def handle_image_paste_from_textarea(self) -> None: - """處理從文字框智能貼上圖片的功能""" - self.image_upload.paste_from_clipboard() def _save_feedback_splitter_position(self, splitter: QSplitter) -> None: """保存分割器的位置""" diff --git a/src/mcp_feedback_enhanced/gui/widgets/image_upload.py b/src/mcp_feedback_enhanced/gui/widgets/image_upload.py index 9a36ce8..2a1c208 100644 --- a/src/mcp_feedback_enhanced/gui/widgets/image_upload.py +++ b/src/mcp_feedback_enhanced/gui/widgets/image_upload.py @@ -36,6 +36,7 @@ class ImageUploadWidget(QWidget): super().__init__(parent) self.images: Dict[str, Dict[str, str]] = {} self.config_manager = config_manager + self._last_paste_time = 0 # 添加最後貼上時間記錄 self._setup_ui() self.setAcceptDrops(True) # 啟動時清理舊的臨時文件 @@ -335,6 +336,14 @@ class ImageUploadWidget(QWidget): def paste_from_clipboard(self) -> None: """從剪貼板粘貼圖片""" + # 防重複保護:檢查是否在短時間內重複調用 + current_time = time.time() * 1000 # 轉換為毫秒 + if current_time - self._last_paste_time < 100: # 100毫秒內的重複調用忽略 + debug_log(f"忽略重複的剪貼板粘貼請求(間隔: {current_time - self._last_paste_time:.1f}ms)") + return + + self._last_paste_time = current_time + clipboard = QApplication.clipboard() mimeData = clipboard.mimeData() diff --git a/src/mcp_feedback_enhanced/gui/window/feedback_window.py b/src/mcp_feedback_enhanced/gui/window/feedback_window.py index 5de4dca..79e7cab 100644 --- a/src/mcp_feedback_enhanced/gui/window/feedback_window.py +++ b/src/mcp_feedback_enhanced/gui/window/feedback_window.py @@ -434,10 +434,7 @@ class FeedbackWindow(QMainWindow): debug_log(f"佈局變更失敗: {e}") QMessageBox.warning(self, t('errors.title'), t('errors.interfaceReloadError', error=str(e))) - def _handle_image_paste_from_textarea(self) -> None: - """處理從文字框智能貼上圖片的功能""" - if self.tab_manager.feedback_tab: - self.tab_manager.feedback_tab.handle_image_paste_from_textarea() + def _on_reset_settings_requested(self) -> None: """處理重置設定請求""" diff --git a/src/mcp_feedback_enhanced/gui/window/tab_manager.py b/src/mcp_feedback_enhanced/gui/window/tab_manager.py index 559fb61..791af10 100644 --- a/src/mcp_feedback_enhanced/gui/window/tab_manager.py +++ b/src/mcp_feedback_enhanced/gui/window/tab_manager.py @@ -330,10 +330,7 @@ class TabManager: if hasattr(parent, '_on_timeout_settings_changed'): self.settings_tab.timeout_settings_changed.connect(parent._on_timeout_settings_changed) - # 連接回饋分頁的圖片貼上信號 - if self.feedback_tab: - if hasattr(parent, '_handle_image_paste_from_textarea'): - self.feedback_tab.image_paste_requested.connect(parent._handle_image_paste_from_textarea) + # 圖片貼上信號已在 FeedbackTab 內部直接處理,不需要外部連接 def cleanup(self) -> None: """清理資源"""