VirtualBox

Changeset 76995 in vbox for trunk


Ignore:
Timestamp:
Jan 25, 2019 9:29:25 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
128416
Message:

FE/Qt: Adding a simple filtering functionality to QITreeWidget

Location:
trunk/src/VBox/Frontends/VirtualBox/src
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/extensions/QITreeWidget.cpp

    r76892 r76995  
    438438}
    439439
     440QList<QTreeWidgetItem*> QITreeWidget::filterItems(const QITreeWidgetItemFilter &filter, QTreeWidgetItem* pParent /* = 0 */)
     441{
     442    QList<QTreeWidgetItem*> filteredItemList;
     443    if (!pParent)
     444        filterItemsInternal(filter, invisibleRootItem(), filteredItemList);
     445    else
     446        filterItemsInternal(filter, pParent, filteredItemList);
     447    return filteredItemList;
     448}
     449
     450void QITreeWidget::filterItemsInternal(const QITreeWidgetItemFilter &filter,
     451                                           QTreeWidgetItem* pParent, QList<QTreeWidgetItem*> &filteredItemList)
     452{
     453    if (!pParent)
     454        return;
     455    if (filter(pParent))
     456        filteredItemList.append(pParent);
     457
     458    for (int i = 0; i < pParent->childCount(); ++i)
     459        filterItemsInternal(filter, pParent->child(i), filteredItemList);
     460}
     461
    440462void QITreeWidget::paintEvent(QPaintEvent *pEvent)
    441463{
  • trunk/src/VBox/Frontends/VirtualBox/src/extensions/QITreeWidget.h

    r76892 r76995  
    3232class QITreeWidget;
    3333
     34/** A functor base to be passed to QITabWidget::filterItems(..). Overload operator()(..) to filter out
     35 *  tree items. */
     36class SHARED_LIBRARY_STUFF QITreeWidgetItemFilter
     37{
     38 public:
     39    virtual bool operator()(QTreeWidgetItem*) const
     40    {
     41        return true;
     42    }
     43};
    3444
    3545/** QTreeWidgetItem subclass extending standard functionality. */
     
    99109    QITreeWidgetItem *childItem(int iIndex) const;
    100110    QModelIndex itemIndex(QTreeWidgetItem *pItem);
     111    /** Recurses thru the subtree with a root pParent and returns a list of tree items filtered by @a filter.
     112     *  When @a pParent is null than QTreeWidget::invisibleRootItem() is used as the root item. */
     113    QList<QTreeWidgetItem*> filterItems(const QITreeWidgetItemFilter &filter, QTreeWidgetItem* pParent = 0);
    101114
    102115protected:
     
    106119    /** Handles resize @a pEvent. */
    107120    void resizeEvent(QResizeEvent *pEvent);
     121
     122 private:
     123
     124    /* Recurses thru the tree and append filtered items to @a filteredItemList. */
     125    void filterItemsInternal(const QITreeWidgetItemFilter &filter, QTreeWidgetItem* pParent,
     126                             QList<QTreeWidgetItem*> &filteredItemList);
    108127};
    109128
  • trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp

    r76977 r76995  
    100100/* Virtual Media Manager: */
    101101const char *UIExtraDataDefs::GUI_VirtualMediaManager_Details_Expanded = "GUI/VirtualMediaManager/Details/Expanded";
     102const char *UIExtraDataDefs::GUI_VirtualMediaManager_Search_Widget_Expanded = "GUI/VirtualMediaManager/SearchWidget/Expanded";
    102103
    103104/* Host Network Manager: */
  • trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h

    r76977 r76995  
    191191        /** Holds whether Virtual Media Manager details expanded. */
    192192        SHARED_LIBRARY_STUFF extern const char *GUI_VirtualMediaManager_Details_Expanded;
     193        /** Holds whether Virtual Media Manager search widget expanded. */
     194        SHARED_LIBRARY_STUFF extern const char *GUI_VirtualMediaManager_Search_Widget_Expanded;
    193195    /** @} */
    194196
  • trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp

    r76977 r76995  
    29752975}
    29762976
     2977bool UIExtraDataManager::virtualMediaManagerSearchWidgetExpanded()
     2978{
     2979    /* 'False' unless feature allowed: */
     2980    return isFeatureAllowed(GUI_VirtualMediaManager_Search_Widget_Expanded);
     2981}
     2982
     2983void UIExtraDataManager::setVirtualMediaManagerSearchWidgetExpanded(bool fExpanded)
     2984{
     2985    /* 'True' if feature allowed, null-string otherwise: */
     2986    return setExtraDataString(GUI_VirtualMediaManager_Search_Widget_Expanded, toFeatureAllowed(fExpanded));
     2987}
     2988
    29772989bool UIExtraDataManager::hostNetworkManagerDetailsExpanded()
    29782990{
  • trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h

    r76977 r76995  
    370370        /** Defines whether Virtual Media Manager details @a fExpanded. */
    371371        void setVirtualMediaManagerDetailsExpanded(bool fExpanded);
     372        /** Returns whether Virtual Media Manager search widget expanded. */
     373        bool virtualMediaManagerSearchWidgetExpanded();
     374        /** Defines whether Virtual Media Manager search widget @a fExpanded. */
     375        void setVirtualMediaManagerSearchWidgetExpanded(bool fExpanded);
    372376    /** @} */
    373377
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolManager.cpp

    r76842 r76995  
    20422042        setStatusTip(QApplication::translate("UIActionPool", "Open pane with selected disk image file properties"));
    20432043        setToolTip(QApplication::translate("UIActionPool", "Open Disk Image File Properties (%1)").arg(shortcut().toString()));
     2044    }
     2045};
     2046
     2047/** Toggle action extension, used as 'Toggle Search Pane' action class. */
     2048class UIActionMenuSelectorMediumToggleSearch : public UIActionToggle
     2049{
     2050    Q_OBJECT;
     2051
     2052public:
     2053
     2054    /** Constructs action passing @a pParent to the base-class. */
     2055    UIActionMenuSelectorMediumToggleSearch(UIActionPool *pParent)
     2056        : UIActionToggle(pParent)
     2057    {
     2058        setShortcutContext(Qt::WidgetWithChildrenShortcut);
     2059        setIcon(0, UIIconPool::iconSetFull(":/hd_modify_32px.png",          ":/hd_modify_16px.png",
     2060                                           ":/hd_modify_disabled_32px.png", ":/hd_modify_disabled_16px.png"));
     2061        setIcon(1, UIIconPool::iconSetFull(":/cd_modify_32px.png",          ":/cd_modify_16px.png",
     2062                                           ":/cd_modify_disabled_32px.png", ":/cd_modify_disabled_16px.png"));
     2063        setIcon(2, UIIconPool::iconSetFull(":/fd_modify_32px.png",          ":/fd_modify_16px.png",
     2064                                           ":/fd_modify_disabled_32px.png", ":/fd_modify_disabled_16px.png"));
     2065    }
     2066
     2067protected:
     2068
     2069    /** Returns shortcut extra-data ID. */
     2070    virtual QString shortcutExtraDataID() const /* override */
     2071    {
     2072        return QString("ToggleMediumSearch");
     2073    }
     2074
     2075    /** Returns default shortcut. */
     2076    virtual QKeySequence defaultShortcut(UIActionPoolType) const /* override */
     2077    {
     2078        return QKeySequence("");
     2079    }
     2080
     2081    /** Handles translation event. */
     2082    virtual void retranslateUi() /* override */
     2083    {
     2084        setName(QApplication::translate("UIActionPool", "&Search"));
     2085        setShortcutScope(QApplication::translate("UIActionPool", "Media Manager"));
     2086        setStatusTip(QApplication::translate("UIActionPool", "Open the medium search pane"));
     2087        setToolTip(QApplication::translate("UIActionPool", "Open Medium Search Pane (%1)").arg(shortcut().toString()));
    20442088    }
    20452089};
     
    26192663    m_pool[UIActionIndexST_M_Medium_S_Release] = new UIActionMenuSelectorMediumPerformRelease(this);
    26202664    m_pool[UIActionIndexST_M_Medium_T_Details] = new UIActionMenuSelectorMediumToggleProperties(this);
     2665    m_pool[UIActionIndexST_M_Medium_T_Search] = new UIActionMenuSelectorMediumToggleSearch(this);
    26212666    m_pool[UIActionIndexST_M_Medium_S_Refresh] = new UIActionMenuSelectorMediumPerformRefresh(this);
    26222667
     
    30873132    /* 'Properties' action: */
    30883133    fSeparator = addAction(pMenu, action(UIActionIndexST_M_Medium_T_Details)) || fSeparator;
     3134    /* 'Search' action: */
     3135    fSeparator = addAction(pMenu, action(UIActionIndexST_M_Medium_T_Search)) || fSeparator;
    30893136
    30903137    /* Separator? */
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolManager.h

    r76776 r76995  
    138138    UIActionIndexST_M_Medium_S_Release,
    139139    UIActionIndexST_M_Medium_T_Details,
     140    UIActionIndexST_M_Medium_T_Search,
    140141    UIActionIndexST_M_Medium_S_Refresh,
    141142
     
    247248
    248249#endif /* !FEQT_INCLUDED_SRC_globals_UIActionPoolManager_h */
    249 
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumItem.h

    r76581 r76995  
    7272    KMediumState state() const { return m_guiMedium.state(); }
    7373
    74     /** Returns QString <i>ID</i> of the wrapped UIMedium. */
     74    /** Returns QUuid <i>ID</i> of the wrapped UIMedium. */
    7575    QUuid id() const { return m_guiMedium.id(); }
     76    /** Returns QString <i>name</i> of the wrapped UIMedium. */
     77    QString name() const { return m_guiMedium.name(); }
     78
    7679    /** Returns QString <i>location</i> of the wrapped UIMedium. */
    7780    QString location() const { return m_guiMedium.location(); }
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp

    r76606 r76995  
    3737#include "UIMediumItem.h"
    3838#include "UIMediumManager.h"
     39#include "UIMediumSearchWidget.h"
    3940#include "UIWizardCloneVD.h"
    4041#include "UIMessageCenter.h"
     
    161162    , m_pToolBar(0)
    162163    , m_pProgressBar(0)
     164    , m_pSearchWidget(0)
    163165{
    164166    /* Prepare: */
     
    562564}
    563565
     566void UIMediumManagerWidget::sltToggleMediumSearchVisibility(bool fVisible)
     567{
     568    /* Save the setting: */
     569    //gEDataManager->setVirtualMediaManagerSea(fVisible);
     570    /* Toggle medium details visibility: */
     571    if (m_pSearchWidget)
     572        m_pSearchWidget->setVisible(fVisible);
     573}
     574
    564575void UIMediumManagerWidget::sltRefreshAll()
    565576{
     
    620631        menu.addAction(m_pActionPool->action(UIActionIndexST_M_Medium_S_Release));
    621632        menu.addAction(m_pActionPool->action(UIActionIndexST_M_Medium_T_Details));
     633        menu.addAction(m_pActionPool->action(UIActionIndexST_M_Medium_T_Search));
    622634    }
    623635    else
    624636    {
    625637        menu.addAction(m_pActionPool->action(UIActionIndexST_M_Medium_S_Add));
     638        menu.addAction(m_pActionPool->action(UIActionIndexST_M_Medium_T_Search));
    626639        menu.addAction(m_pActionPool->action(UIActionIndexST_M_Medium_S_Refresh));
    627640    }
     
    653666            pTreeWidget->header()->resizeSection(0, iSize0);
    654667    }
     668}
     669
     670void UIMediumManagerWidget::sltHandlePerformSearch()
     671{
     672    if (!m_pSearchWidget || !m_pTabWidget)
     673        return;
     674
     675    QITreeWidget *pTreeWidget = treeWidget(static_cast<UIMediumDeviceType>(m_pTabWidget->currentIndex()));
     676    if (!pTreeWidget)
     677        return;
     678    m_pSearchWidget->search(pTreeWidget);
     679
     680    // printf("size %d\n", matchedList.size());
     681    // m_pSearchWidget->searchItems(pTreeWidget->invisibleRootItem(), matchedList);
     682
     683
     684
     685    //     SearchType searchType() const;
     686    // QString searchTerm() const;
     687
     688
     689    // foreach (const QUuid &id, vboxGlobal().mediumIDs())
     690    // {
     691    //     UIMedium medium = vboxGlobal().medium(id);
     692    //     /** Only search among the types of the tab widget's current page: */
     693    //     if (static_cast<UIMediumDeviceType>(m_pTabWidget->currentIndex()) != medium.type())
     694    //         continue;
     695    //     if (m_pSearchWidget->searchType() == UIMediumSearchWidget::SearchByName &&
     696    //         medium.name().contains(m_pSearchWidget->searchTerm(), Qt::CaseInsensitive))
     697    //         matchedMediumList << medium;
     698    //     else if (m_pSearchWidget->searchType() == UIMediumSearchWidget::SearchByUUID &&
     699    //              medium.id().toString().contains(m_pSearchWidget->searchTerm(), Qt::CaseInsensitive))
     700    //         matchedMediumList << medium;
     701    // }
     702    // printf("search %s -- %d\n", qPrintable(m_pSearchWidget->searchTerm()), matchedMediumList.size());
     703
    655704}
    656705
     
    711760    addAction(m_pActionPool->action(UIActionIndexST_M_Medium_S_Release));
    712761    addAction(m_pActionPool->action(UIActionIndexST_M_Medium_T_Details));
     762    addAction(m_pActionPool->action(UIActionIndexST_M_Medium_T_Search));
    713763    addAction(m_pActionPool->action(UIActionIndexST_M_Medium_S_Refresh));
    714764
     
    726776    connect(m_pActionPool->action(UIActionIndexST_M_Medium_T_Details), &QAction::toggled,
    727777            this, &UIMediumManagerWidget::sltToggleMediumDetailsVisibility);
     778    connect(m_pActionPool->action(UIActionIndexST_M_Medium_T_Search), &QAction::toggled,
     779            this, &UIMediumManagerWidget::sltToggleMediumSearchVisibility);
    728780    connect(m_pActionPool->action(UIActionIndexST_M_Medium_S_Refresh), &QAction::triggered,
    729781            this, &UIMediumManagerWidget::sltRefreshAll);
     
    754806        /* Prepare details-widget: */
    755807        prepareDetailsWidget();
     808        /* Prepare search-widget: */
     809        prepareSearchWidget();
    756810    }
    757811}
     
    776830        m_pToolBar->addAction(m_pActionPool->action(UIActionIndexST_M_Medium_S_Release));
    777831        m_pToolBar->addAction(m_pActionPool->action(UIActionIndexST_M_Medium_T_Details));
     832        m_pToolBar->addAction(m_pActionPool->action(UIActionIndexST_M_Medium_T_Search));
    778833        m_pToolBar->addSeparator();
    779834        m_pToolBar->addAction(m_pActionPool->action(UIActionIndexST_M_Medium_S_Refresh));
     
    901956}
    902957
     958void UIMediumManagerWidget::prepareSearchWidget()
     959{
     960    m_pSearchWidget = new UIMediumSearchWidget(this);
     961    AssertPtrReturnVoid(m_pSearchWidget);
     962    {
     963        m_pSearchWidget->setVisible(false);
     964        m_pSearchWidget->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
     965        connect(m_pSearchWidget, &UIMediumSearchWidget::sigPerformSearch,
     966                this, &UIMediumManagerWidget::sltHandlePerformSearch);
     967
     968        /* Add into layout: */
     969        layout()->addWidget(m_pSearchWidget);
     970    }
     971
     972}
     973
    903974void UIMediumManagerWidget::loadSettings()
    904975{
     
    906977    m_pActionPool->action(UIActionIndexST_M_Medium_T_Details)->setChecked(gEDataManager->virtualMediaManagerDetailsExpanded());
    907978    sltToggleMediumDetailsVisibility(m_pActionPool->action(UIActionIndexST_M_Medium_T_Details)->isChecked());
     979
     980    /* Search action/widget: */
     981    m_pActionPool->action(UIActionIndexST_M_Medium_T_Search)->setChecked(gEDataManager->virtualMediaManagerDetailsExpanded());
     982    sltToggleMediumSearchVisibility(m_pActionPool->action(UIActionIndexST_M_Medium_T_Search)->isChecked());
    908983}
    909984
     
    16441719    return qobject_cast<UIMediumManagerWidget*>(QIManagerDialog::widget());
    16451720}
     1721
     1722void UIMediumManagerWidget::markUnmarkSearchMatchedItems(bool fMark)
     1723{
     1724    /* Unmark the whole tree: */
     1725    if (!fMark)
     1726    {
     1727        QITreeWidget *pTreeWidget = treeWidget(static_cast<UIMediumDeviceType>(m_pTabWidget->currentIndex()));
     1728        if (!pTreeWidget)
     1729            return;
     1730        QList<UIMediumItem*> itemList;
     1731
     1732        getItems(pTreeWidget->invisibleRootItem(), itemList);
     1733    }
     1734    //QList<UIMedium> m_matchedMediumList;
     1735    // for (int i = 0; i < m_mediumItemList.size(); ++i)
     1736    // {
     1737    //     for (int j = 0; j < m_pTreeWidget->columnCount(); ++j)
     1738    //     {
     1739    //         if (m_mediumItemList[i])
     1740    //             m_mediumItemList[i]->setData(j, Qt::ForegroundRole, m_defaultItemForeground);
     1741    //     }
     1742    // }
     1743
     1744}
     1745
     1746void UIMediumManagerWidget::getItems(QTreeWidgetItem *pParentItem, QList<UIMediumItem*> outList)
     1747{
     1748    if (!pParentItem)
     1749        return;
     1750    if (pParentItem->type() == QITreeWidgetItem::ItemType)
     1751    {
     1752        UIMediumItem* pItem = static_cast<UIMediumItem*>(pParentItem);
     1753        if (pItem)
     1754            outList.append(pItem);
     1755    }
     1756
     1757    for (int iChildIndex = 0; iChildIndex < pParentItem->childCount(); ++iChildIndex)
     1758        getItems(pParentItem->child(iChildIndex), outList);
     1759}
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h

    r76581 r76995  
    4040class UIMediumDetailsWidget;
    4141class UIMediumItem;
     42class UIMediumSearchWidget;
    4243class UIToolBar;
    4344
     
    177178        /** Handles command to make medium details @a fVisible. */
    178179        void sltToggleMediumDetailsVisibility(bool fVisible);
     180        /** Handles command to make medium search pane @a fVisible. */
     181        void sltToggleMediumSearchVisibility(bool fVisible);
    179182        /** Handles command to refresh medium. */
    180183        void sltRefreshAll();
     
    195198        /** Adjusts tree-widgets according content. */
    196199        void sltPerformTablesAdjustment();
     200    /** @} */
     201
     202   /** @name Medium search stuff.
     203      * @{ */
     204        /** Adjusts tree-widgets according content. */
     205        void sltHandlePerformSearch();
    197206    /** @} */
    198207
     
    219228        /** Prepares details-widget. */
    220229        void prepareDetailsWidget();
     230        /** Prepares search-widget. */
     231        void prepareSearchWidget();
    221232        /** Load settings: */
    222233        void loadSettings();
     
    285296                                        const CheckIfSuitableBy &condition,
    286297                                        CheckIfSuitableBy *pException = 0);
     298
    287299
    288300        /** Checks if @a action can be used for @a pItem. */
     
    351363        UIEnumerationProgressBar *m_pProgressBar;
    352364    /** @} */
     365
     366    /** @name Search-widget variables.
     367      * @{ */
     368        /** Holds the medium details-widget instance. */
     369        UIMediumSearchWidget *m_pSearchWidget;
     370    /** @} */
     371
    353372};
    354373
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSearchWidget.cpp

    r76979 r76995  
    2525#include "QIDialogButtonBox.h"
    2626#include "QIToolButton.h"
     27#include "QITreeWidget.h"
    2728#include "UIFDCreationDialog.h"
    2829#include "UIIconPool.h"
     30#include "UIMediumItem.h"
    2931#include "UIMediumSearchWidget.h"
    3032#include "UIToolBar.h"
     
    3335# include "UIWindowMenuManager.h"
    3436#endif /* VBOX_WS_MAC */
     37
     38
     39class FilterByNameUUID : public QITreeWidgetItemFilter
     40{
     41
     42public:
     43
     44    FilterByNameUUID(UIMediumSearchWidget::SearchType enmSearchType, const QString &strSearchTerm)
     45        : m_enmSearchType(enmSearchType)
     46        , m_strSearchTerm(strSearchTerm){}
     47
     48    virtual bool operator()(QTreeWidgetItem *pItem) const
     49    {
     50        if (!pItem || m_strSearchTerm.isEmpty())
     51            return false;
     52        if (pItem->type() != QITreeWidgetItem::ItemType)
     53            return false;
     54
     55        UIMediumItem *pMediumItem = static_cast<UIMediumItem*>(pItem);
     56        if (!pMediumItem)
     57            return false;
     58        if (m_enmSearchType == UIMediumSearchWidget::SearchByUUID && !pMediumItem->id().toString().contains(m_strSearchTerm))
     59            return false;
     60        if (m_enmSearchType == UIMediumSearchWidget::SearchByName && !pMediumItem->name().contains(m_strSearchTerm))
     61            return false;
     62        return true;
     63    }
     64
     65private:
     66
     67    UIMediumSearchWidget::SearchType m_enmSearchType;
     68    QString m_strSearchTerm;
     69};
    3570
    3671UIMediumSearchWidget::UIMediumSearchWidget(QWidget *pParent)
     
    4075    , m_pShowNextMatchButton(0)
    4176    , m_pShowPreviousMatchButton(0)
     77    , m_pTreeWidget(0)
     78    , m_iScrollToIndex(0)
    4279{
    4380    prepareWidgets();
     
    78115        m_pShowPreviousMatchButton->setIcon(UIIconPool::iconSet(":/log_viewer_search_backward_16px.png", ":/log_viewer_search_backward_disabled_16px.png"));
    79116        connect(m_pShowPreviousMatchButton, &QIToolButton::clicked, this, &UIMediumSearchWidget::sigShowPreviousMatchingItem);
     117        connect(m_pShowPreviousMatchButton, &QIToolButton::clicked, this, &UIMediumSearchWidget::sltShowPreviousMatchingItem);
     118
    80119        pLayout->addWidget(m_pShowPreviousMatchButton);
    81120    }
     
    85124        m_pShowNextMatchButton->setIcon(UIIconPool::iconSet(":/log_viewer_search_forward_16px.png", ":/log_viewer_search_forward_disabled_16px.png"));
    86125        connect(m_pShowNextMatchButton, &QIToolButton::clicked, this, &UIMediumSearchWidget:: sigShowNextMatchingItem);
     126        connect(m_pShowNextMatchButton, &QIToolButton::clicked, this, &UIMediumSearchWidget:: sltShowNextMatchingItem);
     127
    87128        pLayout->addWidget(m_pShowNextMatchButton);
    88129    }
     
    103144        return QString();
    104145    return m_pSearchTermLineEdit->text();
     146}
     147
     148void UIMediumSearchWidget::search(QITreeWidget* pTreeWidget)
     149{
     150    if (!pTreeWidget)
     151        return;
     152
     153    m_pTreeWidget = pTreeWidget;
     154    QList<QTreeWidgetItem*> allItems = pTreeWidget->filterItems(QITreeWidgetItemFilter());
     155    markUnmarkItems(allItems, false);
     156
     157    m_matchedItemList = pTreeWidget->filterItems(FilterByNameUUID(searchType(), searchTerm()));
     158    markUnmarkItems(m_matchedItemList, true);
     159    if (!m_matchedItemList.isEmpty())
     160    {
     161        m_iScrollToIndex = 0;
     162        pTreeWidget->scrollTo(pTreeWidget->itemIndex(m_matchedItemList[m_iScrollToIndex]), QAbstractItemView::PositionAtCenter);
     163    }
    105164}
    106165
     
    120179        m_pShowNextMatchButton->setToolTip("Show the next item matching the search term");
    121180}
     181
     182void UIMediumSearchWidget::showEvent(QShowEvent *pEvent)
     183{
     184    if (m_pSearchTermLineEdit)
     185        m_pSearchTermLineEdit->setFocus();
     186    QIWithRetranslateUI<QWidget>::showEvent(pEvent);
     187}
     188
     189void UIMediumSearchWidget::markUnmarkItems(QList<QTreeWidgetItem*> &itemList, bool fMark)
     190{
     191    foreach (QTreeWidgetItem* pItem, itemList)
     192    {
     193        if (pItem->type() != QITreeWidgetItem::ItemType)
     194            continue;
     195        UIMediumItem *pMediumItem = static_cast<UIMediumItem*>(pItem);
     196        if (!pMediumItem)
     197            continue;
     198        QFont font = pMediumItem->font(0);
     199        font.setBold(fMark);
     200        pMediumItem->setFont(0, font);
     201    }
     202}
     203
     204void UIMediumSearchWidget::sltShowNextMatchingItem()
     205{
     206    if (!m_pTreeWidget)
     207        return;
     208    if (++m_iScrollToIndex >= m_matchedItemList.size())
     209        m_iScrollToIndex = 0;
     210    if (!m_matchedItemList[m_iScrollToIndex])
     211        return;
     212    m_pTreeWidget->scrollTo(m_pTreeWidget->itemIndex(m_matchedItemList[m_iScrollToIndex]), QAbstractItemView::PositionAtCenter);
     213}
     214
     215void UIMediumSearchWidget::sltShowPreviousMatchingItem()
     216{
     217    if (!m_pTreeWidget)
     218        return;
     219    if (--m_iScrollToIndex <= 0)
     220        m_iScrollToIndex = m_matchedItemList.size() - 1;
     221    if (!m_matchedItemList[m_iScrollToIndex])
     222        return;
     223    m_pTreeWidget->scrollTo(m_pTreeWidget->itemIndex(m_matchedItemList[m_iScrollToIndex]), QAbstractItemView::PositionAtCenter);
     224
     225}
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSearchWidget.h

    r76979 r76995  
    2727/* Forward declarations: */
    2828class QAction;
     29class QTreeWidgetItem;
    2930class QLineEdit;
    3031class QIComboBox;
    3132class QIDialogButtonBox;
    3233class QIToolButton;
     34class QITreeWidget;
     35class UIMediumItem;
     36
    3337
    3438/** QWidget extension providing a simple way to enter a earch term and search type for medium searching
     
    5862    SearchType searchType() const;
    5963    QString searchTerm() const;
     64    void    search(QITreeWidget* pTreeWidget);
    6065
    61 protected:
     66 protected:
    6267
    6368    void retranslateUi() /* override */;
     69    virtual void showEvent(QShowEvent *pEvent) /* override */;
     70
     71 private slots:
     72
     73    void sltShowNextMatchingItem();
     74    void sltShowPreviousMatchingItem();
    6475
    6576private:
    6677
    67     void              prepareWidgets();
     78    void    prepareWidgets();
     79    void    markUnmarkItems(QList<QTreeWidgetItem*> &itemList, bool fMark);
     80
    6881    QIComboBox       *m_pSearchComboxBox;
    6982    QLineEdit        *m_pSearchTermLineEdit;
    7083    QIToolButton     *m_pShowNextMatchButton;
    7184    QIToolButton     *m_pShowPreviousMatchButton;
     85
     86    QList<QTreeWidgetItem*> m_matchedItemList;
     87    QITreeWidget           *m_pTreeWidget;
     88    int                     m_iScrollToIndex;
    7289};
    7390
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