1
0
mirror of https://github.com/chylex/Nextcloud-Desktop.git synced 2025-05-03 05:34:11 +02:00

Fixed slow sharee search in the share dialog

Signed-off-by: allexzander <blackslayer4@gmail.com>
This commit is contained in:
allexzander 2020-12-03 20:32:21 +02:00 committed by allexzander (Rebase PR Action)
parent 14105d4ec6
commit 9266ecc2e8
8 changed files with 50 additions and 16 deletions

View File

@ -28,7 +28,8 @@ OcsShareeJob::OcsShareeJob(AccountPtr account)
void OcsShareeJob::getSharees(const QString &search, void OcsShareeJob::getSharees(const QString &search,
const QString &itemType, const QString &itemType,
int page, int page,
int perPage) int perPage,
bool lookup)
{ {
setVerb("GET"); setVerb("GET");
@ -36,6 +37,7 @@ void OcsShareeJob::getSharees(const QString &search,
addParam(QString::fromLatin1("itemType"), itemType); addParam(QString::fromLatin1("itemType"), itemType);
addParam(QString::fromLatin1("page"), QString::number(page)); addParam(QString::fromLatin1("page"), QString::number(page));
addParam(QString::fromLatin1("perPage"), QString::number(perPage)); addParam(QString::fromLatin1("perPage"), QString::number(perPage));
addParam(QString::fromLatin1("lookup"), QVariant(lookup).toString());
start(); start();
} }

View File

@ -38,7 +38,7 @@ public:
* *
* @param path Path to request shares for (default all shares) * @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: signals:
/** /**
* Result of the OCS request * Result of the OCS request

View File

@ -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; _search = search;
_shareeBlacklist = blacklist; _shareeBlacklist = blacklist;
auto *job = new OcsShareeJob(_account); auto *job = new OcsShareeJob(_account);
connect(job, &OcsShareeJob::shareeJobFinished, this, &ShareeModel::shareesFetched); connect(job, &OcsShareeJob::shareeJobFinished, this, &ShareeModel::shareesFetched);
connect(job, &OcsJob::ocsError, this, &ShareeModel::displayErrorMessage); 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) void ShareeModel::shareesFetched(const QJsonDocument &reply)

View File

@ -66,10 +66,15 @@ class ShareeModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
public: public:
enum LookupMode {
LocalSearch = 0,
GlobalSearch = 1
};
explicit ShareeModel(const AccountPtr &account, const QString &type, QObject *parent = nullptr); explicit ShareeModel(const AccountPtr &account, const QString &type, QObject *parent = nullptr);
using ShareeSet = QVector<QSharedPointer<Sharee>>; // FIXME: make it a QSet<Sharee> when Sharee can be compared using ShareeSet = QVector<QSharedPointer<Sharee>>; // FIXME: make it a QSet<Sharee> 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; int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role) const override; QVariant data(const QModelIndex &index, int role) const override;

View File

@ -24,7 +24,6 @@
#include "capabilities.h" #include "capabilities.h"
#include "guiutility.h" #include "guiutility.h"
#include "thumbnailjob.h" #include "thumbnailjob.h"
#include "sharee.h"
#include "sharemanager.h" #include "sharemanager.h"
#include "theme.h" #include "theme.h"
@ -85,6 +84,16 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account,
_completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); _completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
_ui->shareeLineEdit->setCompleter(_completer); _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); _manager = new ShareManager(_account, this);
connect(_manager, &ShareManager::sharesFetched, this, &ShareUserGroupWidget::slotSharesFetched); connect(_manager, &ShareManager::sharesFetched, this, &ShareUserGroupWidget::slotSharesFetched);
connect(_manager, &ShareManager::shareCreated, this, &ShareUserGroupWidget::getShares); connect(_manager, &ShareManager::shareCreated, this, &ShareUserGroupWidget::getShares);
@ -104,7 +113,9 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account,
connect(_ui->shareeLineEdit, &QLineEdit::textEdited, connect(_ui->shareeLineEdit, &QLineEdit::textEdited,
this, &ShareUserGroupWidget::slotLineEditTextEdited, Qt::QueuedConnection); this, &ShareUserGroupWidget::slotLineEditTextEdited, Qt::QueuedConnection);
_ui->shareeLineEdit->installEventFilter(this); _ui->shareeLineEdit->installEventFilter(this);
connect(&_completionTimer, &QTimer::timeout, this, &ShareUserGroupWidget::searchForSharees); connect(&_completionTimer, &QTimer::timeout, this, [this]() {
searchForSharees(ShareeModel::LocalSearch);
});
_completionTimer.setSingleShot(true); _completionTimer.setSingleShot(true);
_completionTimer.setInterval(600); _completionTimer.setInterval(600);
@ -163,9 +174,13 @@ void ShareUserGroupWidget::slotLineEditReturn()
_completionTimer.start(); _completionTimer.start();
} }
void ShareUserGroupWidget::searchForSharees(ShareeModel::LookupMode lookupMode)
void ShareUserGroupWidget::searchForSharees()
{ {
if (_ui->shareeLineEdit->text().isEmpty()) {
return;
}
_ui->shareeLineEdit->setEnabled(false);
_completionTimer.stop(); _completionTimer.stop();
_pi_sharee.startAnimation(); _pi_sharee.startAnimation();
ShareeModel::ShareeSet blacklist; ShareeModel::ShareeSet blacklist;
@ -178,7 +193,7 @@ void ShareUserGroupWidget::searchForSharees()
blacklist << sw->share()->getShareWith(); blacklist << sw->share()->getShareWith();
} }
_ui->errorLabel->hide(); _ui->errorLabel->hide();
_completerModel->fetch(_ui->shareeLineEdit->text(), blacklist); _completerModel->fetch(_ui->shareeLineEdit->text(), blacklist, lookupMode);
} }
void ShareUserGroupWidget::getShares() void ShareUserGroupWidget::getShares()
@ -246,7 +261,7 @@ void ShareUserGroupWidget::slotSharesFetched(const QList<QSharedPointer<Share>>
scrollArea->setWidget(newViewPort); scrollArea->setWidget(newViewPort);
_disableCompleterActivated = false; _disableCompleterActivated = false;
_ui->shareeLineEdit->setEnabled(true); activateShareeLineEdit();
} }
void ShareUserGroupWidget::slotAdjustScrollWidgetSize() void ShareUserGroupWidget::slotAdjustScrollWidgetSize()
@ -275,11 +290,14 @@ void ShareUserGroupWidget::slotPrivateLinkShare()
void ShareUserGroupWidget::slotShareesReady() void ShareUserGroupWidget::slotShareesReady()
{ {
activateShareeLineEdit();
_pi_sharee.stopAnimation(); _pi_sharee.stopAnimation();
if (_completerModel->rowCount() == 0) { if (_completerModel->rowCount() == 0) {
displayError(0, tr("No results for '%1'").arg(_completerModel->currentSearch())); 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(); _completer->complete();
} }
@ -349,7 +367,7 @@ void ShareUserGroupWidget::displayError(int code, const QString &message)
qCWarning(lcSharing) << "Sharing error from server" << code << message; qCWarning(lcSharing) << "Sharing error from server" << code << message;
_ui->errorLabel->setText(message); _ui->errorLabel->setText(message);
_ui->errorLabel->show(); _ui->errorLabel->show();
_ui->shareeLineEdit->setEnabled(true); activateShareeLineEdit();
} }
void ShareUserGroupWidget::slotPrivateLinkOpenBrowser() void ShareUserGroupWidget::slotPrivateLinkOpenBrowser()
@ -389,6 +407,12 @@ void ShareUserGroupWidget::customizeStyle()
} }
} }
void ShareUserGroupWidget::activateShareeLineEdit()
{
_ui->shareeLineEdit->setEnabled(true);
_ui->shareeLineEdit->setFocus();
}
ShareUserLine::ShareUserLine(QSharedPointer<Share> share, ShareUserLine::ShareUserLine(QSharedPointer<Share> share,
SharePermissions maxSharingPermissions, SharePermissions maxSharingPermissions,
bool isFile, bool isFile,

View File

@ -17,6 +17,7 @@
#include "accountfwd.h" #include "accountfwd.h"
#include "sharepermissions.h" #include "sharepermissions.h"
#include "sharee.h"
#include "QProgressIndicator.h" #include "QProgressIndicator.h"
#include <QDialog> #include <QDialog>
#include <QWidget> #include <QWidget>
@ -40,9 +41,7 @@ namespace Ui {
class AbstractCredentials; class AbstractCredentials;
class SyncResult; class SyncResult;
class Share; class Share;
class Sharee;
class ShareManager; class ShareManager;
class ShareeModel;
/** /**
* @brief The ShareDialog (user/group) class * @brief The ShareDialog (user/group) class
@ -73,7 +72,7 @@ private slots:
void slotSharesFetched(const QList<QSharedPointer<Share>> &shares); void slotSharesFetched(const QList<QSharedPointer<Share>> &shares);
void on_shareeLineEdit_textChanged(const QString &text); void on_shareeLineEdit_textChanged(const QString &text);
void searchForSharees(); void searchForSharees(ShareeModel::LookupMode lookupMode);
void slotLineEditTextEdited(const QString &text); void slotLineEditTextEdited(const QString &text);
void slotLineEditReturn(); void slotLineEditReturn();
@ -91,6 +90,8 @@ private slots:
private: private:
void customizeStyle(); void customizeStyle();
void activateShareeLineEdit();
Ui::ShareUserGroupWidget *_ui; Ui::ShareUserGroupWidget *_ui;
QScrollArea *_parentScrollArea; QScrollArea *_parentScrollArea;
AccountPtr _account; AccountPtr _account;

View File

@ -163,5 +163,6 @@
<file>theme/add.svg</file> <file>theme/add.svg</file>
<file>theme/share.svg</file> <file>theme/share.svg</file>
<file>theme/reply.svg</file> <file>theme/reply.svg</file>
<file>theme/magnifying-glass.svg</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 16 16" height="16" width="16"><g stroke="#000" stroke-width="2" fill="none"><ellipse rx="4" ry="4" cy="6" cx="6"/><path d="m14.3 14.25-5.65-5.65" fill="#fff"/></g></svg>

After

(image error) Size: 237 B