diff options
author | Christian Kamm <mail@ckamm.de> | 2018-02-27 14:54:05 +0300 |
---|---|---|
committer | ckamm <mail@ckamm.de> | 2018-03-06 15:02:54 +0300 |
commit | 427bb83f0d446d77ef9de79f3eef04fc2efdffaf (patch) | |
tree | a08a9b2586d2e278c99dddf9a7d7843ae77325e6 /src/gui/issueswidget.cpp | |
parent | faec059a9b0a5277f96444c1135517724d4bb1a1 (diff) |
IssuesWidget: addItem performance improvement
Ensure adding a new item isn't usually O(n) by keeping track of which
items have associated issues.
Diffstat (limited to 'src/gui/issueswidget.cpp')
-rw-r--r-- | src/gui/issueswidget.cpp | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/gui/issueswidget.cpp b/src/gui/issueswidget.cpp index fbfe59b88..ad1163efb 100644 --- a/src/gui/issueswidget.cpp +++ b/src/gui/issueswidget.cpp @@ -46,6 +46,11 @@ namespace OCC { */ static const int maxIssueCount = 50000; +static QPair<QString, QString> pathsWithIssuesKey(const ProtocolItem::ExtraData &data) +{ + return qMakePair(data.folderName, data.path); +} + IssuesWidget::IssuesWidget(QWidget *parent) : QWidget(parent) , _ui(new Ui::IssuesWidget) @@ -162,8 +167,10 @@ void IssuesWidget::cleanItems(const std::function<bool(QTreeWidgetItem *)> &shou int itemCnt = _ui->_treeWidget->topLevelItemCount(); for (int cnt = itemCnt - 1; cnt >= 0; cnt--) { QTreeWidgetItem *item = _ui->_treeWidget->topLevelItem(cnt); - if (shouldDelete(item)) + if (shouldDelete(item)) { + _pathsWithIssues.remove(pathsWithIssuesKey(ProtocolItem::extraData(item))); delete item; + } } _ui->_treeWidget->setSortingEnabled(true); @@ -198,16 +205,19 @@ void IssuesWidget::addItem(QTreeWidgetItem *item) // Wipe any existing message for the same folder and path auto newData = ProtocolItem::extraData(item); - for (int i = 0; i < count; ++i) { - auto otherItem = _ui->_treeWidget->topLevelItem(i); - auto otherData = ProtocolItem::extraData(otherItem); - if (otherData.path == newData.path && otherData.folderName == newData.folderName) { - delete otherItem; - break; + if (_pathsWithIssues.contains(pathsWithIssuesKey(newData))) { + for (int i = 0; i < count; ++i) { + auto otherItem = _ui->_treeWidget->topLevelItem(i); + auto otherData = ProtocolItem::extraData(otherItem); + if (otherData.path == newData.path && otherData.folderName == newData.folderName) { + delete otherItem; + break; + } } } _ui->_treeWidget->insertTopLevelItem(insertLoc, item); + _pathsWithIssues.insert(pathsWithIssuesKey(newData)); item->setHidden(!shouldBeVisible(item, currentAccountFilter(), currentFolderFilter())); emit issueCountUpdated(_ui->_treeWidget->topLevelItemCount()); } |