From 3c1fb2fe72b1ecf0281f7024e74a89247453b136 Mon Sep 17 00:00:00 2001 From: ispyisail Date: Sat, 19 Sep 2026 08:32:58 +1200 Subject: [PATCH] Let Escape cancel the text tool, like every other placement (#903) Issue #903 reported that Escape stopped cancelling an in-progress placement. PR #899 fixed that by letting Escape through to the active tool whenever Diagram::eventInterfaceIsRunning(), and 863ac5f0a tightened it to isRunning() so a second Escape cannot retrigger an abort already in flight. That covers seven of the eight tools. It cannot cover the eighth. eventInterfaceIsRunning() is m_event_interface && isRunning(), and isRunning() returns m_running. DiagramEventAddText is the only class under sources/diagramevent/ that never sets m_running, so the guard reads false for the whole time the tool is armed and DiagramView::keyPressEvent keeps swallowing Escape for its own selection/focus handling. It is also the only one of the eight with no RightButton branch -- right-clicking the folio with the text tool armed opens the folio context menu. So this tool currently has no way to cancel at all: the only way out is to pick a different tool, and any stray click drops a text field the user did not want. The tool is armed from the moment it is attached, so m_running is set in the constructor and cleared where the text is placed, before finish(). Measured on a virtual display against a fixture holding one free text field, counting diagram-level text fields in the saved project: arm the text tool, click 2 fields places, as it should arm it, press Escape, then click 2 fields before -- not cancelled 1 field after -- cancelled The same run on master's rectangle tool cancels correctly, which is what made the text tool look fixed when it was not. ctest 12/12, Qt 6. Co-Authored-By: Claude Opus 5 --- sources/diagramevent/diagrameventaddtext.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sources/diagramevent/diagrameventaddtext.cpp b/sources/diagramevent/diagrameventaddtext.cpp index 799584dc9..97db3c1d0 100644 --- a/sources/diagramevent/diagrameventaddtext.cpp +++ b/sources/diagramevent/diagrameventaddtext.cpp @@ -29,7 +29,14 @@ */ DiagramEventAddText::DiagramEventAddText(Diagram *diagram) : DiagramEventInterface(diagram) -{} +{ + //The tool is armed from the moment it is attached: the next left + //click places a text. DiagramView::keyPressEvent() asks + //Diagram::eventInterfaceIsRunning() -- which is isRunning(), i.e. + //m_running -- before letting Escape through to the tool, so without + //this the view swallows Escape and the tool cannot be cancelled. + m_running = true; +} /** @brief DiagramEventAddText::~DiagramEventAddText @@ -52,6 +59,8 @@ void DiagramEventAddText::mousePressEvent(QGraphicsSceneMouseEvent *event) event->scenePos())); text->setTextInteractionFlags(Qt::TextEditorInteraction); text->setFocus(Qt::MouseFocusReason); + //Placed: the tool is done before it announces it. + m_running = false; emit finish(); event->setAccepted(true); }