VirtualBox

Changeset 96972 in vbox


Ignore:
Timestamp:
Oct 3, 2022 5:13:49 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153893
Message:

FE/Qt: bugref:9930: VirtualBox Manager / Chooser pane: Improving mouse ctrl/shift interactions to avoid choosing items of inconsistent types simultaneously.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserHandlerMouse.cpp

    r96407 r96972  
    121121                        /* Calculate positions: */
    122122                        UIChooserItem *pFirstItem = model()->firstSelectedItem();
    123                         int iFirstPosition = model()->navigationItems().indexOf(pFirstItem);
    124                         int iClickedPosition = model()->navigationItems().indexOf(pClickedItem);
     123                        AssertPtrReturn(pFirstItem, false); // is failure possible?
     124                        const int iFirstPosition = model()->navigationItems().indexOf(pFirstItem);
     125                        const int iClickedPosition = model()->navigationItems().indexOf(pClickedItem);
    125126                        /* Populate list of items from 'first' to 'clicked': */
    126127                        QList<UIChooserItem*> items;
     
    131132                            for (int i = iFirstPosition; i >= iClickedPosition; --i)
    132133                                items << model()->navigationItems().at(i);
     134                        /* Wipe out items of inconsistent types: */
     135                        QList<UIChooserItem*> filteredItems;
     136                        foreach (UIChooserItem *pIteratedItem, items)
     137                        {
     138                            /* So, the logic is to add intermediate item if
     139                             * - first and intermediate selected items are global or
     140                             * - first and intermediate selected items are NOT global. */
     141                            if (   (   pFirstItem->type() == UIChooserNodeType_Global
     142                                    && pIteratedItem->type() == UIChooserNodeType_Global)
     143                                || (   pFirstItem->type() != UIChooserNodeType_Global
     144                                    && pIteratedItem->type() != UIChooserNodeType_Global))
     145                                filteredItems << pIteratedItem;
     146                        }
    133147                        /* Make that list selected: */
    134                         model()->setSelectedItems(items);
    135                         /* Make clicked item current one: */
    136                         model()->setCurrentItem(pClickedItem);
     148                        model()->setSelectedItems(filteredItems);
     149                        /* Make item closest to clicked the current one: */
     150                        if (!filteredItems.isEmpty())
     151                            model()->setCurrentItem(filteredItems.last());
    137152                    }
    138153                    /* Was 'control' modifier pressed? */
     
    143158                            model()->removeFromSelectedItems(pClickedItem);
    144159                        else
    145                             model()->addToSelectedItems(pClickedItem);
     160                        {
     161                            /* So, the logic is to add newly clicked item if
     162                             * - previously and newly selected items are global or
     163                             * - previously and newly selected items are NOT global. */
     164                            UIChooserItem *pFirstItem = model()->firstSelectedItem();
     165                            AssertPtrReturn(pFirstItem, false); // is failure possible?
     166                            if (   (   pFirstItem->type() == UIChooserNodeType_Global
     167                                    && pClickedItem->type() == UIChooserNodeType_Global)
     168                                || (   pFirstItem->type() != UIChooserNodeType_Global
     169                                    && pClickedItem->type() != UIChooserNodeType_Global))
     170                                model()->addToSelectedItems(pClickedItem);
     171                        }
    146172                        /* Make clicked item current one: */
    147173                        model()->setCurrentItem(pClickedItem);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette