From 84352e5badec452690681237ab5b457010e55485 Mon Sep 17 00:00:00 2001 From: suyu <1643689728@qq.com> Date: Thu, 27 Aug 2026 09:53:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8C=89Esc=E9=80=80=E5=87=BA=E9=BC=A0?= =?UTF-8?q?=E6=A0=87=E7=94=BB=E7=BA=BF=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/ui/logic_editor_widget.cpp | 14 +++++++++ app/src/ui/logic_editor_widget.h | 2 ++ app/src/ui/main_window.cpp | 10 +++++++ app/tests/runtime_panel_controller_tests.cpp | 31 ++++++++++++++++++++ 4 files changed, 57 insertions(+) diff --git a/app/src/ui/logic_editor_widget.cpp b/app/src/ui/logic_editor_widget.cpp index 79ef509..f9967d2 100644 --- a/app/src/ui/logic_editor_widget.cpp +++ b/app/src/ui/logic_editor_widget.cpp @@ -2386,6 +2386,20 @@ void LogicEditorWidget::mouseDoubleClickEvent(QMouseEvent *event) event->accept(); } +void LogicEditorWidget::keyPressEvent(QKeyEvent *event) +{ + if (event != nullptr + && event->key() == Qt::Key_Escape + && event->modifiers() == Qt::NoModifier + && mouse_wire_mode_ != MouseWireMode::Select) + { + setMouseWireMode(MouseWireMode::Select); + event->accept(); + return; + } + QGraphicsView::keyPressEvent(event); +} + void LogicEditorWidget::drawForeground( QPainter *painter, const QRectF &rect) { diff --git a/app/src/ui/logic_editor_widget.h b/app/src/ui/logic_editor_widget.h index ca20dc2..4722819 100644 --- a/app/src/ui/logic_editor_widget.h +++ b/app/src/ui/logic_editor_widget.h @@ -15,6 +15,7 @@ class QGraphicsScene; class QCompleter; class QEvent; +class QKeyEvent; class QLineEdit; class QMouseEvent; class QPainter; @@ -77,6 +78,7 @@ protected: void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; void drawForeground(QPainter *painter, const QRectF &rect) override; void resizeEvent(QResizeEvent *event) override; void scrollContentsBy(int dx, int dy) override; diff --git a/app/src/ui/main_window.cpp b/app/src/ui/main_window.cpp index d6b9d96..ddbde8d 100644 --- a/app/src/ui/main_window.cpp +++ b/app/src/ui/main_window.cpp @@ -1476,6 +1476,16 @@ void MainWindow::clearActiveSelection() logic_editor_widget_->clearSelection(); selected_logic_node_id_.clear(); showLogicNodeProperties({}); + if (logic_editor_widget_->mouseWireMode() + != LogicEditorWidget::MouseWireMode::Select) + { + const QSignalBlocker draw_blocker(ui_->mouseDrawWireAction); + const QSignalBlocker erase_blocker(ui_->mouseEraseWireAction); + ui_->mouseDrawWireAction->setChecked(false); + ui_->mouseEraseWireAction->setChecked(false); + logic_editor_widget_->setMouseWireMode( + LogicEditorWidget::MouseWireMode::Select); + } } } diff --git a/app/tests/runtime_panel_controller_tests.cpp b/app/tests/runtime_panel_controller_tests.cpp index 14f72a3..17157db 100644 --- a/app/tests/runtime_panel_controller_tests.cpp +++ b/app/tests/runtime_panel_controller_tests.cpp @@ -839,6 +839,36 @@ void testWireGesturePreviewKeepsAtomicCommit() "undo must restore every cell changed by the gesture"); } +void testEscapeExitsMouseWireMode() +{ + TestProjectStorage storage; + ProjectService project_service(storage); + LogicEditorService editor(project_service); + LogicEditorWidget widget(editor); + + const auto press_escape = [&widget] + { + QKeyEvent event( + QEvent::KeyPress, + Qt::Key_Escape, + Qt::NoModifier); + QApplication::sendEvent(&widget, &event); + require(event.isAccepted(), "escape must be consumed by the logic editor"); + }; + + widget.setMouseWireMode(LogicEditorWidget::MouseWireMode::Draw); + press_escape(); + require( + widget.mouseWireMode() == LogicEditorWidget::MouseWireMode::Select, + "escape must exit mouse draw mode"); + + widget.setMouseWireMode(LogicEditorWidget::MouseWireMode::Erase); + press_escape(); + require( + widget.mouseWireMode() == LogicEditorWidget::MouseWireMode::Select, + "escape must exit mouse erase mode"); +} + void testCursorAdvanceAndInlineCommandInput() { TestProjectStorage storage; @@ -1232,6 +1262,7 @@ int main(int argc, char *argv[]) testLogicEditorGridSelectionAndDeletion(); testLadderLayoutAndDragDeletion(); testWireGesturePreviewKeepsAtomicCommit(); + testEscapeExitsMouseWireMode(); testCursorAdvanceAndInlineCommandInput(); testVerticalWireShortcutAdvancesDownward(); testSegmentLevelTraceProjection();