Rework event handler to be just a series of static helper functions

- Clear out unused functions
- All functions are now static

This is because we pretty much always used it in the form:
```
EventHandler eventHandler(room, event);
eventHandler.function();
```
This simplifies it all to a single call.
This commit is contained in:
James Graham
2024-08-23 14:30:03 +00:00
parent 32fd62c484
commit cd867ea581
15 changed files with 377 additions and 640 deletions

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
#include "messagecontentmodel.h"
#include "eventhandler.h"
#include "neochatconfig.h"
#include <QImageReader>
@@ -228,7 +229,6 @@ QVariant MessageContentModel::data(const QModelIndex &index, int role) const
return {};
}
EventHandler eventHandler(m_room, m_event.get());
const auto component = m_components[index.row()];
if (role == DisplayRole) {
@@ -246,7 +246,7 @@ QVariant MessageContentModel::data(const QModelIndex &index, int role) const
if (!component.content.isEmpty()) {
return component.content;
}
return eventHandler.getRichBody();
return EventHandler::richBody(m_room, m_event.get());
}
if (role == ComponentTypeRole) {
return component.type;
@@ -255,7 +255,7 @@ QVariant MessageContentModel::data(const QModelIndex &index, int role) const
return component.attributes;
}
if (role == EventIdRole) {
return eventHandler.getId();
return EventHandler::id(m_event.get());
}
if (role == TimeRole) {
const auto pendingIt = std::find_if(m_room->pendingEvents().cbegin(), m_room->pendingEvents().cend(), [this](const PendingEventItem &pendingEvent) {
@@ -263,7 +263,7 @@ QVariant MessageContentModel::data(const QModelIndex &index, int role) const
});
auto lastUpdated = pendingIt == m_room->pendingEvents().cend() ? QDateTime() : pendingIt->lastUpdated();
return eventHandler.getTime(m_isPending, lastUpdated);
return EventHandler::time(m_event.get(), m_isPending, lastUpdated);
}
if (role == TimeStringRole) {
const auto pendingIt = std::find_if(m_room->pendingEvents().cbegin(), m_room->pendingEvents().cend(), [this](const PendingEventItem &pendingEvent) {
@@ -271,13 +271,13 @@ QVariant MessageContentModel::data(const QModelIndex &index, int role) const
});
auto lastUpdated = pendingIt == m_room->pendingEvents().cend() ? QDateTime() : pendingIt->lastUpdated();
return eventHandler.getTimeString(QStringLiteral("hh:mm"), m_isPending, lastUpdated);
return EventHandler::timeString(m_event.get(), QStringLiteral("hh:mm"), m_isPending, lastUpdated);
}
if (role == AuthorRole) {
return QVariant::fromValue<NeochatRoomMember *>(m_eventSenderObject.get());
}
if (role == MediaInfoRole) {
return eventHandler.getMediaInfo();
return EventHandler::mediaInfo(m_room, m_event.get());
}
if (role == FileTransferInfoRole) {
return QVariant::fromValue(m_room->cachedFileTransferInfo(m_event.get()));
@@ -286,25 +286,22 @@ QVariant MessageContentModel::data(const QModelIndex &index, int role) const
return QVariant::fromValue<ItineraryModel *>(m_itineraryModel);
}
if (role == LatitudeRole) {
return eventHandler.getLatitude();
return EventHandler::latitude(m_event.get());
}
if (role == LongitudeRole) {
return eventHandler.getLongitude();
return EventHandler::longitude(m_event.get());
}
if (role == AssetRole) {
return eventHandler.getLocationAssetType();
return EventHandler::locationAssetType(m_event.get());
}
if (role == PollHandlerRole) {
return QVariant::fromValue<PollHandler *>(m_room->poll(m_eventId));
}
if (role == IsReplyRole) {
return eventHandler.hasReply();
}
if (role == ReplyEventIdRole) {
return eventHandler.getReplyId();
return EventHandler::replyId(m_event.get());
}
if (role == ReplyAuthorRole) {
return QVariant::fromValue(eventHandler.getReplyAuthor());
return QVariant::fromValue(EventHandler::replyAuthor(m_room, m_event.get()));
}
if (role == ReplyContentModelRole) {
return QVariant::fromValue<MessageContentModel *>(m_replyModel);
@@ -344,7 +341,6 @@ QHash<int, QByteArray> MessageContentModel::roleNames() const
roles[LongitudeRole] = "longitude";
roles[AssetRole] = "asset";
roles[PollHandlerRole] = "pollHandler";
roles[IsReplyRole] = "isReply";
roles[ReplyEventIdRole] = "replyEventId";
roles[ReplyAuthorRole] = "replyAuthor";
roles[ReplyContentModelRole] = "replyContentModel";
@@ -411,8 +407,7 @@ QList<MessageComponent> MessageContentModel::messageContentComponents(bool isEdi
if (isEditing) {
newComponents += MessageComponent{MessageComponentType::Edit, QString(), {}};
} else {
EventHandler eventHandler(m_room, m_event.get());
newComponents.append(componentsForType(eventHandler.messageComponentType()));
newComponents.append(componentsForType(MessageComponentType::typeForEvent(*m_event.get())));
}
if (m_room->urlPreviewEnabled()) {
@@ -428,8 +423,7 @@ void MessageContentModel::updateReplyModel()
return;
}
EventHandler eventHandler(m_room, m_event.get());
if (!eventHandler.hasReply() || (eventHandler.isThreaded() && NeoChatConfig::self()->threads())) {
if (!EventHandler::hasReply(m_event.get()) || (EventHandler::isThreaded(m_event.get()) && NeoChatConfig::self()->threads())) {
if (m_replyModel) {
delete m_replyModel;
}
@@ -440,9 +434,9 @@ void MessageContentModel::updateReplyModel()
return;
}
const auto replyEvent = m_room->findInTimeline(eventHandler.getReplyId());
const auto replyEvent = m_room->findInTimeline(EventHandler::replyId(m_event.get()));
if (replyEvent == m_room->historyEdge()) {
m_replyModel = new MessageContentModel(m_room, eventHandler.getReplyId(), true, false, this);
m_replyModel = new MessageContentModel(m_room, EventHandler::replyId(m_event.get()), true, false, this);
} else {
m_replyModel = new MessageContentModel(m_room, replyEvent->get(), true, false, this);
}

View File

@@ -10,7 +10,6 @@
#include <Quotient/room.h>
#include "enums/messagecomponenttype.h"
#include "eventhandler.h"
#include "itinerarymodel.h"
#include "neochatroommember.h"
@@ -66,7 +65,6 @@ public:
AssetRole, /**< Type of location event, e.g. self pin of the user location. */
PollHandlerRole, /**< The PollHandler for the event, if any. */
IsReplyRole, /**< Is the message a reply to another event. */
ReplyEventIdRole, /**< The matrix ID of the message that was replied to. */
ReplyAuthorRole, /**< The author of the event that was replied to. */
ReplyContentModelRole, /**< The MessageContentModel for the reply event. */

View File

@@ -432,15 +432,13 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
const auto pendingIt = m_currentRoom->pendingEvents().crbegin() + std::min(row, timelineBaseIndex());
const auto &evt = isPending ? **pendingIt : **timelineIt;
EventHandler eventHandler(m_currentRoom, &evt);
if (role == Qt::DisplayRole) {
if (evt.isRedacted()) {
auto reason = evt.redactedBecause()->reason();
return (reason.isEmpty()) ? i18n("<i>[This message was deleted]</i>")
: i18n("<i>[This message was deleted: %1]</i>", evt.redactedBecause()->reason());
}
return eventHandler.getRichBody();
return EventHandler::richBody(m_currentRoom, &evt);
}
if (role == ContentModelRole) {
@@ -457,7 +455,7 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
}
if (role == GenericDisplayRole) {
return eventHandler.getGenericBody();
return EventHandler::genericBody(&evt);
}
if (role == DelegateTypeRole) {
@@ -480,7 +478,7 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
}
if (role == HighlightRole) {
return eventHandler.isHighlighted();
return EventHandler::isHighlighted(m_currentRoom, &evt);
}
if (role == SpecialMarksRole) {
@@ -493,11 +491,11 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
return pendingIt->deliveryStatus();
}
if (eventHandler.isHidden()) {
if (EventHandler::isHidden(m_currentRoom, &evt)) {
return EventStatus::Hidden;
}
if (eventHandler.isThreaded() && eventHandler.threadRoot() != eventHandler.getId() && NeoChatConfig::threads()) {
if (EventHandler::isThreaded(&evt) && EventHandler::threadRoot(&evt) != EventHandler::id(&evt) && NeoChatConfig::threads()) {
return EventStatus::Hidden;
}
@@ -505,7 +503,7 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
}
if (role == EventIdRole) {
return eventHandler.getId();
return EventHandler::id(&evt);
}
if (role == ProgressInfoRole) {
@@ -521,20 +519,20 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
if (role == TimeRole) {
auto lastUpdated = isPending ? pendingIt->lastUpdated() : QDateTime();
return eventHandler.getTime(isPending, lastUpdated);
return EventHandler::time(&evt, isPending, lastUpdated);
}
if (role == SectionRole) {
auto lastUpdated = isPending ? pendingIt->lastUpdated() : QDateTime();
return eventHandler.getTimeString(true, QLocale::ShortFormat, isPending, lastUpdated);
return EventHandler::timeString(&evt, true, QLocale::ShortFormat, isPending, lastUpdated);
}
if (role == IsThreadedRole) {
return eventHandler.isThreaded();
return EventHandler::isThreaded(&evt);
}
if (role == ThreadRootRole) {
return eventHandler.threadRoot();
return EventHandler::threadRoot(&evt);
}
if (role == ShowSectionRole) {
@@ -587,7 +585,7 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
}
if (role == AuthorDisplayNameRole) {
return eventHandler.getAuthorDisplayName(isPending);
return EventHandler::authorDisplayName(m_currentRoom, &evt, isPending);
}
if (role == IsRedactedRole) {
@@ -599,11 +597,11 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
}
if (role == MediaInfoRole) {
return eventHandler.getMediaInfo();
return EventHandler::mediaInfo(m_currentRoom, &evt);
}
if (role == IsEditableRole) {
return eventHandler.messageComponentType() == MessageComponentType::Text && evt.senderId() == m_currentRoom->localMember().id();
return MessageComponentType::typeForEvent(evt) == MessageComponentType::Text && evt.senderId() == m_currentRoom->localMember().id();
}
return {};
@@ -650,9 +648,8 @@ void MessageEventModel::createEventObjects(const Quotient::RoomEvent *event)
}
}
const auto eventHandler = EventHandler(m_currentRoom, event);
if (eventHandler.isThreaded() && !m_threadModels.contains(eventHandler.threadRoot())) {
m_threadModels[eventHandler.threadRoot()] = QSharedPointer<ThreadModel>(new ThreadModel(eventHandler.threadRoot(), m_currentRoom));
if (EventHandler::isThreaded(event) && !m_threadModels.contains(EventHandler::threadRoot(event))) {
m_threadModels[EventHandler::threadRoot(event)] = QSharedPointer<ThreadModel>(new ThreadModel(EventHandler::threadRoot(event), m_currentRoom));
}
// ReadMarkerModel handles updates to add and remove markers, we only need to

View File

@@ -121,12 +121,11 @@ void NotificationsModel::loadData()
const auto &authorAvatar = avatar.isValid() && avatar.scheme() == QStringLiteral("mxc") ? avatar : QUrl();
const auto &roomEvent = eventCast<const RoomEvent>(notification.event.get());
EventHandler eventHandler(dynamic_cast<NeoChatRoom *>(room), roomEvent);
beginInsertRows({}, m_notifications.length(), m_notifications.length());
m_notifications += Notification{
.roomId = notification.roomId,
.text = room->member(authorId).htmlSafeDisplayName() + (roomEvent->is<StateEvent>() ? QStringLiteral(" ") : QStringLiteral(": "))
+ eventHandler.getPlainBody(true),
+ EventHandler::plainBody(dynamic_cast<NeoChatRoom *>(room), roomEvent, true),
.authorName = room->member(authorId).htmlSafeDisplayName(),
.authorAvatar = authorAvatar,
.eventId = roomEvent->id(),

View File

@@ -245,8 +245,7 @@ QVariant RoomListModel::data(const QModelIndex &index, int role) const
if (room->lastEvent() == nullptr || room->lastEventIsSpoiler()) {
return QString();
}
EventHandler eventHandler(room, room->lastEvent());
return eventHandler.subtitleText();
return EventHandler::subtitleText(room, room->lastEvent());
}
if (role == AvatarImageRole) {
return room->avatar(128);

View File

@@ -357,8 +357,7 @@ QVariant RoomTreeModel::data(const QModelIndex &index, int role) const
if (room->lastEvent() == nullptr || room->lastEventIsSpoiler()) {
return QString();
}
EventHandler eventHandler(room, room->lastEvent());
return eventHandler.subtitleText();
return EventHandler::subtitleText(room, room->lastEvent());
}
if (role == AvatarImageRole) {
return room->avatar(128);

View File

@@ -89,8 +89,6 @@ QVariant SearchModel::data(const QModelIndex &index, int role) const
auto row = index.row();
const auto &event = *m_result->results[row].result;
EventHandler eventHandler(m_room, &event);
switch (role) {
case AuthorRole:
return QVariant::fromValue<NeochatRoomMember *>(m_memberObjects.at(event.senderId()).get());
@@ -100,7 +98,7 @@ QVariant SearchModel::data(const QModelIndex &index, int role) const
}
return event.originTimestamp().date() != m_result->results[row - 1].result->originTimestamp().date();
case SectionRole:
return eventHandler.getTimeString(true);
return EventHandler::timeString(&event, true);
case ShowReactionsRole:
return false;
case ShowReadMarkersRole:
@@ -108,13 +106,13 @@ QVariant SearchModel::data(const QModelIndex &index, int role) const
case IsPendingRole:
return false;
case HighlightRole:
return eventHandler.isHighlighted();
return EventHandler::isHighlighted(m_room, &event);
case EventIdRole:
return eventHandler.getId();
return EventHandler::id(&event);
case IsThreadedRole:
return eventHandler.isThreaded();
return EventHandler::isThreaded(&event);
case ThreadRootRole:
return eventHandler.threadRoot();
return EventHandler::threadRoot(&event);
case ContentModelRole: {
if (!event.isStateEvent()) {
return QVariant::fromValue<MessageContentModel *>(new MessageContentModel(m_room, &event));

View File

@@ -23,8 +23,7 @@ ThreadModel::ThreadModel(const QString &threadRootId, NeoChatRoom *room)
connect(room, &Quotient::Room::pendingEventAboutToAdd, this, [this](Quotient::RoomEvent *event) {
if (auto roomEvent = eventCast<const Quotient::RoomMessageEvent>(event)) {
EventHandler eventHandler(dynamic_cast<NeoChatRoom *>(QObject::parent()), roomEvent);
if (eventHandler.isThreaded() && eventHandler.threadRoot() == m_threadRootId) {
if (EventHandler::isThreaded(roomEvent) && EventHandler::threadRoot(roomEvent) == m_threadRootId) {
addNewEvent(event);
clearModels();
addModels();
@@ -34,8 +33,7 @@ ThreadModel::ThreadModel(const QString &threadRootId, NeoChatRoom *room)
connect(room, &Quotient::Room::aboutToAddNewMessages, this, [this](Quotient::RoomEventsRange events) {
for (const auto &event : events) {
if (auto roomEvent = eventCast<const Quotient::RoomMessageEvent>(event)) {
EventHandler eventHandler(dynamic_cast<NeoChatRoom *>(QObject::parent()), roomEvent);
if (eventHandler.isThreaded() && eventHandler.threadRoot() == m_threadRootId) {
if (EventHandler::isThreaded(roomEvent) && EventHandler::threadRoot(roomEvent) == m_threadRootId) {
addNewEvent(roomEvent);
}
}