diff --git a/src/Utils.cpp b/src/Utils.cpp
index aa36d3d9..3a90bd50 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -882,16 +882,20 @@ utils::markRoomAsDirect(QString roomid, std::vector<RoomMember> members)
});
}
-int
+QPair<int, int>
utils::getChildNotificationsForSpace(const QString &spaceId)
{
auto children = cache::getRoomInfo(cache::client()->getChildRoomIds(spaceId.toStdString()));
- int total{0};
+ QPair<int, int> retVal;
for (const auto &[childId, child] : children) {
- if (child.is_space)
- total += utils::getChildNotificationsForSpace(childId);
- else
- total += child.notification_count;
+ if (child.is_space) {
+ auto temp{utils::getChildNotificationsForSpace(childId)};
+ retVal.first += temp.first;
+ retVal.second += temp.second;
+ } else {
+ retVal.first += child.notification_count;
+ retVal.second += child.highlight_count;
+ }
}
- return total;
+ return retVal;
}
diff --git a/src/Utils.h b/src/Utils.h
index c20544f2..bdd56d55 100644
--- a/src/Utils.h
+++ b/src/Utils.h
@@ -312,6 +312,8 @@ removeDirectFromRoom(QString roomid);
void
markRoomAsDirect(QString roomid, std::vector<RoomMember> members);
-int
+//! Returns a pair of integers representing the unread notifications in a space and how many of them
+//! are loud notifications, respectively.
+QPair<int, int>
getChildNotificationsForSpace(const QString &spaceId);
}
diff --git a/src/timeline/CommunitiesModel.cpp b/src/timeline/CommunitiesModel.cpp
index 724a6e60..ccc0adfe 100644
--- a/src/timeline/CommunitiesModel.cpp
+++ b/src/timeline/CommunitiesModel.cpp
@@ -37,6 +37,7 @@ CommunitiesModel::roleNames() const
{Depth, "depth"},
{Id, "id"},
{UnreadMessages, "unreadMessages"},
+ {HasLoudNotification, "hasLoudNotification"},
};
}
@@ -80,6 +81,7 @@ CommunitiesModel::data(const QModelIndex &index, int role) const
case CommunitiesModel::Roles::Id:
return "";
case CommunitiesModel::Roles::UnreadMessages:
+ case CommunitiesModel::Roles::HasLoudNotification:
return 0;
}
} else if (index.row() == 1) {
@@ -103,6 +105,7 @@ CommunitiesModel::data(const QModelIndex &index, int role) const
case CommunitiesModel::Roles::Id:
return "dm";
case CommunitiesModel::Roles::UnreadMessages:
+ case CommunitiesModel::Roles::HasLoudNotification:
return 0;
}
} else if (index.row() - 2 < spaceOrder_.size()) {
@@ -132,7 +135,9 @@ CommunitiesModel::data(const QModelIndex &index, int role) const
case CommunitiesModel::Roles::Id:
return "space:" + id;
case CommunitiesModel::Roles::UnreadMessages:
- return utils::getChildNotificationsForSpace(id);
+ return utils::getChildNotificationsForSpace(id).first;
+ case CommunitiesModel::Roles::HasLoudNotification:
+ return utils::getChildNotificationsForSpace(id).second > 0;
}
} else if (index.row() - 2 < tags_.size() + spaceOrder_.size()) {
auto tag = tags_.at(index.row() - 2 - spaceOrder_.size());
@@ -187,6 +192,7 @@ CommunitiesModel::data(const QModelIndex &index, int role) const
case CommunitiesModel::Roles::Id:
return "tag:" + tag;
case CommunitiesModel::Roles::UnreadMessages:
+ case CommunitiesModel::Roles::HasLoudNotification:
return 0;
}
}
diff --git a/src/timeline/CommunitiesModel.h b/src/timeline/CommunitiesModel.h
index b29a5385..7be98939 100644
--- a/src/timeline/CommunitiesModel.h
+++ b/src/timeline/CommunitiesModel.h
@@ -49,6 +49,7 @@ public:
Depth,
Id,
UnreadMessages,
+ HasLoudNotification,
};
struct FlatTree
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 308d358b..1a9f957b 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -355,8 +355,9 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
auto roomInfo = cache::singleRoomInfo(room_id_.toStdString());
this->isSpace_ = roomInfo.is_space;
this->notification_count =
- isSpace_ ? utils::getChildNotificationsForSpace(room_id_) : roomInfo.notification_count;
- this->highlight_count = roomInfo.highlight_count;
+ isSpace_ ? utils::getChildNotificationsForSpace(room_id_).first : roomInfo.notification_count;
+ this->highlight_count =
+ isSpace_ ? utils::getChildNotificationsForSpace(room_id_).second : roomInfo.highlight_count;
lastMessage_.timestamp = roomInfo.approximate_last_modification_ts;
// this connection will simplify adding the plainRoomNameChanged() signal everywhere that it
@@ -365,7 +366,9 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
if (isSpace_)
connect(ChatPage::instance(), &ChatPage::unreadMessages, this, [this](int) {
- notification_count = utils::getChildNotificationsForSpace(room_id_);
+ auto temp{utils::getChildNotificationsForSpace(room_id_)};
+ notification_count = temp.first;
+ highlight_count = temp.second;
emit notificationsChanged();
});
|