From cf716e2b12bcb871ab79886501822e569dab9a4c Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 3 Aug 2018 16:39:07 +0200 Subject: Support for events spanning days --- framework/src/domain/perioddayeventmodel.cpp | 38 +++++++++++++++++++++++----- framework/src/domain/perioddayeventmodel.h | 2 ++ views/calendar/main.qml | 4 +-- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/framework/src/domain/perioddayeventmodel.cpp b/framework/src/domain/perioddayeventmodel.cpp index 39cc1bc3..ed853129 100644 --- a/framework/src/domain/perioddayeventmodel.cpp +++ b/framework/src/domain/perioddayeventmodel.cpp @@ -85,9 +85,19 @@ void PeriodDayEventModel::partitionData() } int bucket = bucketOf(eventDate); - SinkTrace() << "Adding event:" << event->getSummary() << "in bucket #" << bucket; partitionedEvents[bucket].append(event); + + //Also add the event to all other days it spans + QDate endDate = event->getEndTime().date(); + if (endDate.isValid()) { + const int endBucket = qMin(bucketOf(endDate), periodLength()); + for (int i = bucket + 1; i <= endBucket; i++) { + partitionedEvents[i].append(event); + } + + } + } endResetModel(); @@ -167,6 +177,22 @@ QByteArray PeriodDayEventModel::getColor(const QByteArray &calendar) const return mCalendarCache->getProperty(calendar, "color").toByteArray(); } +QDateTime PeriodDayEventModel::getStartTimeOfDay(const QDateTime &dateTime, int day) const +{ + if (bucketOf(dateTime.date()) < day) { + return QDateTime{mPeriodStart.addDays(day), QTime{0,0}}; + } + return dateTime; +} + +QDateTime PeriodDayEventModel::getEndTimeOfDay(const QDateTime &dateTime, int day) const +{ + if (bucketOf(dateTime.date()) > day) { + return QDateTime{mPeriodStart.addDays(day), QTime{23, 59, 59}}; + } + return dateTime; +} + QVariant PeriodDayEventModel::data(const QModelIndex &id, int role) const { if (id.internalId() == DAY_ID) { @@ -235,13 +261,13 @@ QVariant PeriodDayEventModel::data(const QModelIndex &id, int role) const case Description: return event->getDescription(); case StartTime: - return event->getStartTime(); + return getStartTimeOfDay(event->getStartTime(), day); case EndTime: - return event->getEndTime(); + return getEndTimeOfDay(event->getEndTime(), day); case Duration: { - auto start = event->getStartTime(); - auto end = event->getEndTime(); - return start.secsTo(end) / 3600; + auto start = getStartTimeOfDay(event->getStartTime(), day); + auto end = getEndTimeOfDay(event->getEndTime(), day); + return qRound(start.secsTo(end) / 3600.0); } case Color: return getColor(event->getCalendar()); diff --git a/framework/src/domain/perioddayeventmodel.h b/framework/src/domain/perioddayeventmodel.h index 2eaa7f1c..2d1d0177 100644 --- a/framework/src/domain/perioddayeventmodel.h +++ b/framework/src/domain/perioddayeventmodel.h @@ -126,6 +126,8 @@ private: void updateQuery(); void partitionData(); QByteArray getColor(const QByteArray &calendar) const; + QDateTime getStartTimeOfDay(const QDateTime &dateTime, int day) const; + QDateTime getEndTimeOfDay(const QDateTime &dateTime, int day) const; int bucketOf(const QDate &candidate) const; diff --git a/views/calendar/main.qml b/views/calendar/main.qml index d27817f5..bf7179b7 100644 --- a/views/calendar/main.qml +++ b/views/calendar/main.qml @@ -76,8 +76,8 @@ ApplicationWindow { resource: "caldavresource", summary: "Test Event4", description: "This is test event #4", - starts: "2018-04-12T22:00:00", - ends: "2018-04-15T03:00:00", + starts: "2018-04-12T03:00:00", + ends: "2018-04-14T22:00:00", }, { resource: "caldavresource", -- cgit v1.2.3