summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2021-06-18 14:05:52 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2021-06-25 11:34:18 +0200
commitf349b0cce0335c2c9f6aaabfad9315e80bc72677 (patch)
tree1333a5f67f3ad370102f01b9bda3790e6d61d739
parentFix hiding rooms from a space (diff)
downloadnheko-f349b0cce0335c2c9f6aaabfad9315e80bc72677.tar.xz
Hide spaces by default, unless they are in the current space filter
Diffstat (limited to '')
-rw-r--r--src/timeline/CommunitiesModel.cpp19
-rw-r--r--src/timeline/RoomlistModel.cpp34
-rw-r--r--src/timeline/TimelineModel.cpp4
-rw-r--r--src/timeline/TimelineModel.h9
4 files changed, 59 insertions, 7 deletions
diff --git a/src/timeline/CommunitiesModel.cpp b/src/timeline/CommunitiesModel.cpp
index c66d5949..97bfa76d 100644
--- a/src/timeline/CommunitiesModel.cpp
+++ b/src/timeline/CommunitiesModel.cpp
@@ -167,6 +167,25 @@ CommunitiesModel::sync(const mtx::responses::Rooms &rooms)
                               mtx::events::AccountDataEvent<mtx::events::account_data::Tags>>(e)) {
                                 tagsUpdated = true;
                         }
+                for (const auto &e : room.state.events)
+                        if (std::holds_alternative<
+                              mtx::events::StateEvent<mtx::events::state::space::Child>>(e) ||
+                            std::holds_alternative<
+                              mtx::events::StateEvent<mtx::events::state::space::Parent>>(e)) {
+                                tagsUpdated = true;
+                        }
+                for (const auto &e : room.timeline.events)
+                        if (std::holds_alternative<
+                              mtx::events::StateEvent<mtx::events::state::space::Child>>(e) ||
+                            std::holds_alternative<
+                              mtx::events::StateEvent<mtx::events::state::space::Parent>>(e)) {
+                                tagsUpdated = true;
+                        }
+        }
+        for (const auto &[roomid, room] : rooms.leave) {
+                (void)room;
+                if (spaceOrder_.contains(QString::fromStdString(roomid)))
+                        tagsUpdated = true;
         }
 
         if (tagsUpdated)
diff --git a/src/timeline/RoomlistModel.cpp b/src/timeline/RoomlistModel.cpp
index 0d9ec66b..e4014333 100644
--- a/src/timeline/RoomlistModel.cpp
+++ b/src/timeline/RoomlistModel.cpp
@@ -85,8 +85,9 @@ RoomlistModel::data(const QModelIndex &index, int role) const
                         case Roles::NotificationCount:
                                 return room->notificationCount();
                         case Roles::IsInvite:
-                        case Roles::IsSpace:
                                 return false;
+                        case Roles::IsSpace:
+                                return room->isSpace();
                         case Roles::Tags: {
                                 auto info = cache::singleRoomInfo(roomid.toStdString());
                                 QStringList list;
@@ -429,7 +430,9 @@ enum NotificationImportance : short
         AllEventsRead      = 0,
         NewMessage         = 1,
         NewMentions        = 2,
-        Invite             = 3
+        Invite             = 3,
+        SubSpace           = 4,
+        CurrentSpace       = 5,
 };
 }
 
@@ -439,7 +442,13 @@ FilteredRoomlistModel::calculateImportance(const QModelIndex &idx) const
         // Returns the degree of importance of the unread messages in the room.
         // If sorting by importance is disabled in settings, this only ever
         // returns ImportanceDisabled or Invite
-        if (sourceModel()->data(idx, RoomlistModel::IsInvite).toBool()) {
+        if (sourceModel()->data(idx, RoomlistModel::IsSpace).toBool()) {
+                if (filterType == FilterBy::Space &&
+                    filterStr == sourceModel()->data(idx, RoomlistModel::RoomId).toString())
+                        return CurrentSpace;
+                else
+                        return SubSpace;
+        } else if (sourceModel()->data(idx, RoomlistModel::IsInvite).toBool()) {
                 return Invite;
         } else if (!this->sortByImportance) {
                 return ImportanceDisabled;
@@ -539,6 +548,10 @@ FilteredRoomlistModel::filterAcceptsRow(int sourceRow, const QModelIndex &) cons
                         for (const auto &t : parents)
                                 if (hiddenSpaces.contains(t))
                                         return false;
+                } else if (sourceModel()
+                             ->data(sourceModel()->index(sourceRow, 0), RoomlistModel::IsSpace)
+                             .toBool()) {
+                        return false;
                 }
 
                 return true;
@@ -561,6 +574,10 @@ FilteredRoomlistModel::filterAcceptsRow(int sourceRow, const QModelIndex &) cons
                         for (const auto &t : parents)
                                 if (hiddenSpaces.contains(t))
                                         return false;
+                } else if (sourceModel()
+                             ->data(sourceModel()->index(sourceRow, 0), RoomlistModel::IsSpace)
+                             .toBool()) {
+                        return false;
                 }
                 return true;
         } else if (filterType == FilterBy::Space) {
@@ -572,7 +589,11 @@ FilteredRoomlistModel::filterAcceptsRow(int sourceRow, const QModelIndex &) cons
                               ->data(sourceModel()->index(sourceRow, 0), RoomlistModel::Tags)
                               .toStringList();
 
-                if (!parents.contains(filterStr))
+                if (filterStr == sourceModel()
+                                   ->data(sourceModel()->index(sourceRow, 0), RoomlistModel::RoomId)
+                                   .toString())
+                        return true;
+                else if (!parents.contains(filterStr))
                         return false;
                 else if (!hiddenTags.empty()) {
                         for (const auto &t : tags)
@@ -582,6 +603,11 @@ FilteredRoomlistModel::filterAcceptsRow(int sourceRow, const QModelIndex &) cons
                         for (const auto &t : parents)
                                 if (hiddenSpaces.contains(t))
                                         return false;
+                } else if (sourceModel()
+                             ->data(sourceModel()->index(sourceRow, 0), RoomlistModel::IsSpace)
+                             .toBool() &&
+                           !parents.contains(filterStr)) {
+                        return false;
                 }
                 return true;
         } else {
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 99547b15..1ecb6cdf 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -320,6 +320,10 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
 {
         lastMessage_.timestamp = 0;
 
+        if (auto create =
+              cache::client()->getStateEvent<mtx::events::state::Create>(room_id.toStdString()))
+                this->isSpace_ = create->content.type == mtx::events::state::room_type::space;
+
         connect(
           this,
           &TimelineModel::redactionFailed,
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 3ebbe120..42aa136f 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -161,6 +161,7 @@ class TimelineModel : public QAbstractListModel
         Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged)
         Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY roomAvatarUrlChanged)
         Q_PROPERTY(QString roomTopic READ roomTopic NOTIFY roomTopicChanged)
+        Q_PROPERTY(bool isSpace READ isSpace CONSTANT)
         Q_PROPERTY(InputBar *input READ input CONSTANT)
         Q_PROPERTY(Permissions *permissions READ permissions NOTIFY permissionsChanged)
 
@@ -262,6 +263,7 @@ public:
         RelatedInfo relatedInfo(QString id);
 
         DescInfo lastMessage() const { return lastMessage_; }
+        bool isSpace() const { return isSpace_; }
 
 public slots:
         void setCurrentIndex(int index);
@@ -366,9 +368,6 @@ private:
 
         QString room_id_;
 
-        bool decryptDescription     = true;
-        bool m_paginationInProgress = false;
-
         QString currentId, currentReadId;
         QString reply_, edit_;
         QString textBeforeEdit, replyBeforeEdit;
@@ -388,6 +387,10 @@ private:
         friend struct SendMessageVisitor;
 
         int notification_count = 0, highlight_count = 0;
+
+        bool decryptDescription     = true;
+        bool m_paginationInProgress = false;
+        bool isSpace_               = false;
 };
 
 template<class T>