VirtualBox

Changeset 83379 in vbox


Ignore:
Timestamp:
Mar 24, 2020 10:49:54 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
136594
Message:

FE/Qt: bugref:9686. Dynamic show/hide of table columns.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/monitor/resource
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/monitor/resource/UIResourceMonitor.cpp

    r83375 r83379  
    5151#include <iprt/cidr.h>
    5252
    53 
     53/* The first element must be 0 and the rest must be consecutive: */
    5454enum VMResouceMonitorColumn
    5555{
     
    5757    VMResouceMonitorColumn_CPUGuestLoad,
    5858    VMResouceMonitorColumn_CPUVMMLoad,
    59     // VMResouceMonitorColumn_RAMUsedAndTotal,
    60     // VMResouceMonitorColumn_RAMUsedPercentage,
    61     VMResouceMonitorColumn_NetworkDownUpRate,
    62     VMResouceMonitorColumn_NetworkDownUpTotal,
    63     VMResouceMonitorColumn_DiskIOWriteReadRate,
    64     VMResouceMonitorColumn_DiskIOWriteReadTotal,
     59    VMResouceMonitorColumn_RAMUsedAndTotal,
     60    VMResouceMonitorColumn_RAMUsedPercentage,
     61    VMResouceMonitorColumn_NetworkUpRate,
     62    VMResouceMonitorColumn_NetworkDownRate,
     63    VMResouceMonitorColumn_NetworkUpTotal,
     64    VMResouceMonitorColumn_NetworkDownTotal,
     65    VMResouceMonitorColumn_DiskIOReadRate,
     66    VMResouceMonitorColumn_DiskIOWriteRate,
     67    VMResouceMonitorColumn_DiskIOReadTotal,
     68    VMResouceMonitorColumn_DiskIOWriteTotal,
     69    VMResouceMonitorColumn_VMExits,
    6570    VMResouceMonitorColumn_Max
    6671};
    6772
     73struct ResourceColumn
     74{
     75    QString m_strName;
     76    bool    m_fEnabled;
     77};
    6878/*********************************************************************************************************************************
    6979*   Class UIVMResouceMonitorItem definition.                                                                           *
     
    90100    quint64 m_uDiskReadTotal;
    91101
     102    quint64 m_uVMExitRate;
     103    quint64 m_uVMExitTotal;
     104
    92105    CMachineDebugger m_comDebugger;
    93106
     
    106119    UIResourceMonitorProxyModel(QObject *parent = 0);
    107120    void dataUpdate();
     121    void setColumnShown(const QVector<bool>& columnShown);
    108122
    109123protected:
    110124
    111125    //virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const /* override */;
     126    virtual bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const /* override */;
    112127
    113128private:
     129
     130    QVector<bool> m_columnShown;
    114131
    115132};
     
    134151    QVariant data(const QModelIndex &index, int role) const /* override */;
    135152    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
     153    void setColumnCaptions(const QVector<QString>& captions);
    136154
    137155private slots:
     
    144162    QVector<UIResourceMonitorItem> m_itemList;
    145163    void initializeItems();
     164    QVector<QString>             m_columnCaptions;
    146165
    147166    QTimer *m_pTimer;
     
    177196    , m_uDiskWriteTotal(0)
    178197    , m_uDiskReadTotal(0)
     198    , m_uVMExitRate(0)
     199    , m_uVMExitTotal(0)
    179200{
    180201    CSession comSession = uiCommon().openSession(uid, KLockType_Shared);
     
    197218    , m_uDiskWriteTotal(0)
    198219    , m_uDiskReadTotal(0)
     220    , m_uVMExitRate(0)
     221    , m_uVMExitTotal(0)
    199222{
    200223}
     
    210233    , m_uDiskWriteTotal(0)
    211234    , m_uDiskReadTotal(0)
     235    , m_uVMExitRate(0)
     236    , m_uVMExitTotal(0)
    212237{
    213238}
     
    235260}
    236261
     262bool UIResourceMonitorProxyModel::filterAcceptsColumn(int iSourceColumn, const QModelIndex &sourceParent) const
     263{
     264    Q_UNUSED(sourceParent);
     265    if (iSourceColumn >= m_columnShown.size())
     266        return true;
     267    return m_columnShown[iSourceColumn];
     268}
     269
     270void UIResourceMonitorProxyModel::setColumnShown(const QVector<bool>& columnShown)
     271{
     272    m_columnShown = columnShown;
     273    invalidateFilter();
     274}
     275
    237276
    238277/*********************************************************************************************************************************
     
    263302{
    264303    Q_UNUSED(parent);
     304    // int iCount = 0;
     305    // for (int i = 0; i < m_columnShown.size(); ++i)
     306    //     if (m_columnShown[i])
     307    //         ++iCount;
     308    // printf("column count %d\n", iCount);
     309    // return iCount;
    265310    return VMResouceMonitorColumn_Max;
    266311}
     
    271316    if (!index.isValid() || role != Qt::DisplayRole || index.row() >= rowCount())
    272317        return QVariant();
     318    // if (index.column() >= m_columnShown.size() || !m_columnShown[index.column()])
     319    //     return QVariant();
    273320    switch (index.column())
    274321    {
     
    282329            return m_itemList[index.row()].m_uCPUVMMLoad;
    283330            break;
    284         case VMResouceMonitorColumn_NetworkDownUpRate:
    285             return QString("%1/%2").arg(uiCommon().formatSize(m_itemList[index.row()].m_uNetworkDownRate, iDecimalCount)).
    286                 arg(uiCommon().formatSize(m_itemList[index.row()].m_uNetworkUpRate, iDecimalCount));
    287             break;
    288         case VMResouceMonitorColumn_NetworkDownUpTotal:
    289             return QString("%1/%2").arg(uiCommon().formatSize(m_itemList[index.row()].m_uNetworkDownTotal, iDecimalCount)).
    290                 arg(uiCommon().formatSize(m_itemList[index.row()].m_uNetworkUpTotal, iDecimalCount));
    291             break;
    292         case VMResouceMonitorColumn_DiskIOWriteReadRate:
    293             return QString("%1/%2").arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskWriteRate, iDecimalCount)).
    294                 arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskReadRate, iDecimalCount));
    295             break;
    296         case VMResouceMonitorColumn_DiskIOWriteReadTotal:
    297             return QString("%1/%2").arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskWriteTotal, iDecimalCount)).
    298                 arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskReadTotal, iDecimalCount));
     331        case VMResouceMonitorColumn_NetworkUpRate:
     332            return QString("%1").arg(uiCommon().formatSize(m_itemList[index.row()].m_uNetworkUpRate, iDecimalCount));
     333            break;
     334        case VMResouceMonitorColumn_NetworkDownRate:
     335            return QString("%1").arg(uiCommon().formatSize(m_itemList[index.row()].m_uNetworkDownRate, iDecimalCount));
     336            break;
     337        case VMResouceMonitorColumn_NetworkUpTotal:
     338            return QString("%1").arg(uiCommon().formatSize(m_itemList[index.row()].m_uNetworkUpTotal, iDecimalCount));
     339            break;
     340        case VMResouceMonitorColumn_NetworkDownTotal:
     341            return QString("%1").arg(uiCommon().formatSize(m_itemList[index.row()].m_uNetworkDownTotal, iDecimalCount));
     342            break;
     343        case VMResouceMonitorColumn_DiskIOReadRate:
     344            return QString("%1").arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskReadRate, iDecimalCount));
     345            break;
     346        case VMResouceMonitorColumn_DiskIOWriteRate:
     347            return QString("%1").arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskWriteRate, iDecimalCount));
     348            break;
     349        case VMResouceMonitorColumn_DiskIOReadTotal:
     350            return QString("%1/%2").arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskReadTotal, iDecimalCount));
     351            break;
     352        case VMResouceMonitorColumn_DiskIOWriteTotal:
     353            return QString("%1/%2").arg(uiCommon().formatSize(m_itemList[index.row()].m_uDiskWriteTotal, iDecimalCount));
     354            break;
     355        case VMResouceMonitorColumn_VMExits:
     356           return QString("%1/%2").arg(UICommon::addMetricSuffixToNumber(m_itemList[index.row()].m_uVMExitRate)).
     357               arg(UICommon::addMetricSuffixToNumber(m_itemList[index.row()].m_uVMExitTotal));
    299358            break;
    300359        default:
     
    306365QVariant UIResourceMonitorModel::headerData(int section, Qt::Orientation orientation, int role) const
    307366{
    308     if (role == Qt::DisplayRole && orientation == Qt::Horizontal)
    309     {
    310         switch (section)
    311         {
    312             case VMResouceMonitorColumn_Name:
    313                 return tr("VM Name");
    314                 break;
    315             case VMResouceMonitorColumn_CPUGuestLoad:
    316                 return tr("CPU Load\n(Guest)");
    317                 break;
    318             case VMResouceMonitorColumn_CPUVMMLoad:
    319                 return tr("CPU Load\n(VMM)");
    320                 break;
    321             // case VMResouceMonitorColumn_RAMUsedAndTotal:
    322             //     return tr("RAM (Used/Total)");
    323             //     break;
    324             // case VMResouceMonitorColumn_RAMUsedPercentage:
    325             //     return tr("RAM % Used");
    326             //     break;
    327             case VMResouceMonitorColumn_NetworkDownUpRate:
    328                 return tr("Network Up/Down\nRate");
    329                 break;
    330             case VMResouceMonitorColumn_NetworkDownUpTotal:
    331                 return tr("Network Up/Down\nTotal");
    332                 break;
    333             case VMResouceMonitorColumn_DiskIOWriteReadRate:
    334                 return tr("Disk Write/Read\nRate");
    335                 break;
    336             case VMResouceMonitorColumn_DiskIOWriteReadTotal:
    337                 return tr("Disk Write/Read\nTotal");
    338                 break;
    339 
    340             default:
    341                 return QString();
    342                 break;
    343         }
    344     }
     367    if (role == Qt::DisplayRole && orientation == Qt::Horizontal && section < m_columnCaptions.size())
     368        return m_columnCaptions[section];
    345369    return QVariant();
     370}
     371
     372void UIResourceMonitorModel::setColumnCaptions(const QVector<QString>& captions)
     373{
     374    m_columnCaptions = captions;
    346375}
    347376
     
    404433            m_itemList[i].m_uDiskWriteRate = m_itemList[i].m_uDiskWriteTotal - uPrevWriteTotal;
    405434            m_itemList[i].m_uDiskReadRate = m_itemList[i].m_uDiskReadTotal - uPrevReadTotal;
     435
     436           /* VM Exits: */
     437            quint64 uPrevVMExitsTotal = m_itemList[i].m_uVMExitTotal;
     438            UIMonitorCommon::getVMMExitCount(m_itemList[i].m_comDebugger, m_itemList[i].m_uVMExitTotal);
     439            m_itemList[i].m_uVMExitRate = m_itemList[i].m_uVMExitTotal - uPrevVMExitsTotal;
    406440        }
    407441    }
     
    434468void UIResourceMonitorWidget::retranslateUi()
    435469{
     470    m_columnCaptions.resize(VMResouceMonitorColumn_Max);
     471    m_columnCaptions[VMResouceMonitorColumn_Name] = tr("VM Name");
     472    m_columnCaptions[VMResouceMonitorColumn_CPUGuestLoad] = tr("CPU Load\n(Guest)");
     473    m_columnCaptions[VMResouceMonitorColumn_CPUVMMLoad] = tr("CPU Load\n(VMM)");
     474    m_columnCaptions[VMResouceMonitorColumn_RAMUsedAndTotal] = tr("RAM\nUsed/Total");
     475    m_columnCaptions[VMResouceMonitorColumn_RAMUsedPercentage] = tr("RAM\n% Used");
     476    m_columnCaptions[VMResouceMonitorColumn_NetworkUpRate] = tr("Network Up\nRate");
     477    m_columnCaptions[VMResouceMonitorColumn_NetworkDownRate] = tr("Network Down\nRate");
     478    m_columnCaptions[VMResouceMonitorColumn_NetworkUpTotal] = tr("Network Up\nTotal");
     479    m_columnCaptions[VMResouceMonitorColumn_NetworkDownTotal] = tr("Network Down\nTotal");
     480    m_columnCaptions[VMResouceMonitorColumn_DiskIOReadRate] = tr("Disk Read\nRate");
     481    m_columnCaptions[VMResouceMonitorColumn_DiskIOWriteRate] = tr("Disk Write\nRate");
     482    m_columnCaptions[VMResouceMonitorColumn_DiskIOReadTotal] = tr("Disk Read\nTotal");
     483    m_columnCaptions[VMResouceMonitorColumn_DiskIOWriteTotal] = tr("Disk Write\nTotal");
     484    m_columnCaptions[VMResouceMonitorColumn_VMExits] = tr("VM Exits");
     485    if (m_pModel)
     486        m_pModel->setColumnCaptions(m_columnCaptions);
     487
    436488}
    437489
     
    448500void UIResourceMonitorWidget::prepare()
    449501{
    450     prepareActions();
     502    m_columnShown.resize(VMResouceMonitorColumn_Max);
     503    for (int i = 0; i < m_columnShown.size(); ++i)
     504        m_columnShown[i] = true;
    451505    prepareWidgets();
    452506    loadSettings();
    453507    retranslateUi();
    454 }
    455 
    456 void UIResourceMonitorWidget::prepareActions()
    457 {
    458508}
    459509
     
    482532    {
    483533        layout()->addWidget(m_pTableView);
     534        m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
     535        connect(m_pTableView, &QTableView::customContextMenuRequested,
     536                this, &UIResourceMonitorWidget::sltCreateContextMenu);
    484537        m_pProxyModel->setSourceModel(m_pModel);
    485538        m_pTableView->setModel(m_pProxyModel);
    486539        m_pTableView->setItemDelegate(new UIVMResouceMonitorDelegate);
    487540        m_pTableView->setSelectionMode(QAbstractItemView::NoSelection);
    488 
    489541        /* m_pTableView->setSelectionMode(QAbstractItemView::SingleSelection);
    490542           m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);*/
     
    502554        m_pTableView->sortByColumn(0, Qt::AscendingOrder);
    503555        connect(m_pModel, &UIResourceMonitorModel::sigDataUpdate, this, &UIResourceMonitorWidget::sltHandleDataUpdate);
     556
     557        m_pProxyModel->setColumnShown(m_columnShown);
    504558    }
    505559}
     
    530584}
    531585
    532 
    533586void UIResourceMonitorWidget::loadSettings()
    534587{
     588}
     589
     590void UIResourceMonitorWidget::sltCreateContextMenu(const QPoint &point)
     591{
     592    if (!m_pTableView)
     593        return;
     594    QMenu menu;
     595
     596    for (int i = 0; i < VMResouceMonitorColumn_Max; ++i)
     597    {
     598        QAction *pAction = menu.addAction(m_columnCaptions[i]);
     599        if (!pAction)
     600            continue;
     601        pAction->setData(i);
     602        pAction->setCheckable(true);
     603        if (i < m_columnShown.size())
     604            pAction->setChecked(m_columnShown[i]);
     605        connect(pAction, &QAction::triggered, this, &UIResourceMonitorWidget::sltHandleColumnAction);
     606    }
     607    menu.exec(m_pTableView->mapToGlobal(point));
     608}
     609
     610void UIResourceMonitorWidget::sltHandleColumnAction(bool fChecked)
     611{
     612    QAction* pSender = qobject_cast<QAction*>(sender());
     613    if (!pSender)
     614        return;
     615    int iColumnId = pSender->data().toInt();
     616    if (iColumnId >= m_columnShown.size())
     617        return;
     618    setColumnShown(iColumnId, fChecked);
    535619}
    536620
     
    539623    if (m_pProxyModel)
    540624        m_pProxyModel->dataUpdate();
     625}
     626
     627void UIResourceMonitorWidget::setColumnShown(int iColumnId, bool fShown)
     628{
     629    if (iColumnId >= m_columnShown.size())
     630        return;
     631    if (m_columnShown[iColumnId] == fShown)
     632        return;
     633    m_columnShown[iColumnId] = fShown;
     634    if (m_pProxyModel)
     635        m_pProxyModel->setColumnShown(m_columnShown);
    541636}
    542637
  • trunk/src/VBox/Frontends/VirtualBox/src/monitor/resource/UIResourceMonitor.h

    r83375 r83379  
    3939class UIResourceMonitorModel;
    4040
    41 
    4241/** QWidget extension to display a Linux top like utility that sort running vm wrt. resource allocations. */
    4342class UIResourceMonitorWidget : public QIWithRetranslateUI<QWidget>
     
    6867    /** @} */
    6968
    70 public slots:
    71 
    7269private slots:
    7370
    7471    void sltHandleDataUpdate();
     72    void sltCreateContextMenu(const QPoint &point);
     73    void sltHandleColumnAction(bool fChecked);
    7574
    7675private:
    7776
     77    void setColumnShown(int iColumnId, bool fShown);
    7878    /** @name Prepare/cleanup cascade.
    7979      * @{ */
    8080        void prepare();
    81         void prepareActions();
    8281        void prepareWidgets();
    8382        void prepareToolBar();
     
    9897        UIResourceMonitorProxyModel *m_pProxyModel;
    9998        UIResourceMonitorModel      *m_pModel;
     99        QVector<QString>             m_columnCaptions;
     100        QVector<bool>                m_columnShown;
    100101    /** @} */
    101102
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