From 07435465426dee8ae33e0e9f698d9e2ecd687c3a Mon Sep 17 00:00:00 2001 From: Kellermorph Date: Sat, 10 Oct 2026 09:35:47 +0200 Subject: [PATCH] Take the right button away from the cable tool only, not from every tool The cable feature suppressed the quick command ring for every running tool, so drawing a line or placing an element no longer got the ring a right drag shows -- a far wider change than the feature needed, and one nobody asked for (blocking review comment by ispyisail). The condition is now the cable tool alone. Diagram::cableToolIsRunning() says whether that is the running interface, and while it is, the right click cancels the line being drawn and opens neither the ring nor a context menu, neither QET's own nor the platform's -- which is the behaviour the cable tool needs and the only part that was ever intended. Everything else in mousePressEvent is upstream's original again: a gesture is tracked whatever else is running, a running tool sets m_gesture_over_tool so the press carries on to the scene and a drag ends the tool before the ring appears, and only the click which neither draws nor selects swallows the platform's menu. A structural diff of mousePressEvent against the commit before the cable feature shows three added conditions and nothing else. --- sources/diagram.cpp | 18 +++++++++++ sources/diagram.h | 1 + sources/diagramview.cpp | 70 +++++++++++++++++++++++------------------ 3 files changed, 59 insertions(+), 30 deletions(-) diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 1d443fe9f..a04d4b433 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -25,6 +25,7 @@ #include "xml/terminalstripitemxml.h" #include "QPropertyUndoCommand/qpropertyundocommand.h" #include "diagramcontent.h" +#include "diagramevent/diagrameventaddcable.h" #include "diagramevent/diagrameventinterface.h" #include "diagramposition.h" #include "factory/elementfactory.h" @@ -902,6 +903,23 @@ bool Diagram::eventInterfaceIsRunning() const return m_event_interface && m_event_interface->isRunning(); } +/** + @brief Diagram::cableToolIsRunning + @return true while the cable drawing tool is the running tool. + + That tool is the one which takes the right mouse button away from + everything else: while it runs, a right click cancels the line being + drawn and must not open the quick command ring nor any context menu + with it. Every other tool lets go of the button again and is + surrounded by the ring the way it always was. +*/ +bool Diagram::cableToolIsRunning() const +{ + return m_event_interface + && m_event_interface->isRunning() + && qobject_cast(m_event_interface); +} + /** @brief Diagram::conductorsAutonumName @return the name of autonum to use. diff --git a/sources/diagram.h b/sources/diagram.h index 8e25d2518..c19cac53b 100644 --- a/sources/diagram.h +++ b/sources/diagram.h @@ -239,6 +239,7 @@ class Diagram : public QGraphicsScene virtual void addItem (QGraphicsItem *item); virtual void removeItem (QGraphicsItem *item); bool eventInterfaceIsRunning() const; + bool cableToolIsRunning() const; // methods related to graphics options ExportProperties applyProperties(const ExportProperties &); diff --git a/sources/diagramview.cpp b/sources/diagramview.cpp index 452aed77d..0546240a8 100644 --- a/sources/diagramview.cpp +++ b/sources/diagramview.cpp @@ -931,52 +931,62 @@ void DiagramView::mousePressEvent(QMouseEvent *e) m_swallow_native_menu = false; m_gesture_over_tool = false; - //A right click on a running tool belongs to the tool alone: it - //cancels the line being drawn or ends the tool, and ending the - //tool puts the context menu policy of the views back before this - //very click is over. The platform then still sends its own - //context menu for the same click -- on X11 with the press, on - //Windows with the release -- and the menu would open on the - //click which was meant to cancel. So it is swallowed here, the - //way a gesture swallows it further down; the next press which no - //tool handles puts this flag back to false. + //A right click on the running cable tool belongs to the tool + //alone: it cancels the line being drawn, and ending the tool puts + //the context menu policy of the views back before this very click + //is over. The platform then still sends its own context menu for + //the same click -- on X11 with the press, on Windows with the + //release -- and the menu would open on the click which was meant + //to cancel. So it is swallowed here, the way a gesture swallows + //it further down; the next press which no tool handles puts this + //flag back to false. No other tool is touched: they hand the + //button back and are surrounded by the ring, as they always were. if (e->button() == Qt::RightButton && m_diagram - && m_diagram->eventInterfaceIsRunning()) { + && m_diagram->cableToolIsRunning()) { m_swallow_native_menu = true; } if (e->button() == Qt::RightButton && DiagramGestureOverlay::isEnabled() && !m_diagram->focusItem() - && !m_diagram->eventInterfaceIsRunning()) + && !m_diagram->cableToolIsRunning()) { - //No tool is running: the right button draws the quick command - //ring, or opens the context menu on release. When a tool *is* - //running, no gesture is tracked at all: the tool owns the right - //button (it cancels the line being drawn or ends itself), and + //The right button draws the quick command ring, or opens the + //context menu on release. The cable tool alone does not let go + //of it: while it runs no gesture is tracked at all, because //tracking one would both pop the ring up in the middle of the - //drawing and take the tool away from under the user (see - //mouseMoveEvent, which ends the tool as soon as a gesture is - //recognised). + //drawing and take the tool away from the click meant to + //cancel it (see mouseMoveEvent, which ends the tool as soon + //as a gesture is recognised). m_gesture_tracking = true; m_gesture_origin = e->position().toPoint(); m_context_toolbar->hide(); - m_swallow_native_menu = true; + //Another tool is running, often one a gesture just started. A + //right click still goes to it -- it cancels or finishes the + //tool -- so the press carries on to the scene. A drag ends the + //tool and shows the ring (see mouseMoveEvent). + if (m_diagram->eventInterfaceIsRunning()) { + m_gesture_over_tool = true; + } + else + { + m_swallow_native_menu = true; - //Select what is under the mouse, as the context menu does, so - //a gesture acts on it - if (QGraphicsItem *item = m_diagram->itemAt(mapToScene(m_gesture_origin), transform())) { - if (!item->isSelected()) { - m_diagram->clearSelection(); - //Clearing the selection can delete handler items, so - //look the item up again (see contextMenuEvent) - if (QGraphicsItem *again = m_diagram->itemAt(mapToScene(m_gesture_origin), transform())) { - again->setSelected(true); + //Select what is under the mouse, as the context menu does, so + //a gesture acts on it + if (QGraphicsItem *item = m_diagram->itemAt(mapToScene(m_gesture_origin), transform())) { + if (!item->isSelected()) { + m_diagram->clearSelection(); + //Clearing the selection can delete handler items, so + //look the item up again (see contextMenuEvent) + if (QGraphicsItem *again = m_diagram->itemAt(mapToScene(m_gesture_origin), transform())) { + again->setSelected(true); + } } } + e->accept(); + return; } - e->accept(); - return; } //Start drag view when hold the middle button