diff --git a/resources/qml/Avatar.qml b/resources/qml/Avatar.qml index 9eb3380e..6c12952a 100644 --- a/resources/qml/Avatar.qml +++ b/resources/qml/Avatar.qml @@ -28,6 +28,7 @@ Rectangle { Label { id: label + anchors.fill: parent text: TimelineManager.escapeEmoji(displayName ? String.fromCodePoint(displayName.codePointAt(0)) : "") textFormat: Text.RichText diff --git a/resources/qml/ChatPage.qml b/resources/qml/ChatPage.qml index 5ccdd9f1..6cd48788 100644 --- a/resources/qml/ChatPage.qml +++ b/resources/qml/ChatPage.qml @@ -24,12 +24,13 @@ Rectangle { id: communityListC minimumWidth: communitiesList.avatarSize * 4 + Nheko.paddingMedium * 2 - collapsedWidth: communitiesList.avatarSize + 2* Nheko.paddingMedium + collapsedWidth: communitiesList.avatarSize + 2 * Nheko.paddingMedium preferredWidth: collapsedWidth - maximumWidth: communitiesList.avatarSize * 10 + 2* Nheko.paddingMedium + maximumWidth: communitiesList.avatarSize * 10 + 2 * Nheko.paddingMedium CommunitiesList { id: communitiesList + collapsed: parent.collapsed } diff --git a/resources/qml/CommunitiesList.qml b/resources/qml/CommunitiesList.qml index 6ca619c4..0ccd7e82 100644 --- a/resources/qml/CommunitiesList.qml +++ b/resources/qml/CommunitiesList.qml @@ -10,7 +10,6 @@ import QtQuick.Controls 2.13 import QtQuick.Layouts 1.3 import im.nheko 1.0 - Page { //leftPadding: Nheko.paddingSmall //rightPadding: Nheko.paddingSmall @@ -97,8 +96,7 @@ Page { TapHandler { margin: -Nheko.paddingSmall acceptedButtons: Qt.RightButton - onSingleTapped: communityContextMenu.show(model.id); - + onSingleTapped: communityContextMenu.show(model.id) gesturePolicy: TapHandler.ReleaseWithinBounds } @@ -127,15 +125,26 @@ Page { height: avatarSize width: avatarSize url: { - if (model.avatarUrl.startsWith("mxc://")) { - return model.avatarUrl.replace("mxc://", "image://MxcImage/") - } else { - return "image://colorimage/"+model.avatarUrl+"?" + communityItem.unimportantText - } + if (model.avatarUrl.startsWith("mxc://")) + return model.avatarUrl.replace("mxc://", "image://MxcImage/"); + else + return "image://colorimage/" + model.avatarUrl + "?" + communityItem.unimportantText; } displayName: model.displayName color: communityItem.background + } + ElidedLabel { + visible: !collapsed + Layout.alignment: Qt.AlignVCenter + color: communityItem.importantText + elideWidth: parent.width - avatar.width - Nheko.paddingMedium + fullText: model.displayName + textFormat: Text.PlainText + } + + Item { + Layout.fillWidth: true } } diff --git a/src/timeline/CommunitiesModel.cpp b/src/timeline/CommunitiesModel.cpp index c8ebaa96..9b758e97 100644 --- a/src/timeline/CommunitiesModel.cpp +++ b/src/timeline/CommunitiesModel.cpp @@ -118,6 +118,7 @@ CommunitiesModel::clear() beginResetModel(); tags_.clear(); endResetModel(); + resetCurrentTagId(); emit tagsChanged(); } @@ -148,12 +149,12 @@ CommunitiesModel::setCurrentTagId(QString tagId) for (const auto &t : tags_) { if (t == tag) { this->currentTagId_ = tagId; - emit currentTagIdChanged(); + emit currentTagIdChanged(currentTagId_); return; } } } this->currentTagId_ = ""; - emit currentTagIdChanged(); + emit currentTagIdChanged(currentTagId_); } diff --git a/src/timeline/CommunitiesModel.h b/src/timeline/CommunitiesModel.h index 3f6a2a4c..038c253b 100644 --- a/src/timeline/CommunitiesModel.h +++ b/src/timeline/CommunitiesModel.h @@ -46,12 +46,12 @@ public slots: void resetCurrentTagId() { currentTagId_.clear(); - emit currentTagIdChanged(); + emit currentTagIdChanged(currentTagId_); } QStringList tags() const { return tags_; } signals: - void currentTagIdChanged(); + void currentTagIdChanged(QString tagId); void tagsChanged(); private: diff --git a/src/timeline/RoomlistModel.cpp b/src/timeline/RoomlistModel.cpp index 4dd44b30..c0fb74a4 100644 --- a/src/timeline/RoomlistModel.cpp +++ b/src/timeline/RoomlistModel.cpp @@ -324,6 +324,7 @@ RoomlistModel::initializeRooms() models.clear(); roomids.clear(); invites.clear(); + currentRoom_ = nullptr; invites = cache::client()->invites(); for (const auto &id : invites.keys()) @@ -461,6 +462,22 @@ FilteredRoomlistModel::lessThan(const QModelIndex &left, const QModelIndex &righ return left.row() < right.row(); } +bool +FilteredRoomlistModel::filterAcceptsRow(int sourceRow, const QModelIndex &) const +{ + if (filterType == FilterBy::Nothing) + return true; + else if (filterType == FilterBy::Tag) { + auto tags = sourceModel() + ->data(sourceModel()->index(sourceRow, 0), RoomlistModel::Tags) + .toStringList(); + + return tags.contains(filterStr); + } else { + return true; + } +} + FilteredRoomlistModel::FilteredRoomlistModel(RoomlistModel *model, QObject *parent) : QSortFilterProxyModel(parent) , roomlistmodel(model) diff --git a/src/timeline/RoomlistModel.h b/src/timeline/RoomlistModel.h index 7ee0419f..b89c9a54 100644 --- a/src/timeline/RoomlistModel.h +++ b/src/timeline/RoomlistModel.h @@ -109,6 +109,7 @@ class FilteredRoomlistModel : public QSortFilterProxyModel public: FilteredRoomlistModel(RoomlistModel *model, QObject *parent = nullptr); bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; + bool filterAcceptsRow(int sourceRow, const QModelIndex &) const override; public slots: int roomidToIndex(QString roomid) @@ -128,6 +129,19 @@ public slots: void nextRoom(); void previousRoom(); + void updateFilterTag(QString tagId) + { + if (tagId.startsWith("tag:")) { + filterType = FilterBy::Tag; + filterStr = tagId.mid(4); + } else { + filterType = FilterBy::Nothing; + filterStr.clear(); + } + + invalidateFilter(); + } + signals: void currentRoomChanged(); @@ -135,4 +149,13 @@ private: short int calculateImportance(const QModelIndex &idx) const; RoomlistModel *roomlistmodel; bool sortByImportance = true; + + enum class FilterBy + { + Tag, + Space, + Nothing, + }; + QString filterStr = ""; + FilterBy filterType = FilterBy::Nothing; }; diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index faf56b85..2ee79d4f 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -195,7 +195,13 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par }); qmlRegisterSingletonType( "im.nheko", 1, 0, "Rooms", [](QQmlEngine *, QJSEngine *) -> QObject * { - return new FilteredRoomlistModel(self->rooms_); + auto ptr = new FilteredRoomlistModel(self->rooms_); + + connect(self->communities_, + &CommunitiesModel::currentTagIdChanged, + ptr, + &FilteredRoomlistModel::updateFilterTag); + return ptr; }); qmlRegisterSingletonType( "im.nheko", 1, 0, "Communities", [](QQmlEngine *, QJSEngine *) -> QObject * {