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<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; 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<QSharedPointer<Share>> 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> 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 <QDialog> #include <QWidget> @@ -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<QSharedPointer<Share>> &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 @@ <file>theme/add.svg</file> <file>theme/share.svg</file> <file>theme/reply.svg</file> + <file>theme/magnifying-glass.svg</file> </qresource> </RCC> 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 @@ +<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>