From cabc867b3e7cbf56ac2d8f646c52deb59a3197f4 Mon Sep 17 00:00:00 2001 From: Minijackson Date: Fri, 13 Apr 2018 10:25:42 +0200 Subject: Make the event model size-generic and filter dates --- framework/src/domain/eventtreemodel.cpp | 98 ++++++++++++++++++++------------- framework/src/domain/eventtreemodel.h | 25 +++++++-- views/calendar/qml/WeekEvents.qml | 1 + 3 files changed, 81 insertions(+), 43 deletions(-) diff --git a/framework/src/domain/eventtreemodel.cpp b/framework/src/domain/eventtreemodel.cpp index 9f9bbdca..4e25cffe 100644 --- a/framework/src/domain/eventtreemodel.cpp +++ b/framework/src/domain/eventtreemodel.cpp @@ -52,31 +52,40 @@ EventTreeModel::EventTreeModel(QObject *parent) : QAbstractItemModel(parent), pa void EventTreeModel::partitionData() { - partitioningMutex.lock(); - SinkLog() << "Partitioning event data"; beginResetModel(); - for (int i = 0; i < 7; ++i) { - partitionedEvents[i].clear(); - } + partitionedEvents = QVector>>(mViewLength); for (int i = 0; i < eventModel->rowCount(); ++i) { auto event = eventModel->index(i, 0).data(Sink::Store::DomainObjectRole).value(); - int dayOfWeek = event->getStartTime().date().dayOfWeek(); + QDate eventDate = event->getStartTime().date(); - Q_ASSERT(dayOfWeek != 0); - dayOfWeek -= 1; + if(!eventDate.isValid()) { + SinkWarning() << "Invalid date in the eventModel, ignoring..."; + continue; + } - SinkTrace() << "Adding event:" << event->getSummary() << "in bucket #" << dayOfWeek; + int bucket = bucketOf(eventDate); - partitionedEvents[dayOfWeek].append(event); + if(bucket >= 0) { + SinkTrace() << "Adding event:" << event->getSummary() << "in bucket #" << bucket; + partitionedEvents[bucket].append(event); + } } endResetModel(); +} + +int EventTreeModel::bucketOf(QDate const &candidate) const +{ + int bucket = mViewStart.daysTo(candidate); + if(bucket >= mViewLength || bucket < 0) { + return -1; + } - partitioningMutex.unlock(); + return bucket; } QModelIndex EventTreeModel::index(int row, int column, const QModelIndex &parent) const @@ -86,10 +95,9 @@ QModelIndex EventTreeModel::index(int row, int column, const QModelIndex &parent } if (!parent.isValid()) { - // Asking for a LocalEventListModel + // Asking for a day - // TODO: Assuming week view - if (!(0 <= row && row <= 6)) { + if (!(0 <= row && row < mViewLength)) { return {}; } @@ -99,7 +107,7 @@ QModelIndex EventTreeModel::index(int row, int column, const QModelIndex &parent // Asking for an Event auto day = static_cast(parent.row()); - Q_ASSERT(0 <= day && day <= 6); + Q_ASSERT(0 <= day && day <= mViewLength); if (row >= partitionedEvents[day].size()) { return {}; } @@ -125,7 +133,7 @@ QModelIndex EventTreeModel::parent(const QModelIndex &index) const int EventTreeModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) { - return 7; + return mViewLength; } auto day = parent.row(); @@ -147,29 +155,12 @@ QVariant EventTreeModel::data(const QModelIndex &id, int role) const if (id.internalId() == DAY_ID) { auto day = id.row(); - SinkTrace() << "Fetching data for day" << day << "with role" << QMetaEnum::fromType().valueToKey(role); + SinkTrace() << "Fetching data for day" << day << "with role" + << QMetaEnum::fromType().valueToKey(role); switch (role) { case Qt::DisplayRole: - switch (day) { - case 0: - return "Monday"; - case 1: - return "Tuesday"; - case 2: - return "Wednesday"; - case 3: - return "Thursday"; - case 4: - return "Friday"; - case 5: - return "Saturday"; - case 6: - return "Sunday"; - default: - SinkWarning() << "Unknown day"; - return {}; - } + return mViewStart.addDays(day).toString(); case Events: { auto result = QVariantList{}; @@ -197,7 +188,8 @@ QVariant EventTreeModel::data(const QModelIndex &id, int role) const } } else { auto day = id.internalId(); - SinkTrace() << "Fetching data for event on day" << day << "with role" << QMetaEnum::fromType().valueToKey(role); + SinkTrace() << "Fetching data for event on day" << day << "with role" + << QMetaEnum::fromType().valueToKey(role); auto event = partitionedEvents[day].at(id.row()); switch (role) { @@ -231,3 +223,35 @@ QHash EventTreeModel::roleNames() const return roles; } + +QDate EventTreeModel::viewStart() const +{ + return mViewStart; +} + +void EventTreeModel::setViewStart(QDate start) +{ + if (!start.isValid()) { + SinkWarning() << "Passed an invalid starting date in setViewStart, ignoring..."; + return; + } + + mViewStart = std::move(start); + partitionData(); +} + +void EventTreeModel::setViewStart(QVariant start) +{ + setViewStart(start.toDate()); +} + +int EventTreeModel::viewLength() const +{ + return mViewLength; +} + +void EventTreeModel::setViewLength(int length) +{ + mViewLength = std::move(length); + partitionData(); +} diff --git a/framework/src/domain/eventtreemodel.h b/framework/src/domain/eventtreemodel.h index 77189073..516410ee 100644 --- a/framework/src/domain/eventtreemodel.h +++ b/framework/src/domain/eventtreemodel.h @@ -25,10 +25,11 @@ #include #include -#include #include #include +#include + // Implementation notes // ==================== // @@ -38,8 +39,8 @@ // Columns are never used. // // Top-level items just contains the ".events" attribute, and their rows -// correspond to their day of week. In that case the internalId contains -// DAY_ID. +// correspond to their offset compared to the start of the view (in number of +// days). In that case the internalId contains DAY_ID. // // Direct children are events, and their rows corresponds to their index in // their partition. In that case no internalId / internalPointer is used. @@ -60,6 +61,9 @@ class EventTreeModel : public QAbstractItemModel { Q_OBJECT + Q_PROPERTY(QVariant viewStart READ viewStart WRITE setViewStart) + Q_PROPERTY(int viewLength READ viewLength WRITE setViewLength) + public: using Event = Sink::ApplicationDomain::Event; @@ -85,13 +89,22 @@ public: QHash roleNames() const override; + QDate viewStart() const; + void setViewStart(QDate); + void setViewStart(QVariant); + int viewLength() const; + void setViewLength(int); + private: void partitionData(); + int bucketOf(QDate const &candidate) const; + + QDate mViewStart; + int mViewLength = 7; + QSharedPointer eventModel; QVector>> partitionedEvents; - QMutex partitioningMutex; - - static const constexpr quintptr DAY_ID = 7; + static const constexpr quintptr DAY_ID = std::numeric_limits::max(); }; diff --git a/views/calendar/qml/WeekEvents.qml b/views/calendar/qml/WeekEvents.qml index 47afae40..0b66eb99 100644 --- a/views/calendar/qml/WeekEvents.qml +++ b/views/calendar/qml/WeekEvents.qml @@ -3,4 +3,5 @@ import QtQuick 2.7 import org.kube.framework 1.0 as Kube Kube.EventTreeModel { + viewStart: "2018-04-09" } -- cgit v1.2.3