diff options
author | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2022-10-03 17:13:49 +0000 |
---|---|---|
committer | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2022-10-03 17:13:49 +0000 |
commit | 745577934ac7e3f2e343b5a34f5fec3a3b80a70e (patch) | |
tree | adff9d1aec8cf0c4cdb8b0a64e5d65cc1f469ea1 /src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserHandlerMouse.cpp | |
parent | eed19323b51279cda08cf0c9c7fd0e32dd918d0c (diff) | |
download | VirtualBox-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.cpp | 38 |
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); } |