diff options
author | Nicolas Werner <nicolas.werner@hotmail.de> | 2019-11-05 17:16:04 +0100 |
---|---|---|
committer | Nicolas Werner <nicolas.werner@hotmail.de> | 2019-11-23 20:06:15 +0100 |
commit | 1268e9f11c22e8cd22302342e80daef94b15001d (patch) | |
tree | 3b987792c989836f422ecbbe4ad05ea05c47cb42 /src | |
parent | 88dc72df4f7cd6cabdb48866e6030f5e506eb24f (diff) |
Make replies format nicer
Also lays a bit of groundwork for better reply rendering
Diffstat (limited to 'src')
-rw-r--r-- | src/Utils.cpp | 5 | ||||
-rw-r--r-- | src/timeline2/TimelineModel.cpp | 44 | ||||
-rw-r--r-- | src/timeline2/TimelineModel.h | 1 |
3 files changed, 36 insertions, 14 deletions
diff --git a/src/Utils.cpp b/src/Utils.cpp index e27bc995..8f9e0643 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -366,7 +366,7 @@ utils::getFormattedQuoteBody(const RelatedInfo &related, const QString &html) { return QString("<mx-reply><blockquote><a " "href=\"https://matrix.to/#/%1/%2\">In reply " - "to</a>* <a href=\"https://matrix.to/#/%3\">%4</a><br " + "to</a> <a href=\"https://matrix.to/#/%3\">%4</a><br" "/>%5</blockquote></mx-reply>") .arg(related.room, QString::fromStdString(related.related_event), @@ -382,9 +382,6 @@ utils::getQuoteBody(const RelatedInfo &related) using MsgType = mtx::events::MessageType; switch (related.type) { - case MsgType::Text: { - return markdownToHtml(related.quoted_body); - } case MsgType::File: { return QString(QCoreApplication::translate("utils", "sent a file.")); } diff --git a/src/timeline2/TimelineModel.cpp b/src/timeline2/TimelineModel.cpp index bdb3ea6f..b2b6f803 100644 --- a/src/timeline2/TimelineModel.cpp +++ b/src/timeline2/TimelineModel.cpp @@ -13,6 +13,8 @@ #include "Utils.h" #include "dialogs/RawMessage.h" +Q_DECLARE_METATYPE(QModelIndex) + namespace { template<class T> QString @@ -80,12 +82,6 @@ eventFormattedBody(const mtx::events::RoomEvent<T> &e) { auto temp = e.content.formatted_body; if (!temp.empty()) { - auto pos = temp.find("<mx-reply>"); - if (pos != std::string::npos) - temp.erase(pos, std::string("<mx-reply>").size()); - pos = temp.find("</mx-reply>"); - if (pos != std::string::npos) - temp.erase(pos, std::string("</mx-reply>").size()); return QString::fromStdString(temp); } else { return QString::fromStdString(e.content.body).toHtmlEscaped().replace("\n", "<br>"); @@ -183,6 +179,21 @@ eventMimeType(const mtx::events::RoomEvent<T> &e) } template<class T> +QString +eventRelatesTo(const mtx::events::Event<T> &) +{ + return QString(); +} +template<class T> +auto +eventRelatesTo(const mtx::events::RoomEvent<T> &e) -> std::enable_if_t< + std::is_same<decltype(e.content.relates_to.in_reply_to.event_id), std::string>::value, + QString> +{ + return QString::fromStdString(e.content.relates_to.in_reply_to.event_id); +} + +template<class T> qml_mtx_events::EventType toRoomEventType(const mtx::events::Event<T> &e) { @@ -383,6 +394,7 @@ TimelineModel::roleNames() const {Id, "id"}, {State, "state"}, {IsEncrypted, "isEncrypted"}, + {ReplyTo, "replyTo"}, }; } int @@ -450,8 +462,12 @@ TimelineModel::data(const QModelIndex &index, int role) const return QVariant(utils::replaceEmoji(boost::apply_visitor( [](const auto &e) -> QString { return eventBody(e); }, event))); case FormattedBody: - return QVariant(utils::replaceEmoji(boost::apply_visitor( - [](const auto &e) -> QString { return eventFormattedBody(e); }, event))); + return QVariant( + utils::replaceEmoji( + boost::apply_visitor( + [](const auto &e) -> QString { return eventFormattedBody(e); }, event)) + .remove("<mx-reply>") + .remove("</mx-reply>")); case Url: return QVariant(boost::apply_visitor( [](const auto &e) -> QString { return eventUrl(e); }, event)); @@ -501,6 +517,11 @@ TimelineModel::data(const QModelIndex &index, int role) const return boost::get<mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>>( &tempEvent) != nullptr; } + case ReplyTo: { + QString evId = boost::apply_visitor( + [](const auto &e) -> QString { return eventRelatesTo(e); }, event); + return QVariant(evId); + } default: return QVariant(); } @@ -825,8 +846,11 @@ TimelineModel::replyAction(QString id) event); related.type = mtx::events::getMessageType(boost::apply_visitor( [](const auto &e) -> std::string { return eventMsgType(e); }, event)); - related.quoted_body = - boost::apply_visitor([](const auto &e) -> QString { return eventBody(e); }, event); + related.quoted_body = boost::apply_visitor( + [](const auto &e) -> QString { return eventFormattedBody(e); }, event); + related.quoted_body.remove(QRegularExpression( + "<mx-reply>.*</mx-reply>", QRegularExpression::DotMatchesEverythingOption)); + nhlog::ui()->debug("after replacement: {}", related.quoted_body.toStdString()); related.room = room_id_; if (related.quoted_body.isEmpty()) diff --git a/src/timeline2/TimelineModel.h b/src/timeline2/TimelineModel.h index 1ed6e72c..31e41315 100644 --- a/src/timeline2/TimelineModel.h +++ b/src/timeline2/TimelineModel.h @@ -139,6 +139,7 @@ public: Id, State, IsEncrypted, + ReplyTo, }; QHash<int, QByteArray> roleNames() const override; |