summaryrefslogtreecommitdiff
path: root/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserHandlerMouse.cpp
diff options
context:
space:
mode:
authorvboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2022-10-03 17:13:49 +0000
committervboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2022-10-03 17:13:49 +0000
commit745577934ac7e3f2e343b5a34f5fec3a3b80a70e (patch)
treeadff9d1aec8cf0c4cdb8b0a64e5d65cc1f469ea1 /src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserHandlerMouse.cpp
parenteed19323b51279cda08cf0c9c7fd0e32dd918d0c (diff)
downloadVirtualBox-svn-745577934ac7e3f2e343b5a34f5fec3a3b80a70e.tar.gz
FE/Qt: bugref:9930: !VirtualBox Manager / Chooser pane: Improving mouse ctrl/shift interactions to avoid choosing items of inconsistent types simultaneously.
git-svn-id: https://www.virtualbox.org/svn/vbox/trunk@96972 cfe28804-0f27-0410-a406-dd0f0b0b656f
Diffstat (limited to 'src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserHandlerMouse.cpp')
-rw-r--r--src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserHandlerMouse.cpp38
1 files changed, 32 insertions, 6 deletions
diff --git a/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserHandlerMouse.cpp b/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserHandlerMouse.cpp
index 8f1a13e2a2b..76e714c4999 100644
--- a/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserHandlerMouse.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserHandlerMouse.cpp
@@ -120,8 +120,9 @@ bool UIChooserHandlerMouse::handleMousePress(QGraphicsSceneMouseEvent *pEvent) c
{
/* Calculate positions: */
UIChooserItem *pFirstItem = model()->firstSelectedItem();
- int iFirstPosition = model()->navigationItems().indexOf(pFirstItem);
- int iClickedPosition = model()->navigationItems().indexOf(pClickedItem);
+ AssertPtrReturn(pFirstItem, false); // is failure possible?
+ const int iFirstPosition = model()->navigationItems().indexOf(pFirstItem);
+ const int iClickedPosition = model()->navigationItems().indexOf(pClickedItem);
/* Populate list of items from 'first' to 'clicked': */
QList<UIChooserItem*> items;
if (iFirstPosition <= iClickedPosition)
@@ -130,10 +131,24 @@ bool UIChooserHandlerMouse::handleMousePress(QGraphicsSceneMouseEvent *pEvent) c
else
for (int i = iFirstPosition; i >= iClickedPosition; --i)
items << model()->navigationItems().at(i);
+ /* Wipe out items of inconsistent types: */
+ QList<UIChooserItem*> filteredItems;
+ foreach (UIChooserItem *pIteratedItem, items)
+ {
+ /* So, the logic is to add intermediate item if
+ * - first and intermediate selected items are global or
+ * - first and intermediate selected items are NOT global. */
+ if ( ( pFirstItem->type() == UIChooserNodeType_Global
+ && pIteratedItem->type() == UIChooserNodeType_Global)
+ || ( pFirstItem->type() != UIChooserNodeType_Global
+ && pIteratedItem->type() != UIChooserNodeType_Global))
+ filteredItems << pIteratedItem;
+ }
/* Make that list selected: */
- model()->setSelectedItems(items);
- /* Make clicked item current one: */
- model()->setCurrentItem(pClickedItem);
+ model()->setSelectedItems(filteredItems);
+ /* Make item closest to clicked the current one: */
+ if (!filteredItems.isEmpty())
+ model()->setCurrentItem(filteredItems.last());
}
/* Was 'control' modifier pressed? */
else if (pEvent->modifiers() == Qt::ControlModifier)
@@ -142,7 +157,18 @@ bool UIChooserHandlerMouse::handleMousePress(QGraphicsSceneMouseEvent *pEvent) c
if (model()->selectedItems().contains(pClickedItem))
model()->removeFromSelectedItems(pClickedItem);
else
- model()->addToSelectedItems(pClickedItem);
+ {
+ /* So, the logic is to add newly clicked item if
+ * - previously and newly selected items are global or
+ * - previously and newly selected items are NOT global. */
+ UIChooserItem *pFirstItem = model()->firstSelectedItem();
+ AssertPtrReturn(pFirstItem, false); // is failure possible?
+ if ( ( pFirstItem->type() == UIChooserNodeType_Global
+ && pClickedItem->type() == UIChooserNodeType_Global)
+ || ( pFirstItem->type() != UIChooserNodeType_Global
+ && pClickedItem->type() != UIChooserNodeType_Global))
+ model()->addToSelectedItems(pClickedItem);
+ }
/* Make clicked item current one: */
model()->setCurrentItem(pClickedItem);
}