diff --git a/include/Cache.h b/include/Cache.h
index acad45e2..a3e2c6c1 100644
--- a/include/Cache.h
+++ b/include/Cache.h
@@ -106,6 +106,14 @@ from_json(const json &j, MemberInfo &info)
info.avatar_url = j.at("avatar_url");
}
+struct RoomSearchResult
+{
+ std::string room_id;
+ RoomInfo info;
+ QImage img;
+};
+
+Q_DECLARE_METATYPE(RoomSearchResult)
Q_DECLARE_METATYPE(RoomInfo)
class Cache : public QObject
@@ -185,6 +193,11 @@ public:
UserReceipts readReceipts(const QString &event_id, const QString &room_id);
QByteArray image(const QString &url) const;
+ QByteArray image(lmdb::txn &txn, const std::string &url) const;
+ QByteArray image(const std::string &url) const
+ {
+ return image(QString::fromStdString(url));
+ }
void saveImage(const QString &url, const QByteArray &data);
std::vector<std::string> roomsWithStateUpdates(const mtx::responses::Sync &res);
@@ -194,9 +207,11 @@ public:
return getRoomInfo(roomsWithStateUpdates(sync));
}
- QVector<SearchResult> getAutocompleteMatches(const std::string &room_id,
- const std::string &query,
- std::uint8_t max_items = 5);
+ QVector<SearchResult> searchUsers(const std::string &room_id,
+ const std::string &query,
+ std::uint8_t max_items = 5);
+ std::vector<RoomSearchResult> searchRooms(const std::string &query,
+ std::uint8_t max_items = 5);
private:
//! Save an invited room.
diff --git a/include/QuickSwitcher.h b/include/QuickSwitcher.h
index 01c5e6da..ce0ed00b 100644
--- a/include/QuickSwitcher.h
+++ b/include/QuickSwitcher.h
@@ -22,8 +22,12 @@
#include <QVBoxLayout>
#include <QWidget>
+#include "Cache.h"
+#include "SuggestionsPopup.hpp"
#include "TextField.h"
+Q_DECLARE_METATYPE(std::vector<RoomSearchResult>)
+
class RoomSearchInput : public TextField
{
Q_OBJECT
@@ -38,20 +42,20 @@ signals:
protected:
void keyPressEvent(QKeyEvent *event) override;
void hideEvent(QHideEvent *event) override;
- bool focusNextPrevChild(bool next) override;
+ bool focusNextPrevChild(bool) override { return false; };
};
class QuickSwitcher : public QWidget
{
Q_OBJECT
-public:
- explicit QuickSwitcher(QWidget *parent = nullptr);
- void setRoomList(const std::map<QString, QString> &rooms);
+public:
+ QuickSwitcher(QSharedPointer<Cache> cache, QWidget *parent = nullptr);
signals:
void closing();
void roomSelected(const QString &roomid);
+ void queryResults(const std::vector<RoomSearchResult> &rooms);
protected:
void keyPressEvent(QKeyEvent *event) override;
@@ -64,7 +68,9 @@ private:
QVBoxLayout *topLayout_;
RoomSearchInput *roomSearch_;
- QCompleter *completer_;
- std::map<QString, QString> rooms_;
+ //! Autocomplete popup box with the room suggestions.
+ SuggestionsPopup popup_;
+ //! Cache client for room quering.
+ QSharedPointer<Cache> cache_;
};
diff --git a/include/SuggestionsPopup.hpp b/include/SuggestionsPopup.hpp
index 32964cb3..e949ce7c 100644
--- a/include/SuggestionsPopup.hpp
+++ b/include/SuggestionsPopup.hpp
@@ -5,6 +5,11 @@
#include <QPoint>
#include <QWidget>
+#include "Avatar.h"
+#include "AvatarProvider.h"
+#include "Cache.h"
+#include "ChatPage.h"
+
class Avatar;
struct SearchResult;
@@ -16,9 +21,9 @@ class PopupItem : public QWidget
Q_PROPERTY(bool hovering READ hovering WRITE setHovering)
public:
- PopupItem(QWidget *parent, const QString &user_id);
+ PopupItem(QWidget *parent);
- QString user() const { return user_id_; }
+ QString selectedText() const { return QString(); }
QColor hoverColor() const { return hoverColor_; }
void setHoverColor(QColor &color) { hoverColor_ = color; }
@@ -30,14 +35,12 @@ protected:
void mousePressEvent(QMouseEvent *event) override;
signals:
- void clicked(const QString &display_name);
+ void clicked(const QString &text);
-private:
+protected:
QHBoxLayout *topLayout_;
Avatar *avatar_;
- QLabel *userName_;
- QString user_id_;
QColor hoverColor_;
@@ -45,6 +48,33 @@ private:
bool hovering_;
};
+class UserItem : public PopupItem
+{
+ Q_OBJECT
+
+public:
+ UserItem(QWidget *parent, const QString &user_id);
+ QString selectedText() const { return userId_; }
+
+private:
+ QLabel *userName_;
+ QString userId_;
+};
+
+class RoomItem : public PopupItem
+{
+ Q_OBJECT
+
+public:
+ RoomItem(QWidget *parent, const RoomSearchResult &res);
+ QString selectedText() const { return roomId_; }
+
+private:
+ QLabel *roomName_;
+ QString roomId_;
+ RoomSearchResult info_;
+};
+
class SuggestionsPopup : public QWidget
{
Q_OBJECT
@@ -52,9 +82,24 @@ class SuggestionsPopup : public QWidget
public:
explicit SuggestionsPopup(QWidget *parent = nullptr);
+ template<class Item>
+ void selectHoveredSuggestion()
+ {
+ const auto item = layout_->itemAt(selectedItem_);
+ if (!item)
+ return;
+
+ const auto &widget = qobject_cast<Item *>(item->widget());
+ emit itemSelected(
+ Cache::displayName(ChatPage::instance()->currentRoom(), widget->selectedText()));
+
+ resetSelection();
+ }
+
public slots:
void addUsers(const QVector<SearchResult> &users);
- void selectHoveredSuggestion();
+ void addRooms(const std::vector<RoomSearchResult> &rooms);
+
//! Move to the next available suggestion item.
void selectNextSuggestion();
//! Move to the previous available suggestion item.
@@ -75,6 +120,14 @@ private:
void resetSelection() { selectedItem_ = -1; }
void selectFirstItem() { selectedItem_ = 0; }
void selectLastItem() { selectedItem_ = layout_->count() - 1; }
+ void removeItems()
+ {
+ QLayoutItem *item;
+ while ((item = layout_->takeAt(0)) != 0) {
+ delete item->widget();
+ delete item;
+ }
+ }
QVBoxLayout *layout_;
|