diff --git a/include/Cache.h b/include/Cache.h index a3e2c6c1..a92f6bc5 100644 --- a/include/Cache.h +++ b/include/Cache.h @@ -19,12 +19,11 @@ #include #include +#include #include #include #include -#include "Utils.h" - struct SearchResult { QString user_id; diff --git a/include/RoomList.h b/include/RoomList.h index a2df0380..bdfb7218 100644 --- a/include/RoomList.h +++ b/include/RoomList.h @@ -23,7 +23,6 @@ #include #include -#include "Cache.h" #include class LeaveRoomDialog; @@ -32,7 +31,9 @@ class OverlayModal; class RoomInfoListItem; class Sync; class UserSettings; +class Cache; struct DescInfo; +struct RoomInfo; class RoomList : public QWidget { diff --git a/include/Utils.h b/include/Utils.h index 35c5eec1..c9dc460a 100644 --- a/include/Utils.h +++ b/include/Utils.h @@ -1,6 +1,11 @@ #pragma once +#include "Cache.h" #include "RoomInfoListItem.h" +#include "timeline/widgets/AudioItem.h" +#include "timeline/widgets/FileItem.h" +#include "timeline/widgets/ImageItem.h" +#include "timeline/widgets/VideoItem.h" #include #include @@ -27,6 +32,64 @@ firstChar(const QString &input); QString humanReadableFileSize(uint64_t bytes); +//! Match widgets/events with a description message. +template +QString +messageDescription(const QString &username = "", const QString &body = "") +{ + using Audio = mtx::events::RoomEvent; + using Emote = mtx::events::RoomEvent; + using File = mtx::events::RoomEvent; + using Image = mtx::events::RoomEvent; + using Notice = mtx::events::RoomEvent; + using Sticker = mtx::events::Sticker; + using Text = mtx::events::RoomEvent; + using Video = mtx::events::RoomEvent; + + if (std::is_same::value || std::is_same::value) + return QString("sent an audio clip"); + else if (std::is_same::value || std::is_same::value) + return QString("sent an image"); + else if (std::is_same::value || std::is_same::value) + return QString("sent a file"); + else if (std::is_same::value || std::is_same::value) + return QString("sent a video clip"); + else if (std::is_same::value || std::is_same::value) + return QString("sent a sticker"); + else if (std::is_same::value) + return QString("sent a notification"); + else if (std::is_same::value) + return QString(": %1").arg(body); + else if (std::is_same::value) + return QString("* %1 %2").arg(username).arg(body); +} + +template +DescInfo +createDescriptionInfo(const Event &event, const QString &localUser, const QString &room_id) +{ + using Text = mtx::events::RoomEvent; + using Emote = mtx::events::RoomEvent; + + const auto msg = mpark::get(event); + const auto sender = QString::fromStdString(msg.sender); + + const auto username = Cache::displayName(room_id, sender); + const auto ts = QDateTime::fromMSecsSinceEpoch(msg.origin_server_ts); + + bool isText = std::is_same::value; + bool isEmote = std::is_same::value; + + return DescInfo{ + isEmote ? "" : (sender == localUser ? "You" : username), + sender, + (isText || isEmote) + ? messageDescription(username, QString::fromStdString(msg.content.body).trimmed()) + : QString(" %1").arg(messageDescription()), + utils::descriptiveTime(ts), + ts}; +} + //! Scale down an image to fit to the given width & height limitations. template ImageType diff --git a/include/timeline/TimelineItem.h b/include/timeline/TimelineItem.h index ac512ab8..24d7726b 100644 --- a/include/timeline/TimelineItem.h +++ b/include/timeline/TimelineItem.h @@ -26,11 +26,12 @@ #include #include "AvatarProvider.h" -#include "Cache.h" #include "ChatPage.h" #include "RoomInfoListItem.h" #include "Utils.h" +#include "Cache.h" + class ImageItem; class StickerItem; class AudioItem; @@ -136,16 +137,10 @@ private: void addSaveImageAction(ImageItem *image); template - void setupLocalWidgetLayout(Widget *widget, - const QString &userid, - const QString &msgDescription, - bool withSender); + void setupLocalWidgetLayout(Widget *widget, const QString &userid, bool withSender); template - void setupWidgetLayout(Widget *widget, - const Event &event, - const QString &msgDescription, - bool withSender); + void setupWidgetLayout(Widget *widget, const Event &event, bool withSender); void generateBody(const QString &body); void generateBody(const QString &userid, const QString &body); @@ -184,17 +179,14 @@ private: template void -TimelineItem::setupLocalWidgetLayout(Widget *widget, - const QString &userid, - const QString &msgDescription, - bool withSender) +TimelineItem::setupLocalWidgetLayout(Widget *widget, const QString &userid, bool withSender) { auto displayName = Cache::displayName(room_id_, userid); auto timestamp = QDateTime::currentDateTime(); descriptionMsg_ = {"You", userid, - QString(" %1").arg(msgDescription), + QString(" %1").arg(utils::messageDescription()), utils::descriptiveTime(timestamp), timestamp}; @@ -227,10 +219,7 @@ TimelineItem::setupLocalWidgetLayout(Widget *widget, template void -TimelineItem::setupWidgetLayout(Widget *widget, - const Event &event, - const QString &msgDescription, - bool withSender) +TimelineItem::setupWidgetLayout(Widget *widget, const Event &event, bool withSender) { init(); @@ -243,7 +232,7 @@ TimelineItem::setupWidgetLayout(Widget *widget, QSettings settings; descriptionMsg_ = {sender == settings.value("auth/user_id") ? "You" : displayName, sender, - msgDescription, + QString(" %1").arg(utils::messageDescription()), utils::descriptiveTime(timestamp), timestamp}; diff --git a/src/Cache.cc b/src/Cache.cc index 416d95a6..699774ce 100644 --- a/src/Cache.cc +++ b/src/Cache.cc @@ -26,6 +26,7 @@ #include #include "Cache.h" +#include "Utils.h" //! Should be changed when a breaking change occurs in the cache format. //! This will reset client's data. diff --git a/src/RoomList.cc b/src/RoomList.cc index a3195196..c0447f9a 100644 --- a/src/RoomList.cc +++ b/src/RoomList.cc @@ -27,6 +27,7 @@ #include "RoomInfoListItem.h" #include "RoomList.h" #include "UserSettingsPage.h" +#include "Utils.h" RoomList::RoomList(QSharedPointer client, QSharedPointer userSettings, diff --git a/src/Utils.cc b/src/Utils.cc index 0aca8303..d9b06b52 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -1,7 +1,5 @@ #include "Utils.h" -#include "Cache.h" - #include using TimelineEvent = mtx::events::collections::TimelineEvents; @@ -36,100 +34,21 @@ utils::getMessageDescription(const TimelineEvent &event, using Video = mtx::events::RoomEvent; if (mpark::holds_alternative