Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/owncloud/client.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Kamm <mail@ckamm.de>2018-02-27 14:54:05 +0300
committerckamm <mail@ckamm.de>2018-03-06 15:02:54 +0300
commit427bb83f0d446d77ef9de79f3eef04fc2efdffaf (patch)
treea08a9b2586d2e278c99dddf9a7d7843ae77325e6 /src/gui/issueswidget.cpp
parentfaec059a9b0a5277f96444c1135517724d4bb1a1 (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.cpp24
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());
}