VirtualBox

Changeset 77005 in vbox


Ignore:
Timestamp:
Jan 26, 2019 6:12:43 PM (6 years ago)
Author:
vboxsync
Message:

FE/Qt: UIMediumSearchWidget remembers the matched items list and manages the moving thru list items itself

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

Legend:

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

    r76996 r77005  
    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

    r76996 r77005  
    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.

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