summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2019-08-30 23:20:53 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2019-11-23 20:06:14 +0100
commit8b5c7b2f2fb43b4f1884e683d60dd2553b9aa994 (patch)
tree5acc7a5af54bb5319eccbfb509e7f0c807aadee1 /src
parentReplace timeline with empty qml view (diff)
downloadnheko-8b5c7b2f2fb43b4f1884e683d60dd2553b9aa994.tar.xz
Add placeholder timeline model
Diffstat (limited to 'src')
-rw-r--r--src/timeline2/TimelineModel.cpp47
-rw-r--r--src/timeline2/TimelineModel.h42
-rw-r--r--src/timeline2/TimelineViewManager.cpp44
-rw-r--r--src/timeline2/TimelineViewManager.h15
4 files changed, 142 insertions, 6 deletions
diff --git a/src/timeline2/TimelineModel.cpp b/src/timeline2/TimelineModel.cpp
new file mode 100644

index 00000000..592064dd --- /dev/null +++ b/src/timeline2/TimelineModel.cpp
@@ -0,0 +1,47 @@ +#include "TimelineModel.h" + +#include "Utils.h" + +QHash<int, QByteArray> +TimelineModel::roleNames() const +{ + return { + {Type, "type"}, + {Body, "body"}, + {FormattedBody, "formattedBody"}, + {UserId, "userId"}, + {UserName, "userName"}, + {Timestamp, "timestamp"}, + }; +} +int +TimelineModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return (int)this->eventOrder.size(); +} + +QVariant +TimelineModel::data(const QModelIndex &index, int role) const +{ + if (index.row() < 0 && index.row() >= (int)eventOrder.size()) + return QVariant(); + + QString id = eventOrder[index.row()]; + + switch (role) { + case UserId: + return QVariant(QString("")); + default: + return QVariant(); + } +} + +QColor +TimelineModel::userColor(QString id, QColor background) +{ + if (!userColors.count(id)) + userColors.insert( + {id, QColor(utils::generateContrastingHexColor(id, background.name()))}); + return userColors.at(id); +} diff --git a/src/timeline2/TimelineModel.h b/src/timeline2/TimelineModel.h new file mode 100644
index 00000000..c281056d --- /dev/null +++ b/src/timeline2/TimelineModel.h
@@ -0,0 +1,42 @@ +#pragma once + +#include <map> +#include <vector> + +#include <QAbstractListModel> +#include <QColor> + +#include <mtx/events/collections.hpp> + +class TimelineModel : public QAbstractListModel +{ + Q_OBJECT + +public: + explicit TimelineModel(QObject *parent = 0) + : QAbstractListModel(parent) + {} + + enum Roles + { + Type, + Body, + FormattedBody, + UserId, + UserName, + Timestamp, + }; + + QHash<int, QByteArray> roleNames() const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + + Q_INVOKABLE QColor userColor(QString id, QColor background); + +private: + std::map<QString, mtx::events::collections::TimelineEvents> events; + std::vector<QString> eventOrder; + + std::map<QString, QColor> userColors; +}; + diff --git a/src/timeline2/TimelineViewManager.cpp b/src/timeline2/TimelineViewManager.cpp
index b932b6ac..711dfcad 100644 --- a/src/timeline2/TimelineViewManager.cpp +++ b/src/timeline2/TimelineViewManager.cpp
@@ -1,10 +1,52 @@ #include "TimelineViewManager.h" +#include <QMetaType> +#include <QQmlContext> + +#include "Logging.h" + TimelineViewManager::TimelineViewManager(QWidget *parent) { view = new QQuickView(); container = QWidget::createWindowContainer(view, parent); container->setMinimumSize(200, 200); view->setSource(QUrl("qrc:///qml/TimelineView.qml")); - // view->rootContext()->setContextProperty(room); +} + +void +TimelineViewManager::initialize(const mtx::responses::Rooms &rooms) +{ + for (auto it = rooms.join.cbegin(); it != rooms.join.cend(); ++it) { + addRoom(QString::fromStdString(it->first)); + } + + sync(rooms); +} + +void +TimelineViewManager::addRoom(const QString &room_id) +{ + if (!models.contains(room_id)) + models.insert(room_id, QSharedPointer<TimelineModel>(new TimelineModel())); +} + +void +TimelineViewManager::setHistoryView(const QString &room_id) +{ + nhlog::ui()->info("Trying to activate room {}", room_id.toStdString()); + + auto room = models.find(room_id); + if (room != models.end()) { + view->rootContext()->setContextProperty("timeline", + QVariant::fromValue(room.value().data())); + nhlog::ui()->info("Activated room {}", room_id.toStdString()); + } +} + +void +TimelineViewManager::initWithMessages(const std::map<QString, mtx::responses::Timeline> &msgs) +{ + for (const auto &e : msgs) { + addRoom(e.first); + } } diff --git a/src/timeline2/TimelineViewManager.h b/src/timeline2/TimelineViewManager.h
index 23d30065..80948148 100644 --- a/src/timeline2/TimelineViewManager.h +++ b/src/timeline2/TimelineViewManager.h
@@ -1,11 +1,13 @@ #pragma once #include <QQuickView> +#include <QSharedPointer> #include <QWidget> #include <mtx/responses.hpp> #include "Cache.h" +#include "TimelineModel.h" #include "Utils.h" // temporary for stubs @@ -19,11 +21,11 @@ public: TimelineViewManager(QWidget *parent = 0); QWidget *getWidget() const { return container; } - void initialize(const mtx::responses::Rooms &rooms) {} - void addRoom(const QString &room_id) {} + void initialize(const mtx::responses::Rooms &rooms); + void addRoom(const QString &room_id); void sync(const mtx::responses::Rooms &rooms) {} - void clearAll() {} + void clearAll() { models.clear(); } signals: void clearRoomMessageCount(QString roomid); @@ -32,9 +34,10 @@ signals: public slots: void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids) {} void removeTimelineEvent(const QString &room_id, const QString &event_id) {} - void initWithMessages(const std::map<QString, mtx::responses::Timeline> &msgs) {} + void initWithMessages(const std::map<QString, mtx::responses::Timeline> &msgs); + + void setHistoryView(const QString &room_id); - void setHistoryView(const QString &room_id) {} void queueTextMessage(const QString &msg) {} void queueReplyMessage(const QString &reply, const RelatedInfo &related) {} void queueEmoteMessage(const QString &msg) {} @@ -67,6 +70,8 @@ public slots: private: QQuickView *view; QWidget *container; + + QHash<QString, QSharedPointer<TimelineModel>> models; }; #pragma GCC diagnostic pop