From cb76fedcbc8e419e2b945baa56ac3f986a9e79a3 Mon Sep 17 00:00:00 2001 From: Timotej Lazar Date: Wed, 1 Sep 2021 17:13:51 +0200 Subject: Implement event model in C++ Filtering events in JS is too slow with >20,000 events. This moves the event data model into C++. --- event_list.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 event_list.h (limited to 'event_list.h') diff --git a/event_list.h b/event_list.h new file mode 100644 index 0000000..1c50c59 --- /dev/null +++ b/event_list.h @@ -0,0 +1,46 @@ +#ifndef EVENT_LIST_H +#define EVENT_LIST_H + +#include +#include +#include +#include + +class EventList : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(QStringList tagsOrder MEMBER tagsOrder NOTIFY tagsChanged) + Q_PROPERTY(QJsonObject tags MEMBER tags NOTIFY tagsChanged) + QML_ELEMENT +public: + Qt::ItemFlags flags(const QModelIndex& index) const; + QHash roleNames() const; + int rowCount(const QModelIndex& parent = {}) const; + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; + bool setData(const QModelIndex& index, const QVariant& value, int role); + +public slots: + int insert(const int time = -1); + bool removeRows(int row, int count = 1, const QModelIndex &parent = {}); + void load(const QJsonObject& json); + QJsonObject save() const; + +signals: + void tagsChanged(); + +private: + struct Event { + long long time; + QString tag{}; + QVariantMap values{}; + }; + enum Role { Time = Qt::UserRole + 1, Tag, Values }; + + QStringList tagsOrder; + QJsonObject tags; + QList events; + + int find(long long time) const; +}; + +#endif -- cgit v1.3