[Pkg-owncloud-commits] [owncloud-client] 325/484: ShareDialog: fix auto completion to actualy auto complete

Sandro Knauß hefee-guest at moszumanska.debian.org
Wed Dec 16 00:37:59 UTC 2015


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

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

commit 0d21503ee59dcf8fdd91bdfac4ddec9835d49ce9
Author: Olivier Goffart <ogoffart at woboq.com>
Date:   Mon Nov 16 14:18:01 2015 +0100

    ShareDialog: fix auto completion to actualy auto complete
---
 src/gui/ocsshareejob.cpp         |  4 +--
 src/gui/ocsshareejob.h           |  5 +---
 src/gui/sharee.cpp               | 60 ++++++++++++++++++++++++++++------------
 src/gui/sharee.h                 | 13 ++++-----
 src/gui/shareusergroupwidget.cpp | 57 +++++++++++++++++++++++---------------
 src/gui/shareusergroupwidget.h   |  6 ++--
 6 files changed, 90 insertions(+), 55 deletions(-)

diff --git a/src/gui/ocsshareejob.cpp b/src/gui/ocsshareejob.cpp
index 60aa0c9..e81e082 100644
--- a/src/gui/ocsshareejob.cpp
+++ b/src/gui/ocsshareejob.cpp
@@ -23,8 +23,8 @@ OcsShareeJob::OcsShareeJob(AccountPtr account)
 
 }
 
-void OcsShareeJob::getSharees(const QString search,
-                              const QString itemType,
+void OcsShareeJob::getSharees(const QString &search,
+                              const QString &itemType,
                               int page,
                               int perPage)
 {
diff --git a/src/gui/ocsshareejob.h b/src/gui/ocsshareejob.h
index c8a49fd..3d3a1e5 100644
--- a/src/gui/ocsshareejob.h
+++ b/src/gui/ocsshareejob.h
@@ -36,10 +36,7 @@ public:
      *
      * @param path Path to request shares for (default all shares)
      */
-    void getSharees(const QString search,
-                    const QString itemType,
-                    int page = 1,
-                    int perPage = 50);
+    void getSharees(const QString& search, const QString& itemType, int page = 1, int perPage = 50);
 signals:
     /**
      * Result of the OCS request
diff --git a/src/gui/sharee.cpp b/src/gui/sharee.cpp
index 491f54c..04fddff 100644
--- a/src/gui/sharee.cpp
+++ b/src/gui/sharee.cpp
@@ -53,22 +53,14 @@ Sharee::Type Sharee::type() const
     return _type;
 }
 
-ShareeModel::ShareeModel(AccountPtr account,
-                         const QString search,
-                         const QString type,
-                         const QVector<QSharedPointer<Sharee>> &shareeBlacklist,
-                         QObject *parent)
-: QAbstractListModel(parent),
-  _account(account),
-  _search(search),
-  _type(type),
-  _shareeBlacklist(shareeBlacklist)
-{
-
-}
+ShareeModel::ShareeModel(const AccountPtr &account, const QString &type, QObject *parent)
+    : QAbstractListModel(parent), _account(account), _type(type)
+{ }
 
-void ShareeModel::fetch()
+void ShareeModel::fetch(const QString &search, const ShareeSet &blacklist)
 {
+    _search = search;
+    _shareeBlacklist = blacklist;
     OcsShareeJob *job = new OcsShareeJob(_account);
     connect(job, SIGNAL(shareeJobFinished(QVariantMap)), SLOT(shareesFetched(QVariantMap)));
     job->getSharees(_search, _type, 1, 50);
@@ -134,11 +126,8 @@ void ShareeModel::shareesFetched(const QVariantMap &reply)
             filteredSharees.append(sharee);
         }
     }
-    
-    beginInsertRows(QModelIndex(), _sharees.size(), filteredSharees.size());
-    _sharees += filteredSharees;
-    endInsertRows();
 
+    setNewSharees(filteredSharees);
     shareesReady();
 }
 
@@ -151,6 +140,41 @@ QSharedPointer<Sharee> ShareeModel::parseSharee(const QVariantMap &data)
     return QSharedPointer<Sharee>(new Sharee(shareWith, shareWith, type));
 }
 
+/* Set the new sharee
+
+    Do that while preserving the model index so the selection stays
+*/
+void ShareeModel::setNewSharees(const QVector<QSharedPointer<Sharee>>& newSharees)
+{
+    layoutAboutToBeChanged();
+    const auto persistent = persistentIndexList();
+    QVector<QSharedPointer<Sharee>> oldPersistantSharee;
+    oldPersistantSharee.reserve(persistent.size());
+
+    std::transform(persistent.begin(), persistent.end(), std::back_inserter(oldPersistantSharee),
+                   [](const QModelIndex &idx) { return idx.data(Qt::UserRole).value<QSharedPointer<Sharee>>(); });
+
+    _sharees = newSharees;
+
+    QModelIndexList newPersistant;
+    newPersistant.reserve(persistent.size());
+    foreach(const QSharedPointer<Sharee> &sharee, oldPersistantSharee) {
+        auto it = std::find_if(_sharees.constBegin(), _sharees.constEnd(),
+                               [&sharee](const QSharedPointer<Sharee> &s2) {
+                                    return s2->format() == sharee->format() && s2->displayName() == sharee->format();
+                               });
+        if (it == _sharees.constEnd()) {
+            newPersistant << QModelIndex();
+        } else {
+            newPersistant << index(it - _sharees.constBegin());
+        }
+    }
+
+    changePersistentIndexList(persistent, newPersistant);
+    layoutChanged();
+}
+
+
 int ShareeModel::rowCount(const QModelIndex &) const
 {
     return _sharees.size();
diff --git a/src/gui/sharee.h b/src/gui/sharee.h
index 6621813..bb67537 100644
--- a/src/gui/sharee.h
+++ b/src/gui/sharee.h
@@ -44,23 +44,21 @@ public:
     QString shareWith() const;
     QString displayName() const;
     Type type() const;
-    
+
 private:
     QString _shareWith;
     QString _displayName;
     Type _type;
 };
 
+
 class ShareeModel : public QAbstractListModel {
     Q_OBJECT
 public:
-    explicit ShareeModel(AccountPtr account,
-                         const QString search,
-                         const QString type,
-                         const QVector<QSharedPointer<Sharee>> &shareeBlacklist,
-                         QObject *parent = 0);
+    explicit ShareeModel(const AccountPtr &account, const QString &type, QObject *parent = 0);
 
-    void fetch();
+    typedef QVector<QSharedPointer<Sharee>> ShareeSet; // FIXME: make it a QSet<Sharee> when Sharee can be compared
+    void fetch(const QString &search, const ShareeSet &blacklist);
     int rowCount(const QModelIndex &parent = QModelIndex()) const;
     QVariant data(const QModelIndex &index, int role) const;
 
@@ -74,6 +72,7 @@ private slots:
 
 private:
     QSharedPointer<Sharee> parseSharee(const QVariantMap &data);
+    void setNewSharees(const QVector<QSharedPointer<Sharee>> &newSharees);
 
     AccountPtr _account;
     QString _search;
diff --git a/src/gui/shareusergroupwidget.cpp b/src/gui/shareusergroupwidget.cpp
index 0246bdf..aa75b03 100644
--- a/src/gui/shareusergroupwidget.cpp
+++ b/src/gui/shareusergroupwidget.cpp
@@ -55,6 +55,12 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, const QString &sh
     _isFile = QFileInfo(localPath).isFile();
 
     _completer = new QCompleter(this);
+    _completerModel = new ShareeModel(_account,
+                                      _isFile ? QLatin1String("file") : QLatin1String("folder"),
+                                      _completer);
+    connect(_completerModel, SIGNAL(shareesReady()), this, SLOT(slotShareesReady()));
+
+    _completer->setModel(_completerModel);
     _ui->shareeLineEdit->setCompleter(_completer);
 
     _ui->searchPushButton->setEnabled(false);
@@ -65,6 +71,12 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, const QString &sh
 //    connect(_ui->shareeLineEdit, SIGNAL(returnPressed()), SLOT(on_searchPushButton_clicked()));
     connect(_completer, SIGNAL(activated(QModelIndex)), SLOT(slotCompleterActivated(QModelIndex)));
 
+    // Queued connection so this signal is recieved after textChanged
+    connect(_ui->shareeLineEdit, SIGNAL(textEdited(QString)),
+            this, SLOT(slotLineEditTextEdited(QString)), Qt::QueuedConnection);
+    connect(&_completionTimer, SIGNAL(timeout()), this, SLOT(on_searchPushButton_clicked()));
+    _completionTimer.setSingleShot(true);
+    _completionTimer.setInterval(600);
 }
 
 ShareUserGroupWidget::~ShareUserGroupWidget()
@@ -74,6 +86,7 @@ ShareUserGroupWidget::~ShareUserGroupWidget()
 
 void ShareUserGroupWidget::on_shareeLineEdit_textChanged(const QString &text)
 {
+    _completionTimer.stop();
     if (text == "") {
         _ui->searchPushButton->setEnabled(false);
     } else {
@@ -81,38 +94,34 @@ void ShareUserGroupWidget::on_shareeLineEdit_textChanged(const QString &text)
     }
 }
 
+void ShareUserGroupWidget::slotLineEditTextEdited(const QString& text)
+{
+    // First textChanged is called first and we stopped the timer when the text is changed, programatically or not
+    // Then we restart the timer here if the user touched a key
+    if (!text.isEmpty()) {
+        _completionTimer.start();
+    }
+}
+
+
 void ShareUserGroupWidget::on_searchPushButton_clicked()
 {
-     QVector<QSharedPointer<Sharee>> sharees;
+    _completionTimer.stop();
+    ShareeModel::ShareeSet blacklist;
 
     // Add the current user to _sharees since we can't share with ourself
     QSharedPointer<Sharee> currentUser(new Sharee(_account->credentials()->user(), "", Sharee::Type::User));
-    sharees.append(currentUser);
+    blacklist << currentUser;
 
     for(int i = 0; i < _ui->sharesLayout->count(); i++) {
         QWidget *w = _ui->sharesLayout->itemAt(i)->widget();
-
-        if (w != NULL) {
-            const QSharedPointer<Sharee> x = static_cast<ShareWidget *>(w)->share()->getShareWith();
-            sharees.append(x);
+        if (auto sw = qobject_cast<ShareWidget *>(w)) {
+            blacklist << sw->share()->getShareWith();
         }
     }
 
-    _sharees.append(currentUser);
+    _completerModel->fetch(_ui->shareeLineEdit->text(), blacklist);
 
-    _completerModel = new ShareeModel(_account,
-                                      _ui->shareeLineEdit->text(),
-                                      _isFile ? QLatin1String("file") : QLatin1String("folder"),
-                                      sharees,
-                                      _completer);
-    connect(_completerModel, SIGNAL(shareesReady()), SLOT(slotUpdateCompletion()));
-    _completerModel->fetch();
-    _completer->setModel(_completerModel);
-}
-
-void ShareUserGroupWidget::slotUpdateCompletion()
-{
-    _completer->complete();
 }
 
 void ShareUserGroupWidget::getShares()
@@ -141,6 +150,11 @@ void ShareUserGroupWidget::slotSharesFetched(const QList<QSharedPointer<Share>>
     }
 }
 
+void ShareUserGroupWidget::slotShareesReady()
+{
+    _completer->complete();
+}
+
 void ShareUserGroupWidget::slotCompleterActivated(const QModelIndex & index)
 {
     // The index is an index from the QCompletion model which is itelf a proxy
@@ -150,12 +164,11 @@ void ShareUserGroupWidget::slotCompleterActivated(const QModelIndex & index)
         return;
     }
 
-    _manager->createShare(_sharePath, 
+    _manager->createShare(_sharePath,
                           (Share::ShareType)sharee->type(),
                           sharee->shareWith(),
                           Share::PermissionRead);
 
-    _completer->setModel(NULL);
     _ui->shareeLineEdit->setText(QString());
 }
 
diff --git a/src/gui/shareusergroupwidget.h b/src/gui/shareusergroupwidget.h
index 39dc9ac..fa1bd41 100644
--- a/src/gui/shareusergroupwidget.h
+++ b/src/gui/shareusergroupwidget.h
@@ -22,6 +22,7 @@
 #include <QSharedPointer>
 #include <QList>
 #include <QVector>
+#include <QTimer>
 
 class QCompleter;
 class QModelIndex;
@@ -97,9 +98,10 @@ private slots:
 
     void on_shareeLineEdit_textChanged(const QString &text);
     void on_searchPushButton_clicked();
+    void slotLineEditTextEdited(const QString &text);
 
-    void slotUpdateCompletion();
     void slotCompleterActivated(const QModelIndex & index);
+    void slotShareesReady();
 
 private:
     Ui::ShareUserGroupWidget *_ui;
@@ -109,12 +111,12 @@ private:
 
     QCompleter *_completer;
     ShareeModel *_completerModel;
+    QTimer _completionTimer;
 
     bool _resharingAllowed;
     bool _isFile;
 
     ShareManager *_manager;
-    QVector<QSharedPointer<Sharee>> _sharees;
 };
 
 }

-- 
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