From 34bfe1b054a17ba88527e5a4652cd512807e6190 Mon Sep 17 00:00:00 2001 From: Damien Caliste Date: Thu, 19 Nov 2020 10:38:10 +0100 Subject: [PATCH] [nemo-qml-plugin-calendar] Add possibility to use a reminder at a given time and day. --- src/calendardata.h | 1 + src/calendarevent.cpp | 5 +++++ src/calendarevent.h | 3 +++ src/calendareventmodification.cpp | 13 +++++++++++++ src/calendareventmodification.h | 5 +++++ src/calendarimportevent.cpp | 5 +++++ src/calendarimportevent.h | 2 ++ src/calendarutils.cpp | 15 +++++++++++++-- src/calendarutils.h | 1 + src/calendarworker.cpp | 13 ++++++++++--- src/calendarworker.h | 2 +- 11 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/calendardata.h b/src/calendardata.h index 0e32e44c..b381669f 100644 --- a/src/calendardata.h +++ b/src/calendardata.h @@ -69,6 +69,7 @@ struct Event { QDate recurEndDate; CalendarEvent::Days recurWeeklyDays; int reminder; // seconds; 15 minutes before event = +900, at time of event = 0, no reminder = negative value. + QDateTime reminderDateTime; // Valid when reminder is at a given date and time. QString uniqueId; QDateTime recurrenceId; QString location; diff --git a/src/calendarevent.cpp b/src/calendarevent.cpp index 617f462c..7c22774e 100644 --- a/src/calendarevent.cpp +++ b/src/calendarevent.cpp @@ -137,6 +137,11 @@ int CalendarEvent::reminder() const return mManager->getEvent(mUniqueId, mRecurrenceId).reminder; } +QDateTime CalendarEvent::reminderDateTime() const +{ + return mManager->getEvent(mUniqueId, mRecurrenceId).reminderDateTime; +} + QString CalendarEvent::uniqueId() const { return mUniqueId; diff --git a/src/calendarevent.h b/src/calendarevent.h index 42fdffce..5101db97 100644 --- a/src/calendarevent.h +++ b/src/calendarevent.h @@ -59,6 +59,7 @@ class CalendarEvent : public QObject Q_PROPERTY(bool hasRecurEndDate READ hasRecurEndDate NOTIFY hasRecurEndDateChanged) Q_PROPERTY(CalendarEvent::Days recurWeeklyDays READ recurWeeklyDays NOTIFY recurWeeklyDaysChanged) Q_PROPERTY(int reminder READ reminder NOTIFY reminderChanged) + Q_PROPERTY(QDateTime reminderDateTime READ reminderDateTime NOTIFY reminderDateTimeChanged) Q_PROPERTY(QString uniqueId READ uniqueId NOTIFY uniqueIdChanged) Q_PROPERTY(QString recurrenceId READ recurrenceIdString CONSTANT) Q_PROPERTY(QString color READ color NOTIFY colorChanged) @@ -137,6 +138,7 @@ class CalendarEvent : public QObject bool hasRecurEndDate() const; Days recurWeeklyDays() const; int reminder() const; + QDateTime reminderDateTime() const; QString uniqueId() const; QString color() const; bool readOnly() const; @@ -166,6 +168,7 @@ private slots: void allDayChanged(); void recurChanged(); void reminderChanged(); + void reminderDateTimeChanged(); void uniqueIdChanged(); void colorChanged(); void calendarUidChanged(); diff --git a/src/calendareventmodification.cpp b/src/calendareventmodification.cpp index 07b6f8f7..6db3484c 100644 --- a/src/calendareventmodification.cpp +++ b/src/calendareventmodification.cpp @@ -220,6 +220,19 @@ void CalendarEventModification::setReminder(int seconds) } } +QDateTime CalendarEventModification::reminderDateTime() const +{ + return m_event.reminderDateTime; +} + +void CalendarEventModification::setReminderDateTime(const QDateTime &dateTime) +{ + if (dateTime != m_event.reminderDateTime) { + m_event.reminderDateTime = dateTime; + emit reminderDateTimeChanged(); + } +} + QString CalendarEventModification::location() const { return m_event.location; diff --git a/src/calendareventmodification.h b/src/calendareventmodification.h index a59570e2..cef86095 100644 --- a/src/calendareventmodification.h +++ b/src/calendareventmodification.h @@ -55,6 +55,7 @@ class CalendarEventModification : public QObject Q_PROPERTY(bool hasRecurEndDate READ hasRecurEndDate NOTIFY hasRecurEndDateChanged) Q_PROPERTY(QString recurrenceId READ recurrenceIdString CONSTANT) Q_PROPERTY(int reminder READ reminder WRITE setReminder NOTIFY reminderChanged) + Q_PROPERTY(QDateTime reminderDateTime READ reminderDateTime WRITE setReminderDateTime NOTIFY reminderDateTimeChanged) Q_PROPERTY(QString location READ location WRITE setLocation NOTIFY locationChanged) Q_PROPERTY(QString calendarUid READ calendarUid WRITE setCalendarUid NOTIFY calendarUidChanged) @@ -94,6 +95,9 @@ class CalendarEventModification : public QObject int reminder() const; void setReminder(int seconds); + QDateTime reminderDateTime() const; + void setReminderDateTime(const QDateTime &dateTime); + QString location() const; void setLocation(const QString &newLocation); @@ -114,6 +118,7 @@ class CalendarEventModification : public QObject void recurChanged(); void recurWeeklyDaysChanged(); void reminderChanged(); + void reminderDateTimeChanged(); void locationChanged(); void recurEndDateChanged(); void hasRecurEndDateChanged(); diff --git a/src/calendarimportevent.cpp b/src/calendarimportevent.cpp index 820bd7d4..cafda3a7 100644 --- a/src/calendarimportevent.cpp +++ b/src/calendarimportevent.cpp @@ -109,6 +109,11 @@ int CalendarImportEvent::reminder() const return CalendarUtils::getReminder(mEvent); } +QDateTime CalendarImportEvent::reminderDateTime() const +{ + return mEvent ? CalendarUtils::getReminderDateTime(mEvent) : QDateTime(); +} + QString CalendarImportEvent::uniqueId() const { if (!mEvent) diff --git a/src/calendarimportevent.h b/src/calendarimportevent.h index 948d3d81..9fb0b2cc 100644 --- a/src/calendarimportevent.h +++ b/src/calendarimportevent.h @@ -51,6 +51,7 @@ class CalendarImportEvent : public QObject Q_PROPERTY(CalendarEvent::Recur recur READ recur CONSTANT) Q_PROPERTY(CalendarEvent::Days recurWeeklyDays READ recurWeeklyDays CONSTANT) Q_PROPERTY(int reminder READ reminder CONSTANT) + Q_PROPERTY(QDateTime reminderDateTime READ reminderDateTime CONSTANT) Q_PROPERTY(QString uniqueId READ uniqueId CONSTANT) Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged) Q_PROPERTY(QString location READ location CONSTANT) @@ -73,6 +74,7 @@ class CalendarImportEvent : public QObject CalendarEvent::Recur recur(); CalendarEvent::Days recurWeeklyDays(); int reminder() const; + QDateTime reminderDateTime() const; QString uniqueId() const; QString color() const; bool readOnly() const; diff --git a/src/calendarutils.cpp b/src/calendarutils.cpp index b668c952..3f483f2a 100644 --- a/src/calendarutils.cpp +++ b/src/calendarutils.cpp @@ -138,12 +138,12 @@ int CalendarUtils::getReminder(const KCalendarCore::Event::Ptr &event) KCalendarCore::Alarm::Ptr alarm; - int seconds = -1; + int seconds = -1; // Any negative values means "no reminder" for (int ii = 0; ii < alarms.count(); ++ii) { if (alarms.at(ii)->type() == KCalendarCore::Alarm::Procedure) continue; alarm = alarms.at(ii); - if (alarm) { + if (alarm && !alarm->hasTime()) { KCalendarCore::Duration d = alarm->startOffset(); seconds = d.asSeconds() * -1; // backend stores as "offset in seconds to dtStart", we return "seconds before" if (seconds >= 0) { @@ -156,6 +156,17 @@ int CalendarUtils::getReminder(const KCalendarCore::Event::Ptr &event) return seconds; } +QDateTime CalendarUtils::getReminderDateTime(const KCalendarCore::Event::Ptr &event) +{ + for (const KCalendarCore::Alarm::Ptr &alarm : event->alarms()) { + if (alarm && alarm->type() == KCalendarCore::Alarm::Display && alarm->hasTime()) { + return alarm->time(); + } + } + + return QDateTime(); +} + QList CalendarUtils::getEventAttendees(const KCalendarCore::Event::Ptr &event) { QList result; diff --git a/src/calendarutils.h b/src/calendarutils.h index b1c6b0f4..63dd5f34 100644 --- a/src/calendarutils.h +++ b/src/calendarutils.h @@ -48,6 +48,7 @@ CalendarEvent::Recur convertRecurrence(const KCalendarCore::Event::Ptr &event); CalendarEvent::Days convertDayPositions(const KCalendarCore::Event::Ptr &event); CalendarEvent::Secrecy convertSecrecy(const KCalendarCore::Event::Ptr &event); int getReminder(const KCalendarCore::Event::Ptr &event); +QDateTime getReminderDateTime(const KCalendarCore::Event::Ptr &event); QList getEventAttendees(const KCalendarCore::Event::Ptr &event); QList convertAttendeeList(const QList &list); CalendarData::EventOccurrence getNextOccurrence(const KCalendarCore::Event::Ptr &event, diff --git a/src/calendarworker.cpp b/src/calendarworker.cpp index dec2834e..d27130e7 100644 --- a/src/calendarworker.cpp +++ b/src/calendarworker.cpp @@ -281,7 +281,7 @@ void CalendarWorker::setEventData(KCalendarCore::Event::Ptr &event, const Calend event->setDtEnd(eventData.endTime); event->setAllDay(eventData.allDay); event->setLocation(eventData.location); - setReminder(event, eventData.reminder); + setReminder(event, eventData.reminder, eventData.reminderDateTime); setRecurrence(event, eventData.recur, eventData.recurWeeklyDays); if (eventData.recur != CalendarEvent::RecurOnce) { @@ -416,12 +416,13 @@ bool CalendarWorker::setRecurrence(KCalendarCore::Event::Ptr &event, CalendarEve return false; } -bool CalendarWorker::setReminder(KCalendarCore::Event::Ptr &event, int seconds) +bool CalendarWorker::setReminder(KCalendarCore::Event::Ptr &event, int seconds, const QDateTime &dateTime) { if (!event) return false; - if (CalendarUtils::getReminder(event) == seconds) + if (CalendarUtils::getReminder(event) == seconds + && CalendarUtils::getReminderDateTime(event) == dateTime) return false; KCalendarCore::Alarm::List alarms = event->alarms(); @@ -439,6 +440,11 @@ bool CalendarWorker::setReminder(KCalendarCore::Event::Ptr &event, int seconds) // backend stores as "offset to dtStart", i.e negative if reminder before event. alarm->setStartOffset(-1 * seconds); alarm->setType(KCalendarCore::Alarm::Display); + } else if (dateTime.isValid()) { + KCalendarCore::Alarm::Ptr alarm = event->newAlarm(); + alarm->setEnabled(true); + alarm->setTime(dateTime); + alarm->setType(KCalendarCore::Alarm::Display); } return true; @@ -888,6 +894,7 @@ CalendarData::Event CalendarWorker::createEventStruct(const KCalendarCore::Event event.recurEndDate = defaultRule->endDt().date(); } event.reminder = CalendarUtils::getReminder(e); + event.reminderDateTime = CalendarUtils::getReminderDateTime(e); event.startTime = e->dtStart(); return event; } diff --git a/src/calendarworker.h b/src/calendarworker.h index 4b2a7f85..7508032c 100644 --- a/src/calendarworker.h +++ b/src/calendarworker.h @@ -119,7 +119,7 @@ public slots: bool saveExcludeNotebook(const QString ¬ebookUid, bool exclude); bool setRecurrence(KCalendarCore::Event::Ptr &event, CalendarEvent::Recur recur, CalendarEvent::Days days); - bool setReminder(KCalendarCore::Event::Ptr &event, int reminderSeconds); + bool setReminder(KCalendarCore::Event::Ptr &event, int seconds, const QDateTime &dateTime); bool needSendCancellation(KCalendarCore::Event::Ptr &event) const; void updateEventAttendees(KCalendarCore::Event::Ptr event, bool newEvent, const QList &required,