Click again on a member of a selected group to pick it on its own

Clicking an item of a group selects the whole group (#1070). Clicking
again on one of its items is meant to select just that item, to edit it
on its own -- what discussion #1070 proposed -- but the second click
selected the whole group again: Qt left only the clicked item selected on
release, and the group completion pulled the others back in.

A press on a member of a group that is selected whole now notes that
member (ItemGroups::memberToPick(), which also finds the member when the
click lands on a symbol's own text). If the click ends without a drag and
Qt has left only that member selected, the selection stays so. A drag
still moves the whole group; Ctrl+click keeps its meaning; a group of one
is not picked from.

In the GUI, on two grouped texts: one click then Delete removes both
(master and this); click, click again, Delete removes only the clicked
text here, both on master; dragging after one click moves both texts by
the same amount on both. tst_itemgroups: 5 new checks; removing the
whole-group or the group-of-one condition fails one each. ctest 24/24.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ispyisail
2026-09-28 22:33:28 +13:00
parent 5ca047a05d
commit 6ed41bbfd0
5 changed files with 120 additions and 0 deletions
+31
View File
@@ -437,6 +437,24 @@ void Diagram::mousePressEvent(QGraphicsSceneMouseEvent *event)
}
rememberSelection();
//Clicking again on a member of a group that is selected whole picks
//that member out, to edit it on its own (discussion #1070): noted
//here, decided on release, since a drag must still move the group.
//Ctrl keeps its usual meaning.
m_member_to_pick.clear();
if (event->button() == Qt::LeftButton
&& !event->modifiers().testFlag(Qt::ControlModifier)) {
QTransform view_transform;
if (event->widget()) {
if (auto view = qobject_cast<QGraphicsView *>(event->widget()->parentWidget())) {
view_transform = view->transform();
}
}
if (QGraphicsItem *member = ItemGroups::memberToPick(
itemAt(event->scenePos(), view_transform))) {
m_member_to_pick = member->toGraphicsObject();
}
}
QGraphicsScene::mousePressEvent(event);
completeGroupSelection();
}
@@ -477,6 +495,19 @@ void Diagram::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
}
QGraphicsScene::mouseReleaseEvent(event);
//A click that did not drag, on a member of a group selected whole:
//Qt has left only that member selected, and it stays so.
QGraphicsObject *picked = m_member_to_pick.data();
m_member_to_pick.clear();
if (picked
&& (event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength()
< QApplication::startDragDistance()
&& selectedItems() == QList<QGraphicsItem *>{picked}) {
rememberSelection();
return;
}
//A click on an already selected item changes the selection on
//release, not on press (Ctrl toggles it, a plain click keeps only it).
completeGroupSelection();