VirtualBox

Ignore:
Timestamp:
Feb 6, 2014 5:05:32 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
92095
Message:

FE/Qt: 4397: Medium Manager cleanup/rework (part 8): Reworking some of current-item magic, allowing Qt to do some stuff it should.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/medium
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp

    r50343 r50353  
    299299void UIMediumManager::sltHandleMediumDeleted(const QString &strMediumID)
    300300{
    301     /* Get tree/item: */
     301    /* Get tree-widget / medium-item: */
    302302    QList<UIMediumType> types;
    303303    types << UIMediumType_HardDisk << UIMediumType_DVD << UIMediumType_Floppy;
    304     QTreeWidget *pTree = 0;
     304    QTreeWidget *pTreeWidget = 0;
    305305    UIMediumItem *pMediumItem = 0;
    306306    foreach (UIMediumType type, types)
    307307    {
    308         pTree = treeWidget(type);
    309         pMediumItem = searchItem(pTree, CheckIfSuitableByID(strMediumID));
     308        pTreeWidget = treeWidget(type);
     309        pMediumItem = searchItem(pTreeWidget, CheckIfSuitableByID(strMediumID));
    310310        if (pMediumItem)
    311311            break;
    312312    }
     313
     314    /* Skip further actions if medium-item was not found: */
    313315    if (!pMediumItem)
    314316        return;
     
    317319    updateTabIcons(pMediumItem, ItemAction_Removed);
    318320
    319     /* We need to silently delete medium-item without selecting
    320      * the new one because of complex selection mechanism
    321      * which could provoke a segfault choosing the new
    322      * one item during last item deletion routine. So blocking
    323      * the tree-view for the time of item removing. */
    324     pTree->blockSignals(true);
     321    /* Delete medium-item: */
    325322    delete pMediumItem;
    326     pTree->blockSignals(false);
    327 
    328     /* Make sure current medium-item is selected: */
    329     setCurrentItem(pTree, pTree->currentItem());
     323
     324    /* Make sure 'current' or at least 'first available' medium-item is currently selected, if any: */
     325    setCurrentItem(pTreeWidget, pTreeWidget->currentItem() ? pTreeWidget->currentItem() : pTreeWidget->topLevelItem(0));
    330326}
    331327
     
    582578}
    583579
    584 void UIMediumManager::sltHandleCurrentItemChanged(QTreeWidgetItem *pItem,
    585                                                   QTreeWidgetItem *pPrevItem /* = 0 */)
    586 {
    587     /* Get current medium-item: */
     580void UIMediumManager::sltHandleCurrentItemChanged(QTreeWidgetItem *pItem)
     581{
     582    /* If item set => make sure it's of valid type: */
    588583    UIMediumItem *pMediumItem = toMediumItem(pItem);
    589 
    590     /* We have to make sure some medium-item is always selected: */
    591     if (!pMediumItem && pPrevItem)
    592     {
    593         /* If new medium-item is 0, choose the old one again. */
    594         UIMediumItem *pPrevMediumItem = toMediumItem(pPrevItem);
    595         setCurrentItem(currentTreeWidget(), pPrevMediumItem);
    596     }
    597 
    598     /* If item is set: */
     584    AssertReturnVoid(!pItem || pMediumItem);
     585
     586    /* If medium-item set: */
    599587    if (pMediumItem)
    600588    {
     
    621609void UIMediumManager::sltHandleContextMenuCall(const QPoint &position)
    622610{
    623     /* Get corresponding widget/item: */
    624     QTreeWidget *pTree = currentTreeWidget();
    625     QTreeWidgetItem *pItem = pTree->itemAt(position);
    626     if (pItem)
    627     {
    628         /* Make sure the item is selected and current: */
    629         setCurrentItem(pTree, pItem);
    630         /* Show item context menu: */
    631         m_pContextMenu->exec(pTree->viewport()->mapToGlobal(position));
    632     }
     611    /* Get corresponding tree-widget / item: */
     612    QTreeWidget *pTreeWidget = currentTreeWidget();
     613    QTreeWidgetItem *pItem = pTreeWidget->itemAt(position);
     614
     615    /* Skip further actions if item was not found: */
     616    if (!pItem)
     617        return;
     618
     619    /* Make sure that item is current one: */
     620    setCurrentItem(pTreeWidget, pItem);
     621    /* Show item context menu: */
     622    m_pContextMenu->exec(pTreeWidget->viewport()->mapToGlobal(position));
    633623}
    634624
     
    916906        mTwHD->setSortingEnabled(true);
    917907        connect(mTwHD, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
    918                 this, SLOT(sltHandleCurrentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
     908                this, SLOT(sltHandleCurrentItemChanged(QTreeWidgetItem*)));
    919909        connect(mTwHD, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)),
    920910                this, SLOT(sltHandleDoubleClick()));
     
    940930        mTwCD->setSortingEnabled(true);
    941931        connect(mTwCD, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
    942                 this, SLOT(sltHandleCurrentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
     932                this, SLOT(sltHandleCurrentItemChanged(QTreeWidgetItem*)));
    943933        connect(mTwCD, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)),
    944934                this, SLOT(sltHandleDoubleClick()));
     
    964954        mTwFD->setSortingEnabled(true);
    965955        connect(mTwFD, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
    966                 this, SLOT(sltHandleCurrentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
     956                this, SLOT(sltHandleCurrentItemChanged(QTreeWidgetItem*)));
    967957        connect(mTwFD, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)),
    968958                this, SLOT(sltHandleDoubleClick()));
     
    10291019
    10301020    /* Clear tree-widgets: */
    1031     mTwHD->clear();
    1032     mTwCD->clear();
    1033     mTwFD->clear();
     1021    QTreeWidget *pTreeWidgetHD = treeWidget(UIMediumType_HardDisk);
     1022    QTreeWidget *pTreeWidgetCD = treeWidget(UIMediumType_DVD);
     1023    QTreeWidget *pTreeWidgetFD = treeWidget(UIMediumType_Floppy);
     1024    setCurrentItem(pTreeWidgetHD, 0);
     1025    setCurrentItem(pTreeWidgetCD, 0);
     1026    setCurrentItem(pTreeWidgetFD, 0);
     1027    pTreeWidgetHD->clear();
     1028    pTreeWidgetCD->clear();
     1029    pTreeWidgetFD->clear();
    10341030
    10351031    /* Create medium-items: */
     
    10371033        sltHandleMediumCreated(strMediumID);
    10381034
    1039     /* Select first medium-item as current one if nothing selected: */
     1035    /* Select first item as current one if nothing selected: */
    10401036    if (!mediumItem(UIMediumType_HardDisk))
    1041         if (QTreeWidgetItem *pItem = mTwHD->topLevelItem(0))
    1042             setCurrentItem(mTwHD, pItem);
     1037        if (QTreeWidgetItem *pItem = pTreeWidgetHD->topLevelItem(0))
     1038            setCurrentItem(pTreeWidgetHD, pItem);
    10431039    if (!mediumItem(UIMediumType_DVD))
    1044         if (QTreeWidgetItem *pItem = mTwCD->topLevelItem(0))
    1045             setCurrentItem(mTwCD, pItem);
     1040        if (QTreeWidgetItem *pItem = pTreeWidgetCD->topLevelItem(0))
     1041            setCurrentItem(pTreeWidgetCD, pItem);
    10461042    if (!mediumItem(UIMediumType_Floppy))
    1047         if (QTreeWidgetItem *pItem = mTwFD->topLevelItem(0))
    1048             setCurrentItem(mTwFD, pItem);
     1043        if (QTreeWidgetItem *pItem = pTreeWidgetFD->topLevelItem(0))
     1044            setCurrentItem(pTreeWidgetFD, pItem);
    10491045}
    10501046
     
    14141410        setCurrentItem(treeWidget(medium.type()), pMediumItem);
    14151411
     1412    /* If no 'current-item' yet selected
     1413     * we have to choose newly added as the 'current-item': */
     1414    if (!treeWidget(medium.type())->currentItem())
     1415        setCurrentItem(treeWidget(medium.type()), pMediumItem);
     1416
    14161417    /* Update linked stuff if that was 'current-item' added: */
    14171418    if (pMediumItem == currentTreeWidget()->currentItem())
     
    16301631}
    16311632
    1632 void UIMediumManager::setCurrentItem(QTreeWidget *pTree, QTreeWidgetItem *pItem)
    1633 {
    1634     if (pTree && pItem)
    1635     {
     1633void UIMediumManager::setCurrentItem(QTreeWidget *pTreeWidget, QTreeWidgetItem *pItem)
     1634{
     1635    /* Make sure passed tree-widget is valid: */
     1636    AssertPtrReturnVoid(pTreeWidget);
     1637
     1638    /* Make passed item 'current' for passed tree-widget: */
     1639    pTreeWidget->setCurrentItem(pItem);
     1640
     1641    /* If non NULL item was passed: */
     1642    if (pItem)
     1643    {
     1644        /* Make sure it's also selected, and visible: */
    16361645        pItem->setSelected(true);
    1637         pTree->setCurrentItem(pItem);
    1638         pTree->scrollToItem(pItem, QAbstractItemView::EnsureVisible);
    1639         sltHandleCurrentItemChanged(pItem);
    1640     }
    1641     else
    1642         sltHandleCurrentTabChanged();
     1646        pTreeWidget->scrollToItem(pItem, QAbstractItemView::EnsureVisible);
     1647    }
     1648
     1649    /* Update linked stuff: */
     1650    sltHandleCurrentItemChanged(pItem);
    16431651}
    16441652
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h

    r50340 r50353  
    8989    /* Handlers: Navigation stuff: */
    9090    void sltHandleCurrentTabChanged();
    91     void sltHandleCurrentItemChanged(QTreeWidgetItem *pItem, QTreeWidgetItem *pPrevItem = 0);
     91    void sltHandleCurrentItemChanged(QTreeWidgetItem *pItem);
    9292    void sltHandleDoubleClick();
    9393    void sltHandleContextMenuCall(const QPoint &position);
     
    167167    UIMediumItem* currentMediumItem() const;
    168168
    169     /** Defines <i>current-item</i> for passed @a pTree as @a pItem. */
    170     void setCurrentItem(QTreeWidget *pTree, QTreeWidgetItem *pItem);
     169    /** Defines <i>current-item</i> for passed @a pTreeWidget as @a pItem. */
     170    void setCurrentItem(QTreeWidget *pTreeWidget, QTreeWidgetItem *pItem);
    171171
    172172    UIMediumItem* searchItem(QTreeWidget *pTree, const CheckIfSuitableBy &functor) const;
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