summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2019-09-02 23:28:05 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2019-11-23 20:06:14 +0100
commit34f5400e99eb0ecbf402fd5e7961dfed7b076ed2 (patch)
treefab9e6774124ce009a913f84f4d529fa0753bab5 /src
parentFormat date (close to) the old way in qml timeline (diff)
downloadnheko-34f5400e99eb0ecbf402fd5e7961dfed7b076ed2.tar.xz
Implement TextMessage delegate
Text selection over multiple items doesn't work yet
Diffstat (limited to 'src')
-rw-r--r--src/timeline2/TimelineModel.cpp123
-rw-r--r--src/timeline2/TimelineModel.h66
-rw-r--r--src/timeline2/TimelineViewManager.cpp7
3 files changed, 193 insertions, 3 deletions
diff --git a/src/timeline2/TimelineModel.cpp b/src/timeline2/TimelineModel.cpp

index 6f212833..112b2752 100644 --- a/src/timeline2/TimelineModel.cpp +++ b/src/timeline2/TimelineModel.cpp
@@ -1,5 +1,7 @@ #include "TimelineModel.h" +#include <type_traits> + #include <QRegularExpression> #include "Logging.h" @@ -31,6 +33,119 @@ eventTimestamp(const T &event) { return QDateTime::fromMSecsSinceEpoch(event.origin_server_ts); } + +template<class T> +QString +eventFormattedBody(const mtx::events::Event<T> &) +{ + return QString(""); +} +template<class T> +auto +eventFormattedBody(const mtx::events::RoomEvent<T> &e) + -> std::enable_if_t<std::is_same<decltype(e.content.formatted_body), std::string>::value, QString> +{ + 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); +} + +template<class T> +qml_mtx_events::EventType +toRoomEventType(const mtx::events::Event<T> &e) +{ + using mtx::events::EventType; + switch (e.type) { + case EventType::RoomKeyRequest: + return qml_mtx_events::EventType::KeyRequest; + case EventType::RoomAliases: + return qml_mtx_events::EventType::Aliases; + case EventType::RoomAvatar: + return qml_mtx_events::EventType::Avatar; + case EventType::RoomCanonicalAlias: + return qml_mtx_events::EventType::CanonicalAlias; + case EventType::RoomCreate: + return qml_mtx_events::EventType::Create; + case EventType::RoomEncrypted: + return qml_mtx_events::EventType::Encrypted; + case EventType::RoomEncryption: + return qml_mtx_events::EventType::Encryption; + case EventType::RoomGuestAccess: + return qml_mtx_events::EventType::GuestAccess; + case EventType::RoomHistoryVisibility: + return qml_mtx_events::EventType::HistoryVisibility; + case EventType::RoomJoinRules: + return qml_mtx_events::EventType::JoinRules; + case EventType::RoomMember: + return qml_mtx_events::EventType::Member; + case EventType::RoomMessage: + return qml_mtx_events::EventType::UnknownMessage; + case EventType::RoomName: + return qml_mtx_events::EventType::Name; + case EventType::RoomPowerLevels: + return qml_mtx_events::EventType::PowerLevels; + case EventType::RoomTopic: + return qml_mtx_events::EventType::Topic; + case EventType::RoomTombstone: + return qml_mtx_events::EventType::Tombstone; + case EventType::RoomRedaction: + return qml_mtx_events::EventType::Redaction; + case EventType::RoomPinnedEvents: + return qml_mtx_events::EventType::PinnedEvents; + case EventType::Sticker: + return qml_mtx_events::EventType::Sticker; + case EventType::Tag: + return qml_mtx_events::EventType::Tag; + case EventType::Unsupported: + default: + return qml_mtx_events::EventType::Unsupported; + } +} +qml_mtx_events::EventType +toRoomEventType(const mtx::events::Event<mtx::events::msg::Audio> &) +{ + return qml_mtx_events::EventType::AudioMessage; +} +qml_mtx_events::EventType +toRoomEventType(const mtx::events::Event<mtx::events::msg::Emote> &) +{ + return qml_mtx_events::EventType::EmoteMessage; +} +qml_mtx_events::EventType +toRoomEventType(const mtx::events::Event<mtx::events::msg::File> &) +{ + return qml_mtx_events::EventType::FileMessage; +} +qml_mtx_events::EventType +toRoomEventType(const mtx::events::Event<mtx::events::msg::Image> &) +{ + return qml_mtx_events::EventType::ImageMessage; +} +qml_mtx_events::EventType +toRoomEventType(const mtx::events::Event<mtx::events::msg::Notice> &) +{ + return qml_mtx_events::EventType::NoticeMessage; +} +qml_mtx_events::EventType +toRoomEventType(const mtx::events::Event<mtx::events::msg::Text> &) +{ + return qml_mtx_events::EventType::TextMessage; +} +qml_mtx_events::EventType +toRoomEventType(const mtx::events::Event<mtx::events::msg::Video> &) +{ + return qml_mtx_events::EventType::VideoMessage; +} +// ::EventType::Type toRoomEventType(const Event<mtx::events::msg::Location> &e) { return +// ::EventType::LocationMessage; } } TimelineModel::TimelineModel(QString room_id, QObject *parent) @@ -105,6 +220,14 @@ TimelineModel::data(const QModelIndex &index, int role) const case Timestamp: return QVariant(boost::apply_visitor( [](const auto &e) -> QDateTime { return eventTimestamp(e); }, events.value(id))); + case Type: + return QVariant(boost::apply_visitor( + [](const auto &e) -> qml_mtx_events::EventType { return toRoomEventType(e); }, + events.value(id))); + case FormattedBody: + return QVariant(utils::replaceEmoji(boost::apply_visitor( + [](const auto &e) -> QString { return eventFormattedBody(e); }, + events.value(id)))); default: return QVariant(); } diff --git a/src/timeline2/TimelineModel.h b/src/timeline2/TimelineModel.h
index e2c7b73a..3af94643 100644 --- a/src/timeline2/TimelineModel.h +++ b/src/timeline2/TimelineModel.h
@@ -7,6 +7,65 @@ #include <mtx/responses.hpp> +namespace qml_mtx_events { +Q_NAMESPACE + +enum EventType +{ + // Unsupported event + Unsupported, + /// m.room_key_request + KeyRequest, + /// m.room.aliases + Aliases, + /// m.room.avatar + Avatar, + /// m.room.canonical_alias + CanonicalAlias, + /// m.room.create + Create, + /// m.room.encrypted. + Encrypted, + /// m.room.encryption. + Encryption, + /// m.room.guest_access + GuestAccess, + /// m.room.history_visibility + HistoryVisibility, + /// m.room.join_rules + JoinRules, + /// m.room.member + Member, + /// m.room.name + Name, + /// m.room.power_levels + PowerLevels, + /// m.room.tombstone + Tombstone, + /// m.room.topic + Topic, + /// m.room.redaction + Redaction, + /// m.room.pinned_events + PinnedEvents, + // m.sticker + Sticker, + // m.tag + Tag, + /// m.room.message + AudioMessage, + EmoteMessage, + FileMessage, + ImageMessage, + LocationMessage, + NoticeMessage, + TextMessage, + VideoMessage, + UnknownMessage, +}; +Q_ENUM_NS(EventType) +} + class TimelineModel : public QAbstractListModel { Q_OBJECT @@ -26,8 +85,8 @@ public: }; QHash<int, QByteArray> roleNames() const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; Q_INVOKABLE QColor userColor(QString id, QColor background); Q_INVOKABLE QString displayName(QString id) const; @@ -40,6 +99,7 @@ public slots: private slots: // Add old events at the top of the timeline. + void addBackwardsEvents(const mtx::responses::Messages &msgs); signals: @@ -57,4 +117,4 @@ private: QHash<QString, QColor> userColors; }; - + diff --git a/src/timeline2/TimelineViewManager.cpp b/src/timeline2/TimelineViewManager.cpp
index 32321fd2..df9a2270 100644 --- a/src/timeline2/TimelineViewManager.cpp +++ b/src/timeline2/TimelineViewManager.cpp
@@ -7,6 +7,13 @@ TimelineViewManager::TimelineViewManager(QWidget *parent) { + qmlRegisterUncreatableMetaObject(qml_mtx_events::staticMetaObject, + "com.github.nheko", + 1, + 0, + "MtxEvent", + "Can't instantiate enum!"); + view = new QQuickView(); container = QWidget::createWindowContainer(view, parent); container->setMinimumSize(200, 200);