From: allexzander Date: Thu, 3 Dec 2020 18:32:21 +0000 (+0200) Subject: Fixed slow sharee search in the share dialog X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~22^2~22^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=9266ecc2e865271fed873baddcc31c30e55f22e3;p=nextcloud-desktop.git Fixed slow sharee search in the share dialog Signed-off-by: allexzander --- diff --git a/src/gui/ocsshareejob.cpp b/src/gui/ocsshareejob.cpp index ced73800f..206152a6c 100644 --- a/src/gui/ocsshareejob.cpp +++ b/src/gui/ocsshareejob.cpp @@ -28,7 +28,8 @@ OcsShareeJob::OcsShareeJob(AccountPtr account) void OcsShareeJob::getSharees(const QString &search, const QString &itemType, int page, - int perPage) + int perPage, + bool lookup) { setVerb("GET"); @@ -36,6 +37,7 @@ void OcsShareeJob::getSharees(const QString &search, addParam(QString::fromLatin1("itemType"), itemType); addParam(QString::fromLatin1("page"), QString::number(page)); addParam(QString::fromLatin1("perPage"), QString::number(perPage)); + addParam(QString::fromLatin1("lookup"), QVariant(lookup).toString()); start(); } diff --git a/src/gui/ocsshareejob.h b/src/gui/ocsshareejob.h index f511f5fb8..8a21c7dae 100644 --- a/src/gui/ocsshareejob.h +++ b/src/gui/ocsshareejob.h @@ -38,7 +38,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, bool lookup = false); signals: /** * Result of the OCS request diff --git a/src/gui/sharee.cpp b/src/gui/sharee.cpp index a44f0d1b9..c2903f897 100644 --- a/src/gui/sharee.cpp +++ b/src/gui/sharee.cpp @@ -73,14 +73,14 @@ ShareeModel::ShareeModel(const AccountPtr &account, const QString &type, QObject { } -void ShareeModel::fetch(const QString &search, const ShareeSet &blacklist) +void ShareeModel::fetch(const QString &search, const ShareeSet &blacklist, LookupMode lookupMode) { _search = search; _shareeBlacklist = blacklist; auto *job = new OcsShareeJob(_account); connect(job, &OcsShareeJob::shareeJobFinished, this, &ShareeModel::shareesFetched); connect(job, &OcsJob::ocsError, this, &ShareeModel::displayErrorMessage); - job->getSharees(_search, _type, 1, 50); + job->getSharees(_search, _type, 1, 50, lookupMode == GlobalSearch ? true : false); } void ShareeModel::shareesFetched(const QJsonDocument &reply) diff --git a/src/gui/sharee.h b/src/gui/sharee.h index d776360ad..2e69552c8 100644 --- a/src/gui/sharee.h +++ b/src/gui/sharee.h @@ -66,10 +66,15 @@ class ShareeModel : public QAbstractListModel { Q_OBJECT public: + enum LookupMode { + LocalSearch = 0, + GlobalSearch = 1 + }; + explicit ShareeModel(const AccountPtr &account, const QString &type, QObject *parent = nullptr); using ShareeSet = QVector>; // FIXME: make it a QSet when Sharee can be compared - void fetch(const QString &search, const ShareeSet &blacklist); + void fetch(const QString &search, const ShareeSet &blacklist, LookupMode lookupMode); int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role) const override; diff --git a/src/gui/shareusergroupwidget.cpp b/src/gui/shareusergroupwidget.cpp index dc61f4977..0a5ea2531 100644 --- a/src/gui/shareusergroupwidget.cpp +++ b/src/gui/shareusergroupwidget.cpp @@ -24,7 +24,6 @@ #include "capabilities.h" #include "guiutility.h" #include "thumbnailjob.h" -#include "sharee.h" #include "sharemanager.h" #include "theme.h" @@ -85,6 +84,16 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, _completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); _ui->shareeLineEdit->setCompleter(_completer); + auto searchGloballyAction = new QAction(_ui->shareeLineEdit); + searchGloballyAction->setIcon(QIcon(":/client/theme/magnifying-glass.svg")); + searchGloballyAction->setToolTip(tr("Search globally")); + + connect(searchGloballyAction, &QAction::triggered, this, [this]() { + searchForSharees(ShareeModel::GlobalSearch); + }); + + _ui->shareeLineEdit->addAction(searchGloballyAction, QLineEdit::LeadingPosition); + _manager = new ShareManager(_account, this); connect(_manager, &ShareManager::sharesFetched, this, &ShareUserGroupWidget::slotSharesFetched); connect(_manager, &ShareManager::shareCreated, this, &ShareUserGroupWidget::getShares); @@ -104,7 +113,9 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, connect(_ui->shareeLineEdit, &QLineEdit::textEdited, this, &ShareUserGroupWidget::slotLineEditTextEdited, Qt::QueuedConnection); _ui->shareeLineEdit->installEventFilter(this); - connect(&_completionTimer, &QTimer::timeout, this, &ShareUserGroupWidget::searchForSharees); + connect(&_completionTimer, &QTimer::timeout, this, [this]() { + searchForSharees(ShareeModel::LocalSearch); + }); _completionTimer.setSingleShot(true); _completionTimer.setInterval(600); @@ -163,9 +174,13 @@ void ShareUserGroupWidget::slotLineEditReturn() _completionTimer.start(); } - -void ShareUserGroupWidget::searchForSharees() +void ShareUserGroupWidget::searchForSharees(ShareeModel::LookupMode lookupMode) { + if (_ui->shareeLineEdit->text().isEmpty()) { + return; + } + + _ui->shareeLineEdit->setEnabled(false); _completionTimer.stop(); _pi_sharee.startAnimation(); ShareeModel::ShareeSet blacklist; @@ -178,7 +193,7 @@ void ShareUserGroupWidget::searchForSharees() blacklist << sw->share()->getShareWith(); } _ui->errorLabel->hide(); - _completerModel->fetch(_ui->shareeLineEdit->text(), blacklist); + _completerModel->fetch(_ui->shareeLineEdit->text(), blacklist, lookupMode); } void ShareUserGroupWidget::getShares() @@ -246,7 +261,7 @@ void ShareUserGroupWidget::slotSharesFetched(const QList> scrollArea->setWidget(newViewPort); _disableCompleterActivated = false; - _ui->shareeLineEdit->setEnabled(true); + activateShareeLineEdit(); } void ShareUserGroupWidget::slotAdjustScrollWidgetSize() @@ -275,11 +290,14 @@ void ShareUserGroupWidget::slotPrivateLinkShare() void ShareUserGroupWidget::slotShareesReady() { + activateShareeLineEdit(); + _pi_sharee.stopAnimation(); if (_completerModel->rowCount() == 0) { displayError(0, tr("No results for '%1'").arg(_completerModel->currentSearch())); - return; } + + // if no rows are present in the model - complete() will hide the completer _completer->complete(); } @@ -349,7 +367,7 @@ void ShareUserGroupWidget::displayError(int code, const QString &message) qCWarning(lcSharing) << "Sharing error from server" << code << message; _ui->errorLabel->setText(message); _ui->errorLabel->show(); - _ui->shareeLineEdit->setEnabled(true); + activateShareeLineEdit(); } void ShareUserGroupWidget::slotPrivateLinkOpenBrowser() @@ -389,6 +407,12 @@ void ShareUserGroupWidget::customizeStyle() } } +void ShareUserGroupWidget::activateShareeLineEdit() +{ + _ui->shareeLineEdit->setEnabled(true); + _ui->shareeLineEdit->setFocus(); +} + ShareUserLine::ShareUserLine(QSharedPointer share, SharePermissions maxSharingPermissions, bool isFile, diff --git a/src/gui/shareusergroupwidget.h b/src/gui/shareusergroupwidget.h index 3e0a99bb0..fe45d1e36 100644 --- a/src/gui/shareusergroupwidget.h +++ b/src/gui/shareusergroupwidget.h @@ -17,6 +17,7 @@ #include "accountfwd.h" #include "sharepermissions.h" +#include "sharee.h" #include "QProgressIndicator.h" #include #include @@ -40,9 +41,7 @@ namespace Ui { class AbstractCredentials; class SyncResult; class Share; -class Sharee; class ShareManager; -class ShareeModel; /** * @brief The ShareDialog (user/group) class @@ -73,7 +72,7 @@ private slots: void slotSharesFetched(const QList> &shares); void on_shareeLineEdit_textChanged(const QString &text); - void searchForSharees(); + void searchForSharees(ShareeModel::LookupMode lookupMode); void slotLineEditTextEdited(const QString &text); void slotLineEditReturn(); @@ -91,6 +90,8 @@ private slots: private: void customizeStyle(); + void activateShareeLineEdit(); + Ui::ShareUserGroupWidget *_ui; QScrollArea *_parentScrollArea; AccountPtr _account; diff --git a/theme.qrc b/theme.qrc index df1756d35..4ae68807b 100644 --- a/theme.qrc +++ b/theme.qrc @@ -163,5 +163,6 @@ theme/add.svg theme/share.svg theme/reply.svg + theme/magnifying-glass.svg diff --git a/theme/magnifying-glass.svg b/theme/magnifying-glass.svg new file mode 100644 index 000000000..1e44ac175 --- /dev/null +++ b/theme/magnifying-glass.svg @@ -0,0 +1 @@ +