Changeset 104965 in vbox
- Timestamp:
- Jun 19, 2024 2:03:06 PM (3 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/src/activity/overview/UIVMActivityOverviewWidget.cpp
r104964 r104965 27 27 28 28 /* Qt includes: */ 29 #include <QAbstractTableModel>30 29 #include <QApplication> 31 30 #include <QCheckBox> … … 36 35 #include <QPainter> 37 36 #include <QPushButton> 38 #include <QTableView>39 37 #include <QTimer> 40 38 #include <QVBoxLayout> 41 #include <QSortFilterProxyModel>42 39 43 40 /* GUI includes: */ 44 41 #include "QIDialogButtonBox.h" 45 #include "QITableView.h"46 42 #include "QIToolBar.h" 47 43 #include "UIActionPoolManager.h" … … 166 162 167 163 /********************************************************************************************************************************* 168 * Class UIVMActivityOverviewTableView definition. *169 *********************************************************************************************************************************/170 /** A QTableView extension so manage the column width a bit better than what Qt offers out of box. */171 class UIVMActivityOverviewTableView : public QTableView172 {173 Q_OBJECT;174 175 signals:176 177 void sigSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);178 179 public:180 181 UIVMActivityOverviewTableView(QWidget *pParent = 0);182 void setMinimumColumnWidths(const QMap<int, int>& widths);183 void updateColumVisibility();184 int selectedItemIndex() const;185 bool hasSelection() const;186 187 protected:188 189 virtual void resizeEvent(QResizeEvent *pEvent) RT_OVERRIDE;190 virtual void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) RT_OVERRIDE;191 virtual void mousePressEvent(QMouseEvent *pEvent) RT_OVERRIDE;192 193 private slots:194 195 196 197 private:198 199 /** Resizes all the columns in response to resizeEvent. Columns cannot be narrower than m_minimumColumnWidths values. */200 void resizeHeaders();201 /** Value is in pixels. Columns cannot be narrower than this width. */202 QMap<int, int> m_minimumColumnWidths;203 };204 205 206 /*********************************************************************************************************************************207 164 * Class UIActivityOverviewItem definition. * 208 165 *********************************************************************************************************************************/ … … 318 275 KCloudMachineState m_enmMachineState; 319 276 QVector<KMetricType> m_availableMetricTypes; 320 };321 322 323 /*********************************************************************************************************************************324 * Class UIVMActivityOverviewProxyModel definition. *325 *********************************************************************************************************************************/326 class UIActivityOverviewProxyModel : public QSortFilterProxyModel327 {328 329 Q_OBJECT;330 331 public:332 333 UIActivityOverviewProxyModel(QObject *parent = 0);334 void dataUpdate();335 void setNotRunningVMVisibility(bool fShow);336 void setCloudVMVisibility(bool fShow);337 338 protected:339 340 virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const RT_OVERRIDE;341 bool filterAcceptsRow(int iSourceRow, const QModelIndex &sourceParent) const RT_OVERRIDE;342 343 private:344 345 bool m_fShowNotRunningVMs;346 bool m_fShowCloudVMs;347 };348 349 350 /*********************************************************************************************************************************351 * UIActivityOverviewModel definition. *352 *********************************************************************************************************************************/353 class UIActivityOverviewModel : public QAbstractTableModel354 {355 Q_OBJECT;356 357 signals:358 359 void sigDataUpdate();360 void sigHostStatsUpdate(const UIVMActivityOverviewHostStats &stats);361 362 public:363 364 UIActivityOverviewModel(QObject *parent = 0);365 int rowCount(const QModelIndex &parent = QModelIndex()) const RT_OVERRIDE;366 int columnCount(const QModelIndex &parent = QModelIndex()) const RT_OVERRIDE;367 QVariant data(const QModelIndex &index, int role) const RT_OVERRIDE;368 void clearData();369 QVariant headerData(int section, Qt::Orientation orientation, int role) const RT_OVERRIDE;370 void setColumnCaptions(const QMap<int, QString>& captions);371 void setColumnVisible(const QMap<int, bool>& columnVisible);372 bool columnVisible(int iColumnId) const;373 void setShouldUpdate(bool fShouldUpdate);374 const QMap<int, int> dataLengths() const;375 QUuid itemUid(int iIndex);376 int itemIndex(const QUuid &uid);377 bool isVMRunning(int rowIndex) const;378 bool isCloudVM(int rowIndex) const;379 void setCloudMachineItems(const QList<UIVirtualMachineItemCloud*> &cloudItems);380 381 private slots:382 383 void sltMachineStateChanged(const QUuid &uId, const KMachineState state);384 void sltMachineRegistered(const QUuid &uId, bool fRegistered);385 void sltLocalVMUpdateTimeout();386 387 private:388 389 void initialize();390 void initializeItems();391 void setupPerformanceCollector();392 void queryPerformanceCollector();393 void addItem(const QUuid& uMachineId, const QString& strMachineName, KMachineState enmState);394 void removeItem(const QUuid& uMachineId);395 void getHostRAMStats();396 397 QVector<UIActivityOverviewItem*> m_itemList;398 QMap<int, QString> m_columnTitles;399 QTimer *m_pLocalVMUpdateTimer;400 401 /** @name The following are used during UIPerformanceCollector::QueryMetricsData(..)402 * @{ */403 QVector<QString> m_nameList;404 QVector<CUnknown> m_objectList;405 /** @} */406 CPerformanceCollector m_performanceCollector;407 QMap<int, bool> m_columnVisible;408 UIVMActivityOverviewHostStats m_hostStats;409 /** Maximum length of string length of data displayed in column. Updated in UIActivityOverviewModel::data(..). */410 mutable QMap<int, int> m_columnDataMaxLength;411 277 }; 412 278 … … 731 597 732 598 733 734 /*********************************************************************************************************************************735 * Class UIVMActivityOverviewTableView implementation. *736 *********************************************************************************************************************************/737 738 UIVMActivityOverviewTableView::UIVMActivityOverviewTableView(QWidget *pParent /* = 0 */)739 :QTableView(pParent)740 {741 }742 743 void UIVMActivityOverviewTableView::setMinimumColumnWidths(const QMap<int, int>& widths)744 {745 m_minimumColumnWidths = widths;746 resizeHeaders();747 }748 749 void UIVMActivityOverviewTableView::updateColumVisibility()750 {751 UIActivityOverviewProxyModel *pProxyModel = qobject_cast<UIActivityOverviewProxyModel *>(model());752 if (!pProxyModel)753 return;754 UIActivityOverviewModel *pModel = qobject_cast<UIActivityOverviewModel *>(pProxyModel->sourceModel());755 QHeaderView *pHeader = horizontalHeader();756 757 if (!pModel || !pHeader)758 return;759 for (int i = (int)VMActivityOverviewColumn_Name; i < (int)VMActivityOverviewColumn_Max; ++i)760 {761 if (!pModel->columnVisible(i))762 pHeader->hideSection(i);763 else764 pHeader->showSection(i);765 }766 resizeHeaders();767 }768 769 int UIVMActivityOverviewTableView::selectedItemIndex() const770 {771 UIActivityOverviewProxyModel *pModel = qobject_cast<UIActivityOverviewProxyModel*>(model());772 if (!pModel)773 return -1;774 775 QItemSelectionModel *pSelectionModel = selectionModel();776 if (!pSelectionModel)777 return -1;778 QModelIndexList selectedItemIndices = pSelectionModel->selectedRows();779 if (selectedItemIndices.isEmpty())780 return -1;781 782 /* just use the the 1st index: */783 QModelIndex modelIndex = pModel->mapToSource(selectedItemIndices[0]);784 785 if (!modelIndex.isValid())786 return -1;787 return modelIndex.row();788 }789 790 bool UIVMActivityOverviewTableView::hasSelection() const791 {792 if (!selectionModel())793 return false;794 return selectionModel()->hasSelection();795 }796 797 void UIVMActivityOverviewTableView::resizeEvent(QResizeEvent *pEvent)798 {799 resizeHeaders();800 QTableView::resizeEvent(pEvent);801 }802 803 void UIVMActivityOverviewTableView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)804 {805 emit sigSelectionChanged(selected, deselected);806 QTableView::selectionChanged(selected, deselected);807 }808 809 void UIVMActivityOverviewTableView::mousePressEvent(QMouseEvent *pEvent)810 {811 if (!indexAt(pEvent->position().toPoint()).isValid())812 clearSelection();813 QTableView::mousePressEvent(pEvent);814 }815 816 void UIVMActivityOverviewTableView::resizeHeaders()817 {818 QHeaderView* pHeader = horizontalHeader();819 if (!pHeader)820 return;821 int iSectionCount = pHeader->count();822 int iHiddenSectionCount = pHeader->hiddenSectionCount();823 int iWidth = width() / (iSectionCount - iHiddenSectionCount);824 for (int i = 0; i < iSectionCount; ++i)825 {826 if (pHeader->isSectionHidden(i))827 continue;828 int iMinWidth = m_minimumColumnWidths.value((VMActivityOverviewColumn)i, 0);829 pHeader->resizeSection(i, iWidth < iMinWidth ? iMinWidth : iWidth);830 }831 }832 833 834 599 /********************************************************************************************************************************* 835 600 * Class UIActivityOverviewItem implementation. * … … 1226 991 { 1227 992 return gpConverter->toString(m_enmMachineState); 1228 }1229 1230 1231 /*********************************************************************************************************************************1232 * Class UIVMActivityOverviewProxyModel implementation. *1233 *********************************************************************************************************************************/1234 UIActivityOverviewProxyModel::UIActivityOverviewProxyModel(QObject *parent /* = 0 */)1235 :QSortFilterProxyModel(parent)1236 {1237 }1238 1239 void UIActivityOverviewProxyModel::dataUpdate()1240 {1241 if (sourceModel())1242 emit dataChanged(index(0,0), index(sourceModel()->rowCount(), sourceModel()->columnCount()));1243 invalidate();1244 }1245 1246 void UIActivityOverviewProxyModel::setNotRunningVMVisibility(bool fShow)1247 {1248 if (m_fShowNotRunningVMs == fShow)1249 return;1250 m_fShowNotRunningVMs = fShow;1251 invalidateFilter();1252 }1253 1254 void UIActivityOverviewProxyModel::setCloudVMVisibility(bool fShow)1255 {1256 if (m_fShowCloudVMs == fShow)1257 return;1258 m_fShowCloudVMs = fShow;1259 invalidateFilter();1260 }1261 1262 bool UIActivityOverviewProxyModel::lessThan(const QModelIndex &sourceLeftIndex, const QModelIndex &sourceRightIndex) const1263 {1264 UIActivityOverviewModel *pModel = qobject_cast<UIActivityOverviewModel*>(sourceModel());1265 if (pModel)1266 {1267 /* Keep running vm always on top of the list: */1268 bool fLeftRunning = pModel->isVMRunning(sourceLeftIndex.row());1269 bool fRightRunning = pModel->isVMRunning(sourceRightIndex.row());1270 if (fLeftRunning && !fRightRunning)1271 {1272 if (sortOrder() == Qt::AscendingOrder)1273 return true;1274 else1275 return false;1276 }1277 if (!fLeftRunning && fRightRunning)1278 {1279 if (sortOrder() == Qt::AscendingOrder)1280 return false;1281 else1282 return true;1283 }1284 }1285 return QSortFilterProxyModel::lessThan(sourceLeftIndex, sourceRightIndex);1286 }1287 1288 bool UIActivityOverviewProxyModel::filterAcceptsRow(int iSourceRow, const QModelIndex &sourceParent) const1289 {1290 Q_UNUSED(sourceParent);1291 if (m_fShowNotRunningVMs && m_fShowCloudVMs)1292 return true;1293 UIActivityOverviewModel *pModel = qobject_cast<UIActivityOverviewModel*>(sourceModel());1294 if (!pModel)1295 return true;1296 1297 if (!m_fShowNotRunningVMs && !pModel->isVMRunning(iSourceRow))1298 return false;1299 if (!m_fShowCloudVMs && pModel->isCloudVM(iSourceRow))1300 return false;1301 return true;1302 }1303 1304 1305 /*********************************************************************************************************************************1306 * Class UIActivityOverviewModel implementation. *1307 *********************************************************************************************************************************/1308 UIActivityOverviewModel::UIActivityOverviewModel(QObject *parent /*= 0*/)1309 :QAbstractTableModel(parent)1310 , m_pLocalVMUpdateTimer(new QTimer(this))1311 {1312 initialize();1313 }1314 1315 void UIActivityOverviewModel::initialize()1316 {1317 for (int i = 0; i < (int)VMActivityOverviewColumn_Max; ++i)1318 m_columnDataMaxLength[i] = 0;1319 1320 initializeItems();1321 connect(gVBoxEvents, &UIVirtualBoxEventHandler::sigMachineStateChange,1322 this, &UIActivityOverviewModel::sltMachineStateChanged);1323 connect(gVBoxEvents, &UIVirtualBoxEventHandler::sigMachineRegistered,1324 this, &UIActivityOverviewModel::sltMachineRegistered);1325 if (m_pLocalVMUpdateTimer)1326 {1327 connect(m_pLocalVMUpdateTimer, &QTimer::timeout, this, &UIActivityOverviewModel::sltLocalVMUpdateTimeout);1328 m_pLocalVMUpdateTimer->start(1000);1329 }1330 }1331 1332 int UIActivityOverviewModel::rowCount(const QModelIndex &parent /* = QModelIndex() */) const1333 {1334 Q_UNUSED(parent);1335 return m_itemList.size();1336 }1337 1338 int UIActivityOverviewModel::columnCount(const QModelIndex &parent /* = QModelIndex() */) const1339 {1340 Q_UNUSED(parent);1341 return VMActivityOverviewColumn_Max;1342 }1343 1344 void UIActivityOverviewModel::setShouldUpdate(bool fShouldUpdate)1345 {1346 if (m_pLocalVMUpdateTimer)1347 {1348 if (fShouldUpdate)1349 m_pLocalVMUpdateTimer->start();1350 else1351 m_pLocalVMUpdateTimer->stop();1352 }1353 }1354 1355 const QMap<int, int> UIActivityOverviewModel::dataLengths() const1356 {1357 return m_columnDataMaxLength;1358 }1359 1360 QUuid UIActivityOverviewModel::itemUid(int iIndex)1361 {1362 if (iIndex >= m_itemList.size() || !m_itemList[iIndex])1363 return QUuid();1364 return m_itemList[iIndex]->machineId();1365 }1366 1367 int UIActivityOverviewModel::itemIndex(const QUuid &uid)1368 {1369 for (int i = 0; i < m_itemList.size(); ++i)1370 {1371 if (!m_itemList[i])1372 continue;1373 if (m_itemList[i]->machineId() == uid)1374 return i;1375 }1376 return -1;1377 }1378 1379 bool UIActivityOverviewModel::isVMRunning(int rowIndex) const1380 {1381 if (rowIndex >= m_itemList.size() || rowIndex < 0 || !m_itemList[rowIndex])1382 return false;1383 return m_itemList[rowIndex]->isRunning();1384 }1385 1386 bool UIActivityOverviewModel::isCloudVM(int rowIndex) const1387 {1388 if (rowIndex >= m_itemList.size() || rowIndex < 0 || !m_itemList[rowIndex])1389 return false;1390 return m_itemList[rowIndex]->isCloudVM();1391 }1392 1393 void UIActivityOverviewModel::setCloudMachineItems(const QList<UIVirtualMachineItemCloud*> &cloudItems)1394 {1395 QVector<QUuid> newIds;1396 foreach (const UIVirtualMachineItemCloud* pItem, cloudItems)1397 {1398 if (!pItem)1399 continue;1400 QUuid id = pItem->machineId();1401 if (id.isNull())1402 continue;1403 newIds << id;1404 }1405 QVector<UIActivityOverviewItem*> originalItemList = m_itemList;1406 1407 /* Remove m_itemList items that are not in @cloudItems: */1408 QMutableVectorIterator<UIActivityOverviewItem*> iterator(m_itemList);1409 while (iterator.hasNext())1410 {1411 UIActivityOverviewItem *pItem = iterator.next();1412 if (!pItem->isCloudVM())1413 continue;1414 if (pItem && !newIds.contains(pItem->machineId()))1415 iterator.remove();1416 }1417 1418 /* Add items that are not in m_itemList: */1419 foreach (const UIVirtualMachineItemCloud* pItem, cloudItems)1420 {1421 if (!pItem)1422 continue;1423 CCloudMachine comMachine = pItem->machine();1424 if (!comMachine.isOk())1425 continue;1426 QUuid id = comMachine.GetId();1427 /* Linearly search for the vm with th same id. I cannot make QVector::contain work since we store pointers: */1428 bool fFound = false;1429 for (int i = 0; i < m_itemList.size() && !fFound; ++i)1430 {1431 if (m_itemList[i] && m_itemList[i]->machineId() == id)1432 fFound = true;1433 }1434 if (!fFound)1435 m_itemList.append(new UIActivityOverviewItemCloud(this, id, comMachine.GetName(), comMachine));1436 }1437 1438 /* Update cloud machine states: */1439 for (int i = 0; i < m_itemList.size(); ++i)1440 {1441 if (!m_itemList[i] || !m_itemList[i]->isCloudVM())1442 continue;1443 UIActivityOverviewItemCloud *pItem = qobject_cast<UIActivityOverviewItemCloud*>(m_itemList[i]);1444 if (!pItem)1445 continue;1446 pItem->updateMachineState();1447 }1448 }1449 1450 QVariant UIActivityOverviewModel::data(const QModelIndex &index, int role) const1451 {1452 if (!isVMRunning(index.row()))1453 {1454 if (role == Qt::FontRole)1455 {1456 QFont font = qApp->font();1457 font.setItalic(true);1458 return font;1459 }1460 if (role == Qt::ForegroundRole)1461 {1462 /* For some reason QColor::lighter(..) is not working here: */1463 QColor color = qApp->palette().color(QPalette::Active, QPalette::WindowText);1464 int h, s, l;1465 color.getHsl(&h, &s, &l);1466 l = 100;1467 return QColor::fromHsl(h, s, l);1468 }1469 }1470 if (!index.isValid() || role != Qt::DisplayRole || index.row() >= rowCount())1471 return QVariant();1472 1473 UIActivityOverviewItem *pItem = m_itemList[index.row()];1474 AssertPtrReturn(pItem, QVariant());1475 1476 if (index.column() == VMActivityOverviewColumn_Name)1477 return pItem->columnData(index.column());1478 1479 if (!pItem->isRunning())1480 return pItem->machineStateString();1481 1482 return pItem->columnData(index.column());1483 }1484 1485 void UIActivityOverviewModel::clearData()1486 {1487 /* We have a request to detach COM stuff,1488 * first of all we are removing all the items,1489 * this will detach COM wrappers implicitly: */1490 qDeleteAll(m_itemList);1491 m_itemList.clear();1492 /* Detaching perf. collector finally,1493 * please do not use it after all: */1494 m_performanceCollector.detach();1495 }1496 1497 QVariant UIActivityOverviewModel::headerData(int section, Qt::Orientation orientation, int role) const1498 {1499 if (role == Qt::DisplayRole && orientation == Qt::Horizontal)1500 return m_columnTitles.value((VMActivityOverviewColumn)section, QString());;1501 return QVariant();1502 }1503 1504 void UIActivityOverviewModel::setColumnCaptions(const QMap<int, QString>& captions)1505 {1506 m_columnTitles = captions;1507 }1508 1509 void UIActivityOverviewModel::initializeItems()1510 {1511 foreach (const CMachine &comMachine, gpGlobalSession->virtualBox().GetMachines())1512 {1513 if (!comMachine.isNull())1514 addItem(comMachine.GetId(), comMachine.GetName(), comMachine.GetState());1515 }1516 setupPerformanceCollector();1517 }1518 1519 void UIActivityOverviewModel::sltMachineStateChanged(const QUuid &uId, const KMachineState state)1520 {1521 int iIndex = itemIndex(uId);1522 if (iIndex != -1 && iIndex < m_itemList.size())1523 {1524 UIActivityOverviewItemLocal *pItem = qobject_cast<UIActivityOverviewItemLocal*>(m_itemList[iIndex]);1525 if (pItem)1526 {1527 pItem->setMachineState(state);1528 if (state == KMachineState_Running)1529 pItem->resetDebugger();1530 }1531 }1532 }1533 1534 void UIActivityOverviewModel::sltMachineRegistered(const QUuid &uId, bool fRegistered)1535 {1536 if (fRegistered)1537 {1538 CMachine comMachine = gpGlobalSession->virtualBox().FindMachine(uId.toString());1539 if (!comMachine.isNull())1540 addItem(uId, comMachine.GetName(), comMachine.GetState());1541 }1542 else1543 removeItem(uId);1544 emit sigDataUpdate();1545 }1546 1547 void UIActivityOverviewModel::getHostRAMStats()1548 {1549 CHost comHost = gpGlobalSession->host();1550 m_hostStats.m_iRAMTotal = _1M * (quint64)comHost.GetMemorySize();1551 m_hostStats.m_iRAMFree = _1M * (quint64)comHost.GetMemoryAvailable();1552 }1553 1554 void UIActivityOverviewModel::sltLocalVMUpdateTimeout()1555 {1556 /* Host's RAM usage is obtained from IHost not from IPerformanceCollector: */1557 getHostRAMStats();1558 1559 /* Use IPerformanceCollector to update VM RAM usage and Host CPU and file IO stats: */1560 queryPerformanceCollector();1561 1562 for (int i = 0; i < m_itemList.size(); ++i)1563 {1564 UIActivityOverviewItemLocal *pItem = qobject_cast<UIActivityOverviewItemLocal*>(m_itemList[i]);1565 if (!pItem || !pItem->isRunning())1566 continue;1567 pItem->updateColumnData();1568 }1569 1570 for (int i = 0; i < (int)VMActivityOverviewColumn_Max; ++i)1571 {1572 for (int j = 0; j < m_itemList.size(); ++j)1573 if (m_columnDataMaxLength.value(i, 0) < m_itemList[j]->columnLength(i))1574 m_columnDataMaxLength[i] = m_itemList[j]->columnLength(i);1575 }1576 1577 emit sigDataUpdate();1578 emit sigHostStatsUpdate(m_hostStats);1579 }1580 1581 void UIActivityOverviewModel::setupPerformanceCollector()1582 {1583 m_nameList.clear();1584 m_objectList.clear();1585 /* Initialize and configure CPerformanceCollector: */1586 const ULONG iPeriod = 1;1587 const int iMetricSetupCount = 1;1588 if (m_performanceCollector.isNull())1589 m_performanceCollector = gpGlobalSession->virtualBox().GetPerformanceCollector();1590 for (int i = 0; i < m_itemList.size(); ++i)1591 m_nameList << "Guest/RAM/Usage*";1592 /* This is for the host: */1593 m_nameList << "CPU*";1594 m_nameList << "FS*";1595 m_objectList = QVector<CUnknown>(m_nameList.size(), CUnknown());1596 m_performanceCollector.SetupMetrics(m_nameList, m_objectList, iPeriod, iMetricSetupCount);1597 }1598 1599 void UIActivityOverviewModel::queryPerformanceCollector()1600 {1601 QVector<QString> aReturnNames;1602 QVector<CUnknown> aReturnObjects;1603 QVector<QString> aReturnUnits;1604 QVector<ULONG> aReturnScales;1605 QVector<ULONG> aReturnSequenceNumbers;1606 QVector<ULONG> aReturnDataIndices;1607 QVector<ULONG> aReturnDataLengths;1608 1609 QVector<LONG> returnData = m_performanceCollector.QueryMetricsData(m_nameList,1610 m_objectList,1611 aReturnNames,1612 aReturnObjects,1613 aReturnUnits,1614 aReturnScales,1615 aReturnSequenceNumbers,1616 aReturnDataIndices,1617 aReturnDataLengths);1618 /* Parse the result we get from CPerformanceCollector to get respective values: */1619 for (int i = 0; i < aReturnNames.size(); ++i)1620 {1621 if (aReturnDataLengths[i] == 0)1622 continue;1623 /* Read the last of the return data disregarding the rest since we are caching the data in GUI side: */1624 float fData = returnData[aReturnDataIndices[i] + aReturnDataLengths[i] - 1] / (float)aReturnScales[i];1625 if (aReturnNames[i].contains("RAM", Qt::CaseInsensitive) && !aReturnNames[i].contains(":"))1626 {1627 if (aReturnNames[i].contains("Total", Qt::CaseInsensitive) || aReturnNames[i].contains("Free", Qt::CaseInsensitive))1628 {1629 {1630 CMachine comMachine = (CMachine)aReturnObjects[i];1631 if (comMachine.isNull())1632 continue;1633 int iIndex = itemIndex(comMachine.GetId());1634 if (iIndex == -1 || iIndex >= m_itemList.size() || !m_itemList[iIndex])1635 continue;1636 1637 if (aReturnNames[i].contains("Total", Qt::CaseInsensitive))1638 m_itemList[iIndex]->m_uTotalRAM = fData;1639 else1640 m_itemList[iIndex]->m_uFreeRAM = fData;1641 }1642 }1643 }1644 else if (aReturnNames[i].contains("CPU/Load/User", Qt::CaseInsensitive) && !aReturnNames[i].contains(":"))1645 {1646 CHost comHost = (CHost)aReturnObjects[i];1647 if (!comHost.isNull())1648 m_hostStats.m_iCPUUserLoad = fData;1649 }1650 else if (aReturnNames[i].contains("CPU/Load/Kernel", Qt::CaseInsensitive) && !aReturnNames[i].contains(":"))1651 {1652 CHost comHost = (CHost)aReturnObjects[i];1653 if (!comHost.isNull())1654 m_hostStats.m_iCPUKernelLoad = fData;1655 }1656 else if (aReturnNames[i].contains("CPU/MHz", Qt::CaseInsensitive) && !aReturnNames[i].contains(":"))1657 {1658 CHost comHost = (CHost)aReturnObjects[i];1659 if (!comHost.isNull())1660 m_hostStats.m_iCPUFreq = fData;1661 }1662 else if (aReturnNames[i].contains("FS", Qt::CaseInsensitive) &&1663 aReturnNames[i].contains("Total", Qt::CaseInsensitive) &&1664 !aReturnNames[i].contains(":"))1665 {1666 CHost comHost = (CHost)aReturnObjects[i];1667 if (!comHost.isNull())1668 m_hostStats.m_iFSTotal = _1M * fData;1669 }1670 else if (aReturnNames[i].contains("FS", Qt::CaseInsensitive) &&1671 aReturnNames[i].contains("Free", Qt::CaseInsensitive) &&1672 !aReturnNames[i].contains(":"))1673 {1674 CHost comHost = (CHost)aReturnObjects[i];1675 if (!comHost.isNull())1676 m_hostStats.m_iFSFree = _1M * fData;1677 }1678 }1679 for (int i = 0; i < m_itemList.size(); ++i)1680 {1681 if (!m_itemList[i] || m_itemList[i]->isCloudVM())1682 continue;1683 m_itemList[i]->m_uUsedRAM = m_itemList[i]->m_uTotalRAM - m_itemList[i]->m_uFreeRAM;1684 if (m_itemList[i]->m_uTotalRAM != 0)1685 m_itemList[i]->m_fRAMUsagePercentage = 100.f * (m_itemList[i]->m_uUsedRAM / (float)m_itemList[i]->m_uTotalRAM);1686 }1687 }1688 1689 void UIActivityOverviewModel::addItem(const QUuid& uMachineId, const QString& strMachineName, KMachineState enmState)1690 {1691 UIActivityOverviewItemLocal *pItem = new UIActivityOverviewItemLocal(this, uMachineId, strMachineName);1692 pItem->setMachineState(enmState);1693 m_itemList.append(pItem);1694 }1695 1696 void UIActivityOverviewModel::removeItem(const QUuid& uMachineId)1697 {1698 int iIndex = itemIndex(uMachineId);1699 if (iIndex == -1)1700 return;1701 delete m_itemList[iIndex];1702 m_itemList.remove(iIndex);1703 }1704 1705 void UIActivityOverviewModel::setColumnVisible(const QMap<int, bool>& columnVisible)1706 {1707 m_columnVisible = columnVisible;1708 }1709 1710 bool UIActivityOverviewModel::columnVisible(int iColumnId) const1711 {1712 return m_columnVisible.value(iColumnId, true);1713 993 } 1714 994
Note:
See TracChangeset
for help on using the changeset viewer.

