diff --git a/src/libneochat/eventhandler.cpp b/src/libneochat/eventhandler.cpp index 6d7dba70f..30865b523 100644 --- a/src/libneochat/eventhandler.cpp +++ b/src/libneochat/eventhandler.cpp @@ -195,20 +195,25 @@ bool EventHandler::isHidden(const NeoChatRoom *room, const Quotient::RoomEvent * return false; } -Qt::TextFormat EventHandler::messageBodyInputFormat(const Quotient::RoomMessageEvent &event) +Qt::TextFormat EventHandler::messageBodyInputFormat(const Quotient::RoomEvent &event) { if (event.isRedacted() && !event.isStateEvent()) { return Qt::RichText; } - if (event.mimeType().name() == "text/plain"_L1) { + auto msgEvent = eventCast(&event); + if (!msgEvent) { + return Qt::PlainText; + } + + if (msgEvent->mimeType().name() == "text/plain"_L1) { return Qt::PlainText; } else { return Qt::RichText; } } -QString EventHandler::rawMessageBody(const Quotient::RoomMessageEvent &event) +QString EventHandler::rawMessageBody(const RoomEvent &event) { if (event.isRedacted() && !event.isStateEvent()) { auto reason = event.redactedBecause()->reason(); @@ -217,21 +222,26 @@ QString EventHandler::rawMessageBody(const Quotient::RoomMessageEvent &event) QString body; - if (event.has()) { + auto msgEvent = eventCast(&event); + if (!msgEvent) { + return body; + } + + if (msgEvent->has()) { // if filename is given or body is equal to filename, // then body is a caption - QString filename = event.get()->originalName; - QString body = event.plainBody(); + QString filename = msgEvent->get()->originalName; + QString body = msgEvent->plainBody(); if (filename.isEmpty() || filename == body) { return QString(); } return body; } - if (event.has() && event.content()) { - body = event.get()->body; + if (msgEvent->has() && msgEvent->content()) { + body = msgEvent->get()->body; } else { - body = event.plainBody(); + body = msgEvent->plainBody(); } return body; } diff --git a/src/libneochat/eventhandler.h b/src/libneochat/eventhandler.h index bac75613e..baee8d48c 100644 --- a/src/libneochat/eventhandler.h +++ b/src/libneochat/eventhandler.h @@ -122,15 +122,15 @@ public: * I.e. if the message has only a body the format will be Qt::PlainText, if it * has a formatted body it will be Qt::RichText. */ - static Qt::TextFormat messageBodyInputFormat(const Quotient::RoomMessageEvent &event); + static Qt::TextFormat messageBodyInputFormat(const Quotient::RoomEvent &event); /** - * @brief Output a string for the room message content without any formatting. + * @brief Output a string for the message content without any formatting. * * This is the content of the formatted_body key if present or the body key if * not. */ - static QString rawMessageBody(const Quotient::RoomMessageEvent &event); + static QString rawMessageBody(const Quotient::RoomEvent &event); /** * @brief Output a string for the message content ready for display in a rich text field. diff --git a/src/messagecontent/models/eventmessagecontentmodel.cpp b/src/messagecontent/models/eventmessagecontentmodel.cpp index 5fb7a0fd4..f25dcda63 100644 --- a/src/messagecontent/models/eventmessagecontentmodel.cpp +++ b/src/messagecontent/models/eventmessagecontentmodel.cpp @@ -366,55 +366,42 @@ void EventMessageContentModel::updateReplyModel() QList EventMessageContentModel::componentsForType(MessageComponentType::Type type) { - const auto event = m_room->getEvent(m_eventId); - if (event.first == nullptr) { + const auto [event, _] = m_room->getEvent(m_eventId); + if (event == nullptr) { return {}; } + const auto roomMessageEvent = eventCast(event); switch (type) { case MessageComponentType::Verification: { return {MessageComponent{MessageComponentType::Verification, QString(), {}}}; } case MessageComponentType::Text: { - if (const auto roomMessageEvent = eventCast(event.first)) { - return TextHandler().textComponents(EventHandler::rawMessageBody(*roomMessageEvent), - EventHandler::messageBodyInputFormat(*roomMessageEvent), - m_room, - roomMessageEvent, - roomMessageEvent->isReplaced()); - } else { - return TextHandler().textComponents(EventHandler::plainBody(m_room, event.first), Qt::TextFormat::PlainText, m_room, event.first, false); - } - - const auto roomMessageEvent = eventCast(event.first); - return TextHandler().textComponents(EventHandler::rawMessageBody(*roomMessageEvent), - EventHandler::messageBodyInputFormat(*roomMessageEvent), + return TextHandler().textComponents(EventHandler::rawMessageBody(*event), + EventHandler::messageBodyInputFormat(*event), m_room, - roomMessageEvent, - roomMessageEvent->isReplaced()); + event, + roomMessageEvent ? roomMessageEvent->isReplaced() : false); } case MessageComponentType::File: { QList components; - components += MessageComponent{MessageComponentType::File, {}, EventHandler::mediaInfo(m_room, event.first)}; - const auto roomMessageEvent = eventCast(event.first); - auto body = EventHandler::rawMessageBody(*roomMessageEvent); + components += MessageComponent{MessageComponentType::File, {}, EventHandler::mediaInfo(m_room, event)}; + auto body = EventHandler::rawMessageBody(*event); if (!body.isEmpty()) { components += TextHandler().textComponents(body, - EventHandler::messageBodyInputFormat(*roomMessageEvent), - m_room, - roomMessageEvent, - roomMessageEvent->isReplaced()); + EventHandler::messageBodyInputFormat(*event), + m_room, + event, + roomMessageEvent ? roomMessageEvent->isReplaced() : false); } return components; } case MessageComponentType::Image: case MessageComponentType::Audio: case MessageComponentType::Video: { - QList components = { - MessageComponent{type, EventHandler::richBody(m_room, event.first), EventHandler::mediaInfo(m_room, event.first)}}; + QList components = {MessageComponent{type, EventHandler::richBody(m_room, event), EventHandler::mediaInfo(m_room, event)}}; - if (!event.first->is()) { - const auto roomMessageEvent = eventCast(event.first); + if (!event->is() && roomMessageEvent) { const auto fileContent = roomMessageEvent->get(); if (fileContent != nullptr) { const auto fileInfo = fileContent->commonInfo(); @@ -433,11 +420,11 @@ QList EventMessageContentModel::componentsForType(MessageCompo } case MessageComponentType::Location: return {MessageComponent{type, - EventHandler::plainBody(m_room, event.first), + EventHandler::plainBody(m_room, event), { - {u"latitude"_s, EventHandler::latitude(event.first)}, - {u"longitude"_s, EventHandler::longitude(event.first)}, - {u"asset"_s, EventHandler::locationAssetType(event.first)}, + {u"latitude"_s, EventHandler::latitude(event)}, + {u"longitude"_s, EventHandler::longitude(event)}, + {u"asset"_s, EventHandler::locationAssetType(event)}, }}}; default: return {MessageComponent{type, QString(), {}}};