From b72e48cbab53743b80130758b4bdb81e5778a014 Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Fri, 27 Apr 2018 01:57:46 +0300 Subject: Improve room searching fixes #257 --- include/Cache.h | 21 ++++++++++++-- include/QuickSwitcher.h | 18 ++++++++---- include/SuggestionsPopup.hpp | 67 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 90 insertions(+), 16 deletions(-) (limited to 'include') 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 roomsWithStateUpdates(const mtx::responses::Sync &res); @@ -194,9 +207,11 @@ public: return getRoomInfo(roomsWithStateUpdates(sync)); } - QVector getAutocompleteMatches(const std::string &room_id, - const std::string &query, - std::uint8_t max_items = 5); + QVector searchUsers(const std::string &room_id, + const std::string &query, + std::uint8_t max_items = 5); + std::vector 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 #include +#include "Cache.h" +#include "SuggestionsPopup.hpp" #include "TextField.h" +Q_DECLARE_METATYPE(std::vector) + 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 &rooms); +public: + QuickSwitcher(QSharedPointer cache, QWidget *parent = nullptr); signals: void closing(); void roomSelected(const QString &roomid); + void queryResults(const std::vector &rooms); protected: void keyPressEvent(QKeyEvent *event) override; @@ -64,7 +68,9 @@ private: QVBoxLayout *topLayout_; RoomSearchInput *roomSearch_; - QCompleter *completer_; - std::map rooms_; + //! Autocomplete popup box with the room suggestions. + SuggestionsPopup popup_; + //! Cache client for room quering. + QSharedPointer 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 #include +#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 + void selectHoveredSuggestion() + { + const auto item = layout_->itemAt(selectedItem_); + if (!item) + return; + + const auto &widget = qobject_cast(item->widget()); + emit itemSelected( + Cache::displayName(ChatPage::instance()->currentRoom(), widget->selectedText())); + + resetSelection(); + } + public slots: void addUsers(const QVector &users); - void selectHoveredSuggestion(); + void addRooms(const std::vector &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_; -- cgit 1.5.1