Show thread root event instead of latest thread event

This commit is contained in:
Azhar Momin
2026-02-17 19:36:47 +05:30
committed by Joshua Goins
parent b42a82a455
commit 2d33cbf6b1
2 changed files with 28 additions and 7 deletions

View File

@@ -183,6 +183,12 @@ QVariant MessageModel::data(const QModelIndex &idx, int role) const
if (event.value().get().contentJson().contains("m.new_content"_L1)) { if (event.value().get().contentJson().contains("m.new_content"_L1)) {
return EventStatus::Hidden; return EventStatus::Hidden;
} }
// A threaded event will be merged into the thread root event so
// also don't show.
const auto roomMessageEvent = eventCast<const RoomMessageEvent>(&event.value().get());
if (roomMessageEvent && roomMessageEvent->relatesTo() && roomMessageEvent->relatesTo()->type == EventRelation::ThreadType) {
return EventStatus::Hidden;
}
const auto pendingIt = eventRoom->findPendingEvent(event->get().transactionId()); const auto pendingIt = eventRoom->findPendingEvent(event->get().transactionId());
if (pendingIt == eventRoom->pendingEvents().end()) { if (pendingIt == eventRoom->pendingEvents().end()) {
return EventStatus::Hidden; return EventStatus::Hidden;
@@ -194,12 +200,9 @@ QVariant MessageModel::data(const QModelIndex &idx, int role) const
return EventStatus::Hidden; return EventStatus::Hidden;
} }
auto roomMessageEvent = eventCast<const RoomMessageEvent>(&event.value().get()); const auto roomMessageEvent = eventCast<const RoomMessageEvent>(&event.value().get());
if (roomMessageEvent && (roomMessageEvent->isThreaded() || eventRoom->threads().contains(event.value().get().id()))) { if (roomMessageEvent && roomMessageEvent->relatesTo() && roomMessageEvent->relatesTo()->type == EventRelation::ThreadType) {
const auto &thread = eventRoom->threads().value(roomMessageEvent->isThreaded() ? roomMessageEvent->threadRootEventId() : event.value().get().id()); return EventStatus::Hidden;
if (thread.latestEventId != event.value().get().id()) {
return EventStatus::Hidden;
}
} }
return EventStatus::Normal; return EventStatus::Normal;
} }
@@ -227,7 +230,7 @@ QVariant MessageModel::data(const QModelIndex &idx, int role) const
if (role == IsThreadedRole) { if (role == IsThreadedRole) {
if (auto roomMessageEvent = eventCast<const RoomMessageEvent>(&event.value().get())) { if (auto roomMessageEvent = eventCast<const RoomMessageEvent>(&event.value().get())) {
return roomMessageEvent->isThreaded(); return roomMessageEvent->isThreaded() || eventRoom->threads().contains(event->get().id());
} }
return {}; return {};
} }
@@ -236,6 +239,8 @@ QVariant MessageModel::data(const QModelIndex &idx, int role) const
auto roomMessageEvent = eventCast<const RoomMessageEvent>(&event.value().get()); auto roomMessageEvent = eventCast<const RoomMessageEvent>(&event.value().get());
if (roomMessageEvent && roomMessageEvent->isThreaded()) { if (roomMessageEvent && roomMessageEvent->isThreaded()) {
return roomMessageEvent->threadRootEventId(); return roomMessageEvent->threadRootEventId();
} else if (eventRoom->threads().contains(event->get().id())) {
return event->get().id();
} }
return {}; return {};
} }

View File

@@ -6,6 +6,7 @@
#include "messagemodel_logging.h" #include "messagemodel_logging.h"
#include <Quotient/events/reactionevent.h> #include <Quotient/events/reactionevent.h>
#include <Quotient/thread.h>
using namespace Quotient; using namespace Quotient;
@@ -125,6 +126,21 @@ void TimelineMessageModel::connectNewRoom()
} }
} }
}); });
#if Quotient_VERSION_MINOR > 9
connect(m_room, &Room::newThread, this, [this](const QString &threadRootId) {
if (threadRootId.isEmpty()) {
return;
}
refreshEventRoles(threadRootId, {IsThreadedRole, ThreadRootRole});
});
#elif Quotient_VERSION_MINOR == 9 && Quotient_VERSION_PATCH >= 4
connect(m_room, &Room::newThread, this, [this](const Thread &newThread) {
if (newThread.threadRootId.isEmpty()) {
return;
}
refreshEventRoles(newThread.threadRootId, {IsThreadedRole, ThreadRootRole});
});
#endif
connect(m_room->connection(), &Connection::ignoredUsersListChanged, this, [this] { connect(m_room->connection(), &Connection::ignoredUsersListChanged, this, [this] {
beginResetModel(); beginResetModel();
endResetModel(); endResetModel();