summary refs log tree commit diff
path: root/include
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-04-27 01:57:46 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-04-27 01:57:46 +0300
commitb72e48cbab53743b80130758b4bdb81e5778a014 (patch)
treef281fd56ebad04a258a97e3e51056f77ac6ad700 /include
parentCopy lmdb.dll in the windows installer (diff)
downloadnheko-b72e48cbab53743b80130758b4bdb81e5778a014.tar.xz
Improve room searching
fixes #257
Diffstat (limited to 'include')
-rw-r--r--include/Cache.h21
-rw-r--r--include/QuickSwitcher.h18
-rw-r--r--include/SuggestionsPopup.hpp67
3 files changed, 90 insertions, 16 deletions
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_;