VirtualBox

Changeset 72444 in vbox for trunk


Ignore:
Timestamp:
Jun 5, 2018 8:19:32 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
122919
Message:

FE/Qt bugref:9183 Adding a search functionality to UIMediumSelector

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk

    r72377 r72444  
    11841184        src/logviewer/UIVMLogViewerTextEdit.cpp \
    11851185        src/medium/UIMediumEnumerator.cpp \
     1186        src/medium/UIMediumSelector.cpp \
    11861187        src/runtime/UIActionPoolRuntime.cpp \
    11871188        src/runtime/UIConsoleEventHandler.cpp \
     
    12641265        src/logviewer/UIVMLogViewerTextEdit.cpp \
    12651266        src/medium/UIMediumEnumerator.cpp \
     1267        src/medium/UIMediumSelector.cpp \
    12661268        src/runtime/UIActionPoolRuntime.cpp \
    12671269        src/selector/UIActionPoolSelector.cpp \
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSelector.cpp

    r72431 r72444  
    2727
    2828/* GUI includes: */
     29# include "QIComboBox.h"
    2930# include "QIDialogButtonBox.h"
     31# include "QILineEdit.h"
    3032# include "QIMessageBox.h"
    3133# include "QITabWidget.h"
     
    5254
    5355#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
     56
     57class UIMediumSearchWidget : public QWidget
     58{
     59    Q_OBJECT;
     60
     61public:
     62
     63    enum SearchType
     64    {
     65        SearchByName,
     66        SearchByUUID,
     67        SearchByMax
     68    };
     69
     70signals:
     71
     72    void sigSearchTypeChanged(int newType);
     73    void sigSearchTermChanged(QString searchTerm);
     74
     75public:
     76
     77    UIMediumSearchWidget(QWidget *pParent = 0);
     78    SearchType searchType() const;
     79    QString searchTerm() const;
     80
     81private:
     82
     83    void prepareWidgets();
     84    QIComboBox *m_pSearchComboxBox;
     85    QILineEdit *m_pSearchTermLineEdit;
     86};
     87
     88UIMediumSearchWidget::UIMediumSearchWidget(QWidget *pParent)
     89    :QWidget(pParent)
     90    , m_pSearchComboxBox(0)
     91    , m_pSearchTermLineEdit(0)
     92{
     93    prepareWidgets();
     94}
     95
     96void UIMediumSearchWidget::prepareWidgets()
     97{
     98    QHBoxLayout *pLayout = new QHBoxLayout;
     99    setLayout(pLayout);
     100    pLayout->setContentsMargins(0, 0, 0, 0);
     101    pLayout->setSpacing(0);
     102
     103    m_pSearchComboxBox = new QIComboBox;
     104    if (m_pSearchComboxBox)
     105    {
     106        m_pSearchComboxBox->setEditable(false);
     107        m_pSearchComboxBox->insertItem(SearchByName, "By Name");
     108        m_pSearchComboxBox->insertItem(SearchByUUID, "By UUID");
     109        pLayout->addWidget(m_pSearchComboxBox);
     110
     111        connect(m_pSearchComboxBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::currentIndexChanged),
     112                this, &UIMediumSearchWidget::sigSearchTypeChanged);
     113
     114    }
     115
     116    m_pSearchTermLineEdit = new QILineEdit;
     117    if (pLayout)
     118    {
     119        pLayout->addWidget(m_pSearchTermLineEdit);
     120        connect(m_pSearchTermLineEdit, &QILineEdit::textChanged,
     121                this, &UIMediumSearchWidget::sigSearchTermChanged);
     122    }
     123}
     124
     125UIMediumSearchWidget::SearchType UIMediumSearchWidget::searchType() const
     126{
     127    if (!m_pSearchComboxBox || m_pSearchComboxBox->currentIndex() >= static_cast<int>(SearchByMax))
     128        return SearchByMax;
     129    return static_cast<SearchType>(m_pSearchComboxBox->currentIndex());
     130}
     131
     132QString UIMediumSearchWidget::searchTerm() const
     133{
     134    if (!m_pSearchTermLineEdit)
     135        return QString();
     136    return m_pSearchTermLineEdit->text();
     137}
    54138
    55139
     
    66150    , m_pNotAttachedSubTreeRoot(0)
    67151    , m_pParent(pParent)
     152    , m_pSearchWidget(0)
    68153{
    69154    configure();
     
    185270        connect(m_pButtonBox, &QIDialogButtonBox::rejected, this, &UIMediumSelector::close);
    186271        connect(m_pButtonBox, &QIDialogButtonBox::accepted, this, &UIMediumSelector::accept);
     272    }
     273
     274    if (m_pSearchWidget)
     275    {
     276        connect(m_pSearchWidget, &UIMediumSearchWidget::sigSearchTypeChanged,
     277                this, &UIMediumSelector::sltHandleSearchTypeChange);
     278        connect(m_pSearchWidget, &UIMediumSearchWidget::sigSearchTermChanged,
     279                this, &UIMediumSelector::sltHandleSearchTermChange);
    187280    }
    188281}
     
    313406    }
    314407
     408    m_pSearchWidget = new UIMediumSearchWidget;
     409    if (m_pSearchWidget)
     410    {
     411        m_pMainLayout->addWidget(m_pSearchWidget);
     412    }
     413
    315414    m_pButtonBox = new QIDialogButtonBox;
    316415    if (m_pButtonBox)
     
    325424
    326425    repopulateTreeWidget();
    327     //m_pMainLayout->addWidget(
    328426}
    329427
     
    333431    vboxGlobal().openMediumWithFileOpenDialog(m_enmMediumType, this, strDefaultMachineFolder);
    334432}
    335 
    336 // void UIMediumSelector::sltHandleCurrentItemChanged()
    337 // {
    338 //     printf("%d\n", m_pTreeWidget->selectedItems().size());
    339 //     updateOkButton();
    340 
    341 // }
    342433
    343434void UIMediumSelector::sltHandleItemSelectionChanged()
     
    368459    /* Initialize media enumation: */
    369460    vboxGlobal().startMediumEnumeration();
     461}
     462
     463void UIMediumSelector::sltHandleSearchTypeChange(int type)
     464{
     465    Q_UNUSED(type);
     466    performMediumSearch();
     467}
     468
     469void UIMediumSelector::sltHandleSearchTermChange(QString searchTerm)
     470{
     471    Q_UNUSED(searchTerm);
     472    performMediumSearch();
    370473}
    371474
     
    440543    /* uuid list of selected items: */
    441544    /* Reset the related data structure: */
     545    m_mediumItemList.clear();
    442546    m_pTreeWidget->clear();
    443547    m_pAttachedSubTreeRoot = 0;
     
    474578                pParent = m_pNotAttachedSubTreeRoot;
    475579            }
    476             menuItemVector.push_back(addTreeItem(medium, pParent));
     580            UIMediumItem *treeItem = addTreeItem(medium, pParent);
     581            m_mediumItemList.append(treeItem);
     582            menuItemVector.push_back(treeItem);
    477583        }
    478584    }
    479585    restoreSelection(selectedMediums, menuItemVector);
    480 
     586    saveDefaultForeground();
    481587    updateOkButton();
    482588    if (m_pAttachedSubTreeRoot)
     
    485591    if (m_pNotAttachedSubTreeRoot)
    486592        m_pTreeWidget->expandItem(m_pNotAttachedSubTreeRoot);
    487 
     593}
     594
     595void UIMediumSelector::saveDefaultForeground()
     596{
     597    if (!m_pTreeWidget)
     598        return;
     599    if (m_defaultItemForeground == QBrush() && m_pTreeWidget->topLevelItemCount() >= 1)
     600    {
     601        QTreeWidgetItem *item = m_pTreeWidget->topLevelItem(0);
     602        if (item)
     603        {
     604            QVariant data = item->data(0, Qt::ForegroundRole);
     605            if (data.canConvert<QBrush>())
     606            {
     607                m_defaultItemForeground = data.value<QBrush>();
     608            }
     609        }
     610    }
    488611}
    489612
     
    514637    return 0;
    515638}
     639
     640void UIMediumSelector::performMediumSearch()
     641{
     642    if (!m_pSearchWidget)
     643        return;
     644    /* Unmark all tree items to remove the highltights: */
     645    for (int i = 0; i < m_mediumItemList.size(); ++i)
     646    {
     647        m_mediumItemList[i]->setData(0, Qt::ForegroundRole, m_defaultItemForeground);
     648    }
     649
     650
     651    UIMediumSearchWidget::SearchType searchType =
     652        m_pSearchWidget->searchType();
     653    if (searchType >= UIMediumSearchWidget::SearchByMax)
     654        return;
     655    QString strTerm = m_pSearchWidget->searchTerm();
     656    if (strTerm.isEmpty())
     657        return;
     658
     659    for (int i = 0; i < m_mediumItemList.size(); ++i)
     660    {
     661        if (!m_mediumItemList[i])
     662            continue;
     663        QString strMedium;
     664        if (searchType == UIMediumSearchWidget::SearchByName)
     665            strMedium = m_mediumItemList[i]->medium().name();
     666        else if(searchType == UIMediumSearchWidget::SearchByUUID)
     667            strMedium = m_mediumItemList[i]->medium().id();
     668        if (strMedium.isEmpty())
     669            continue;
     670        if (strMedium.contains(strTerm, Qt::CaseInsensitive))
     671        {
     672            // mark the item
     673            m_mediumItemList[i]->setData(0, Qt::ForegroundRole, QBrush(QColor(255, 0, 0)));
     674        }
     675    }
     676}
     677
     678#include "UIMediumSelector.moc"
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumSelector.h

    r72431 r72444  
    3434class QIDialogButtonBox;
    3535class UIMediumItem;
     36class UIMediumSearchWidget;
    3637class UIToolBar;
    3738
     
    6263    void sltHandleMediumEnumerationFinish();
    6364    void sltHandleRefresh();
     65    void sltHandleSearchTypeChange(int type);
     66    void sltHandleSearchTermChange(QString searchTerm);
    6467
    6568private:
     
    8386    /** @} */
    8487
    85     void repopulateTreeWidget();
     88    void          repopulateTreeWidget();
    8689    /** Disable/enable 'ok' button on the basis of having a selected item */
    87     void updateOkButton();
     90    void          updateOkButton();
    8891    UIMediumItem* addTreeItem(const UIMedium &medium, QITreeWidgetItem *pParent);
    89     void restoreSelection(const QStringList &selectedMediums, QVector<UIMediumItem*> &mediumList);
     92    void          restoreSelection(const QStringList &selectedMediums, QVector<UIMediumItem*> &mediumList);
    9093    /** Recursively create the hard disk hierarchy under the tree widget */
    9194    UIMediumItem* createHardDiskItem(const UIMedium &medium, QITreeWidgetItem *pParent);
    9295    UIMediumItem* searchItem(const QTreeWidgetItem *pParent, const QString &mediumId);
     96    void          performMediumSearch();
     97    /** Remember the default foreground brush of the tree so that we can reset tree items' foreground later */
     98    void          saveDefaultForeground();
    9399
    94     QVBoxLayout       *m_pMainLayout;
    95     QITreeWidget      *m_pTreeWidget;
    96     UIMediumType       m_enmMediumType;
    97     QIDialogButtonBox *m_pButtonBox;
    98     UIToolBar         *m_pToolBar;
    99     QAction           *m_pActionAdd;
    100     QAction           *m_pActionRefresh;
     100    QVBoxLayout          *m_pMainLayout;
     101    QITreeWidget         *m_pTreeWidget;
     102    UIMediumType          m_enmMediumType;
     103    QIDialogButtonBox    *m_pButtonBox;
     104    UIToolBar            *m_pToolBar;
     105    QAction              *m_pActionAdd;
     106    QAction              *m_pActionRefresh;
    101107    /** All the known media that are already attached to some vm are added under the following top level tree item */
    102     QITreeWidgetItem  *m_pAttachedSubTreeRoot;
     108    QITreeWidgetItem     *m_pAttachedSubTreeRoot;
    103109    /** All the known media that are not attached to any vm are added under the following top level tree item */
    104     QITreeWidgetItem  *m_pNotAttachedSubTreeRoot;
    105     QWidget           *m_pParent;
     110    QITreeWidgetItem     *m_pNotAttachedSubTreeRoot;
     111    QWidget              *m_pParent;
     112    UIMediumSearchWidget *m_pSearchWidget;
     113    QList<UIMediumItem*>  m_mediumItemList;
     114    QBrush                m_defaultItemForeground;
     115
    106116};
    107117
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