Changeset 83379 in vbox
- Timestamp:
- Mar 24, 2020 10:49:54 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 136594
- 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 51 51 #include <iprt/cidr.h> 52 52 53 53 /* The first element must be 0 and the rest must be consecutive: */ 54 54 enum VMResouceMonitorColumn 55 55 { … … 57 57 VMResouceMonitorColumn_CPUGuestLoad, 58 58 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, 65 70 VMResouceMonitorColumn_Max 66 71 }; 67 72 73 struct ResourceColumn 74 { 75 QString m_strName; 76 bool m_fEnabled; 77 }; 68 78 /********************************************************************************************************************************* 69 79 * Class UIVMResouceMonitorItem definition. * … … 90 100 quint64 m_uDiskReadTotal; 91 101 102 quint64 m_uVMExitRate; 103 quint64 m_uVMExitTotal; 104 92 105 CMachineDebugger m_comDebugger; 93 106 … … 106 119 UIResourceMonitorProxyModel(QObject *parent = 0); 107 120 void dataUpdate(); 121 void setColumnShown(const QVector<bool>& columnShown); 108 122 109 123 protected: 110 124 111 125 //virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const /* override */; 126 virtual bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const /* override */; 112 127 113 128 private: 129 130 QVector<bool> m_columnShown; 114 131 115 132 }; … … 134 151 QVariant data(const QModelIndex &index, int role) const /* override */; 135 152 QVariant headerData(int section, Qt::Orientation orientation, int role) const; 153 void setColumnCaptions(const QVector<QString>& captions); 136 154 137 155 private slots: … … 144 162 QVector<UIResourceMonitorItem> m_itemList; 145 163 void initializeItems(); 164 QVector<QString> m_columnCaptions; 146 165 147 166 QTimer *m_pTimer; … … 177 196 , m_uDiskWriteTotal(0) 178 197 , m_uDiskReadTotal(0) 198 , m_uVMExitRate(0) 199 , m_uVMExitTotal(0) 179 200 { 180 201 CSession comSession = uiCommon().openSession(uid, KLockType_Shared); … … 197 218 , m_uDiskWriteTotal(0) 198 219 , m_uDiskReadTotal(0) 220 , m_uVMExitRate(0) 221 , m_uVMExitTotal(0) 199 222 { 200 223 } … … 210 233 , m_uDiskWriteTotal(0) 211 234 , m_uDiskReadTotal(0) 235 , m_uVMExitRate(0) 236 , m_uVMExitTotal(0) 212 237 { 213 238 } … … 235 260 } 236 261 262 bool 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 270 void UIResourceMonitorProxyModel::setColumnShown(const QVector<bool>& columnShown) 271 { 272 m_columnShown = columnShown; 273 invalidateFilter(); 274 } 275 237 276 238 277 /********************************************************************************************************************************* … … 263 302 { 264 303 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; 265 310 return VMResouceMonitorColumn_Max; 266 311 } … … 271 316 if (!index.isValid() || role != Qt::DisplayRole || index.row() >= rowCount()) 272 317 return QVariant(); 318 // if (index.column() >= m_columnShown.size() || !m_columnShown[index.column()]) 319 // return QVariant(); 273 320 switch (index.column()) 274 321 { … … 282 329 return m_itemList[index.row()].m_uCPUVMMLoad; 283 330 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)); 299 358 break; 300 359 default: … … 306 365 QVariant UIResourceMonitorModel::headerData(int section, Qt::Orientation orientation, int role) const 307 366 { 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]; 345 369 return QVariant(); 370 } 371 372 void UIResourceMonitorModel::setColumnCaptions(const QVector<QString>& captions) 373 { 374 m_columnCaptions = captions; 346 375 } 347 376 … … 404 433 m_itemList[i].m_uDiskWriteRate = m_itemList[i].m_uDiskWriteTotal - uPrevWriteTotal; 405 434 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; 406 440 } 407 441 } … … 434 468 void UIResourceMonitorWidget::retranslateUi() 435 469 { 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 436 488 } 437 489 … … 448 500 void UIResourceMonitorWidget::prepare() 449 501 { 450 prepareActions(); 502 m_columnShown.resize(VMResouceMonitorColumn_Max); 503 for (int i = 0; i < m_columnShown.size(); ++i) 504 m_columnShown[i] = true; 451 505 prepareWidgets(); 452 506 loadSettings(); 453 507 retranslateUi(); 454 }455 456 void UIResourceMonitorWidget::prepareActions()457 {458 508 } 459 509 … … 482 532 { 483 533 layout()->addWidget(m_pTableView); 534 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu); 535 connect(m_pTableView, &QTableView::customContextMenuRequested, 536 this, &UIResourceMonitorWidget::sltCreateContextMenu); 484 537 m_pProxyModel->setSourceModel(m_pModel); 485 538 m_pTableView->setModel(m_pProxyModel); 486 539 m_pTableView->setItemDelegate(new UIVMResouceMonitorDelegate); 487 540 m_pTableView->setSelectionMode(QAbstractItemView::NoSelection); 488 489 541 /* m_pTableView->setSelectionMode(QAbstractItemView::SingleSelection); 490 542 m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);*/ … … 502 554 m_pTableView->sortByColumn(0, Qt::AscendingOrder); 503 555 connect(m_pModel, &UIResourceMonitorModel::sigDataUpdate, this, &UIResourceMonitorWidget::sltHandleDataUpdate); 556 557 m_pProxyModel->setColumnShown(m_columnShown); 504 558 } 505 559 } … … 530 584 } 531 585 532 533 586 void UIResourceMonitorWidget::loadSettings() 534 587 { 588 } 589 590 void 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 610 void 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); 535 619 } 536 620 … … 539 623 if (m_pProxyModel) 540 624 m_pProxyModel->dataUpdate(); 625 } 626 627 void 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); 541 636 } 542 637 -
trunk/src/VBox/Frontends/VirtualBox/src/monitor/resource/UIResourceMonitor.h
r83375 r83379 39 39 class UIResourceMonitorModel; 40 40 41 42 41 /** QWidget extension to display a Linux top like utility that sort running vm wrt. resource allocations. */ 43 42 class UIResourceMonitorWidget : public QIWithRetranslateUI<QWidget> … … 68 67 /** @} */ 69 68 70 public slots:71 72 69 private slots: 73 70 74 71 void sltHandleDataUpdate(); 72 void sltCreateContextMenu(const QPoint &point); 73 void sltHandleColumnAction(bool fChecked); 75 74 76 75 private: 77 76 77 void setColumnShown(int iColumnId, bool fShown); 78 78 /** @name Prepare/cleanup cascade. 79 79 * @{ */ 80 80 void prepare(); 81 void prepareActions();82 81 void prepareWidgets(); 83 82 void prepareToolBar(); … … 98 97 UIResourceMonitorProxyModel *m_pProxyModel; 99 98 UIResourceMonitorModel *m_pModel; 99 QVector<QString> m_columnCaptions; 100 QVector<bool> m_columnShown; 100 101 /** @} */ 101 102
Note:
See TracChangeset
for help on using the changeset viewer.