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<RoomlistModel>(
"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<RoomlistModel>(
"im.nheko", 1, 0, "Communities", [](QQmlEngine *, QJSEngine *) -> QObject * {
|