[Pkg-owncloud-commits] [owncloud-client] 18/94: Issues: Speed up insertion and add hard upper limit #6272

Sandro Knauß hefee at debian.org
Thu Mar 29 11:12:10 UTC 2018


This is an automated email from the git hooks/post-receive script.

hefee pushed a commit to branch upstream
in repository owncloud-client.

commit 7aa9af08c35e5e777858f2a2c5e8b247e2601f40
Author: Christian Kamm <mail at ckamm.de>
Date:   Thu Jan 4 13:53:27 2018 +0100

    Issues: Speed up insertion and add hard upper limit #6272
    
    Since sorting was enabled permanenty the list would be resorted with
    each inserted issue. When inserting thousands of ignored files that
    would make the whole ui freeze up.
    
    Instead, sorting is disabled for inserts now and is reenabled after some
    time has passed. That way users usually see the sorted view without the
    lockups. Also, there's now a maximum of 50k issue entries.
---
 src/gui/issueswidget.cpp | 24 ++++++++++++++++++++++--
 src/gui/issueswidget.h   |  4 ++++
 src/gui/issueswidget.ui  |  7 +++++++
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/src/gui/issueswidget.cpp b/src/gui/issueswidget.cpp
index c132ff9..0ebb5da 100644
--- a/src/gui/issueswidget.cpp
+++ b/src/gui/issueswidget.cpp
@@ -38,6 +38,12 @@
 
 namespace OCC {
 
+/**
+ * If more issues are reported than this they will not show up
+ * to avoid performance issues around sorting this many issues.
+ */
+static const int maxIssueCount = 50000;
+
 IssuesWidget::IssuesWidget(QWidget *parent)
     : QWidget(parent)
     , _ui(new Ui::IssuesWidget)
@@ -96,6 +102,14 @@ IssuesWidget::IssuesWidget(QWidget *parent)
 #if defined(Q_OS_MAC)
     _ui->_treeWidget->setMinimumWidth(400);
 #endif
+
+    _reenableSorting.setInterval(5000);
+    connect(&_reenableSorting, &QTimer::timeout, this,
+        [this]() { _ui->_treeWidget->setSortingEnabled(true); });
+
+    _ui->_tooManyIssuesWarning->hide();
+    connect(this, &IssuesWidget::issueCountUpdated, this,
+        [this](int count) { _ui->_tooManyIssuesWarning->setVisible(count >= maxIssueCount); });
 }
 
 IssuesWidget::~IssuesWidget()
@@ -153,11 +167,17 @@ void IssuesWidget::addItem(QTreeWidgetItem *item)
     if (!item)
         return;
 
-    int insertLoc = 0;
+    int count = _ui->_treeWidget->topLevelItemCount();
+    if (count >= maxIssueCount)
+        return;
+
+    _ui->_treeWidget->setSortingEnabled(false);
+    _reenableSorting.start();
 
     // Insert item specific errors behind the others
+    int insertLoc = 0;
     if (!item->text(1).isEmpty()) {
-        for (int i = 0; i < _ui->_treeWidget->topLevelItemCount(); ++i) {
+        for (int i = 0; i < count; ++i) {
             if (_ui->_treeWidget->topLevelItem(i)->text(1).isEmpty()) {
                 insertLoc = i + 1;
             } else {
diff --git a/src/gui/issueswidget.h b/src/gui/issueswidget.h
index 4accd89..56f4900 100644
--- a/src/gui/issueswidget.h
+++ b/src/gui/issueswidget.h
@@ -18,6 +18,7 @@
 #include <QDialog>
 #include <QDateTime>
 #include <QLocale>
+#include <QTimer>
 
 #include "progressdispatcher.h"
 #include "owncloudgui.h"
@@ -84,6 +85,9 @@ private:
     /// Wipes all insufficient remote storgage blacklist entries
     void retryInsufficentRemoteStorageErrors(const QString &folderAlias);
 
+    /// Each insert disables sorting, this timer reenables it
+    QTimer _reenableSorting;
+
     Ui::IssuesWidget *_ui;
 };
 }
diff --git a/src/gui/issueswidget.ui b/src/gui/issueswidget.ui
index 2d1161e..73acf80 100644
--- a/src/gui/issueswidget.ui
+++ b/src/gui/issueswidget.ui
@@ -128,6 +128,13 @@
     </widget>
    </item>
    <item>
+    <widget class="QLabel" name="_tooManyIssuesWarning">
+     <property name="text">
+      <string>There were too many issues. Not all will be visible here.</string>
+     </property>
+    </widget>
+   </item>
+   <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <spacer name="horizontalSpacer">

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git



More information about the Pkg-owncloud-commits mailing list