diff --git a/src/enums/messagecomponenttype.h b/src/enums/messagecomponenttype.h index aeed12947..0ebde696b 100644 --- a/src/enums/messagecomponenttype.h +++ b/src/enums/messagecomponenttype.h @@ -51,6 +51,7 @@ public: LinkPreview, /**< A preview of a URL in the message. */ LinkPreviewLoad, /**< A loading dialog for a link preview. */ Edit, /**< A text edit for editing a message. */ + Verification, /**< A user verification session start message. */ Other, /**< Anything that cannot be classified as another type. */ }; Q_ENUM(Type); diff --git a/src/models/messagecontentmodel.cpp b/src/models/messagecontentmodel.cpp index f1a5d0cd5..d7123470f 100644 --- a/src/models/messagecontentmodel.cpp +++ b/src/models/messagecontentmodel.cpp @@ -244,70 +244,75 @@ void MessageContentModel::updateComponents(bool isEditing) beginResetModel(); m_components.clear(); - EventHandler eventHandler(m_room, m_event); - if (eventHandler.hasReply()) { - if (m_room->findInTimeline(eventHandler.getReplyId()) == m_room->historyEdge()) { - m_components += MessageComponent{MessageComponentType::ReplyLoad, QString(), {}}; - m_room->loadReply(m_event->id(), eventHandler.getReplyId()); - } else { - m_components += MessageComponent{MessageComponentType::Reply, QString(), {}}; - } - } - - if (isEditing) { - m_components += MessageComponent{MessageComponentType::Edit, QString(), {}}; - } else if (m_event->isRedacted()) { - m_components += MessageComponent{MessageComponentType::Text, QString(), {}}; + if (eventCast(m_event) + && eventCast(m_event)->rawMsgtype() == QStringLiteral("m.key.verification.request")) { + m_components += MessageComponent{MessageComponentType::Verification, QString(), {}}; } else { - if (eventHandler.messageComponentType() == MessageComponentType::Text) { - const auto event = eventCast(m_event); - auto body = EventHandler::rawMessageBody(*event); - m_components.append(TextHandler().textComponents(body, EventHandler::messageBodyInputFormat(*event), m_room, event, event->isReplaced())); - } else if (eventHandler.messageComponentType() == MessageComponentType::File) { - m_components += MessageComponent{MessageComponentType::File, QString(), {}}; - if (m_emptyItinerary) { - Quotient::FileTransferInfo fileTransferInfo; - if (auto event = eventCast(m_event)) { - if (event->hasFileContent()) { + EventHandler eventHandler(m_room, m_event); + if (eventHandler.hasReply()) { + if (m_room->findInTimeline(eventHandler.getReplyId()) == m_room->historyEdge()) { + m_components += MessageComponent{MessageComponentType::ReplyLoad, QString(), {}}; + m_room->loadReply(m_event->id(), eventHandler.getReplyId()); + } else { + m_components += MessageComponent{MessageComponentType::Reply, QString(), {}}; + } + } + + if (isEditing) { + m_components += MessageComponent{MessageComponentType::Edit, QString(), {}}; + } else if (m_event->isRedacted()) { + m_components += MessageComponent{MessageComponentType::Text, QString(), {}}; + } else { + if (eventHandler.messageComponentType() == MessageComponentType::Text) { + const auto event = eventCast(m_event); + auto body = EventHandler::rawMessageBody(*event); + m_components.append(TextHandler().textComponents(body, EventHandler::messageBodyInputFormat(*event), m_room, event, event->isReplaced())); + } else if (eventHandler.messageComponentType() == MessageComponentType::File) { + m_components += MessageComponent{MessageComponentType::File, QString(), {}}; + if (m_emptyItinerary) { + Quotient::FileTransferInfo fileTransferInfo; + if (auto event = eventCast(m_event)) { + if (event->hasFileContent()) { + fileTransferInfo = m_room->fileTransferInfo(event->id()); + } + } + if (auto event = eventCast(m_event)) { fileTransferInfo = m_room->fileTransferInfo(event->id()); } - } - if (auto event = eventCast(m_event)) { - fileTransferInfo = m_room->fileTransferInfo(event->id()); - } #ifndef Q_OS_ANDROID - KSyntaxHighlighting::Repository repository; - const auto definitionForFile = repository.definitionForFileName(fileTransferInfo.localPath.toString()); - if (definitionForFile.isValid() || QFileInfo(fileTransferInfo.localPath.path()).suffix() == QStringLiteral("txt")) { - QFile file(fileTransferInfo.localPath.path()); - file.open(QIODevice::ReadOnly); - m_components += MessageComponent{MessageComponentType::Code, - QString::fromStdString(file.readAll().toStdString()), - {{QStringLiteral("class"), definitionForFile.name()}}}; - } + KSyntaxHighlighting::Repository repository; + const auto definitionForFile = repository.definitionForFileName(fileTransferInfo.localPath.toString()); + if (definitionForFile.isValid() || QFileInfo(fileTransferInfo.localPath.path()).suffix() == QStringLiteral("txt")) { + QFile file(fileTransferInfo.localPath.path()); + file.open(QIODevice::ReadOnly); + m_components += MessageComponent{MessageComponentType::Code, + QString::fromStdString(file.readAll().toStdString()), + {{QStringLiteral("class"), definitionForFile.name()}}}; + } #endif - if (FileType::instance().fileHasImage(fileTransferInfo.localPath)) { - QImageReader reader(fileTransferInfo.localPath.path()); - m_components += MessageComponent{MessageComponentType::Pdf, QString(), {{QStringLiteral("size"), reader.size()}}}; + if (FileType::instance().fileHasImage(fileTransferInfo.localPath)) { + QImageReader reader(fileTransferInfo.localPath.path()); + m_components += MessageComponent{MessageComponentType::Pdf, QString(), {{QStringLiteral("size"), reader.size()}}}; + } + } else { + updateItineraryModel(); + if (m_itineraryModel != nullptr) { + m_components += MessageComponent{MessageComponentType::Itinerary, QString(), {}}; + } } } else { - updateItineraryModel(); - if (m_itineraryModel != nullptr) { - m_components += MessageComponent{MessageComponentType::Itinerary, QString(), {}}; - } + m_components += MessageComponent{eventHandler.messageComponentType(), QString(), {}}; } - } else { - m_components += MessageComponent{eventHandler.messageComponentType(), QString(), {}}; } - } - if (m_linkPreviewer != nullptr) { - if (m_linkPreviewer->loaded()) { - m_components += MessageComponent{MessageComponentType::LinkPreview, QString(), {}}; - } else { - m_components += MessageComponent{MessageComponentType::LinkPreviewLoad, QString(), {}}; + if (m_linkPreviewer != nullptr) { + if (m_linkPreviewer->loaded()) { + m_components += MessageComponent{MessageComponentType::LinkPreview, QString(), {}}; + } else { + m_components += MessageComponent{MessageComponentType::LinkPreviewLoad, QString(), {}}; + } } } diff --git a/src/timeline/MessageComponentChooser.qml b/src/timeline/MessageComponentChooser.qml index b8ab4429c..09e9bd4c1 100644 --- a/src/timeline/MessageComponentChooser.qml +++ b/src/timeline/MessageComponentChooser.qml @@ -213,6 +213,14 @@ DelegateChooser { } } + DelegateChoice { + roleValue: MessageComponentType.Verification + delegate: MimeComponent { + mimeIconSource: "security-high" + label: i18n("%1 started a user verification", model.author.escapedDisplayName) + } + } + DelegateChoice { roleValue: MessageComponentType.Other delegate: Item {}