4#include <KLocalizedString>
7#include <incidencewrapper.h>
10IncidenceWrapper::IncidenceWrapper(
QObject *parent)
34 connect(CalendarManager::instance(), &CalendarManager::calendarChanged,
this, &IncidenceWrapper::resetChildIncidences);
46IncidenceWrapper::~IncidenceWrapper()
48 cleanupChildIncidences();
51void IncidenceWrapper::notifyDataChanged()
53 Q_EMIT incidenceTypeChanged();
54 Q_EMIT incidenceTypeStrChanged();
55 Q_EMIT incidenceIconNameChanged();
56 Q_EMIT collectionIdChanged();
58 Q_EMIT parentIncidenceChanged();
59 Q_EMIT childIncidencesChanged();
61 Q_EMIT categoriesChanged();
62 Q_EMIT descriptionChanged();
64 Q_EMIT incidenceStartChanged();
65 Q_EMIT incidenceStartDateDisplayChanged();
66 Q_EMIT incidenceStartTimeDisplayChanged();
67 Q_EMIT incidenceEndChanged();
68 Q_EMIT incidenceEndDateDisplayChanged();
69 Q_EMIT incidenceEndTimeDisplayChanged();
71 Q_EMIT startTimeZoneUTCOffsetMinsChanged();
72 Q_EMIT endTimeZoneUTCOffsetMinsChanged();
74 Q_EMIT durationDisplayStringChanged();
79 Q_EMIT recurrenceDataChanged();
82 Q_EMIT todoCompletedChanged();
83 Q_EMIT todoCompletionDtChanged();
84 Q_EMIT todoPercentCompleteChanged();
85 Q_EMIT googleConferenceUrlChanged();
93void IncidenceWrapper::setIncidenceItem(
const Akonadi::Item &incidenceItem)
99 Q_EMIT incidenceItemChanged();
100 Q_EMIT collectionIdChanged();
102 qWarning() <<
"This is not an incidence item.";
113 m_incidence = incidencePtr;
118 Q_EMIT incidencePtrChanged(incidencePtr);
119 Q_EMIT originalIncidencePtrChanged();
125 return m_originalIncidence;
128int IncidenceWrapper::incidenceType()
const
130 return m_incidence->type();
133QString IncidenceWrapper::incidenceTypeStr()
const
138QString IncidenceWrapper::incidenceIconName()
const
140 return m_incidence->iconName();
143QString IncidenceWrapper::uid()
const
145 return m_incidence->uid();
148qint64 IncidenceWrapper::collectionId()
const
153void IncidenceWrapper::setCollectionId(qint64 collectionId)
155 m_collectionId = collectionId;
156 Q_EMIT collectionIdChanged();
159QString IncidenceWrapper::parent()
const
161 return m_incidence->relatedTo();
164void IncidenceWrapper::setParent(
QString parent)
166 m_incidence->setRelatedTo(parent);
167 updateParentIncidence();
173 updateParentIncidence();
174 return m_parentIncidence.
data();
177QVariantList IncidenceWrapper::childIncidences()
179 resetChildIncidences();
180 return m_childIncidences;
183QString IncidenceWrapper::summary()
const
185 return m_incidence->summary();
188void IncidenceWrapper::setSummary(
const QString &summary)
190 m_incidence->setSummary(summary);
196 return m_incidence->categories();
199void IncidenceWrapper::setCategories(
QStringList categories)
201 m_incidence->setCategories(categories);
202 Q_EMIT categoriesChanged();
205QString IncidenceWrapper::description()
const
207 return m_incidence->description();
210void IncidenceWrapper::setDescription(
const QString &description)
212 if (m_incidence->description() == description) {
215 m_incidence->setDescription(description);
216 Q_EMIT descriptionChanged();
219QString IncidenceWrapper::location()
const
221 return m_incidence->location();
224void IncidenceWrapper::setLocation(
const QString &location)
226 m_incidence->setLocation(location);
230bool IncidenceWrapper::hasGeo()
const
232 return m_incidence->hasGeo();
235float IncidenceWrapper::geoLatitude()
const
237 return m_incidence->geoLatitude();
240float IncidenceWrapper::geoLongitude()
const
242 return m_incidence->geoLongitude();
245QDateTime IncidenceWrapper::incidenceStart()
const
247 return m_incidence->dtStart();
250void IncidenceWrapper::setIncidenceStart(
const QDateTime &incidenceStart,
bool respectTimeZone)
258 auto oldStart = this->incidenceStart();
261 m_incidence->setDtStart(incidenceStart);
266 const auto date = incidenceStart.
date();
267 const auto time = incidenceStart.
time();
272 m_incidence->setDtStart(
start);
279 Q_EMIT incidenceStartChanged();
280 Q_EMIT incidenceStartDateDisplayChanged();
281 Q_EMIT incidenceStartTimeDisplayChanged();
283 Q_EMIT durationDisplayStringChanged();
286void IncidenceWrapper::setIncidenceStartDate(
int day,
int month,
int year)
289 date.
setDate(year, month, day);
297void IncidenceWrapper::setIncidenceStartTime(
int hours,
int minutes)
300 time.
setHMS(hours, minutes, 0);
308QString IncidenceWrapper::incidenceStartDateDisplay()
const
313QString IncidenceWrapper::incidenceStartTimeDisplay()
const
318QDateTime IncidenceWrapper::incidenceEnd()
const
320 if (m_incidence->type() == KCalendarCore::Incidence::IncidenceType::TypeEvent) {
322 return event->
dtEnd();
323 }
else if (m_incidence->type() == KCalendarCore::Incidence::IncidenceType::TypeTodo) {
325 return todo->dtDue();
330void IncidenceWrapper::setIncidenceEnd(
const QDateTime &incidenceEnd,
bool respectTimeZone)
336 const auto date = incidenceEnd.
date();
337 const auto time = incidenceEnd.
time();
343 if (m_incidence->type() == KCalendarCore::Incidence::IncidenceType::TypeEvent) {
346 }
else if (m_incidence->type() == KCalendarCore::Incidence::IncidenceType::TypeTodo) {
350 qWarning() <<
"Unknown incidence type";
352 Q_EMIT incidenceEndChanged();
353 Q_EMIT incidenceEndDateDisplayChanged();
354 Q_EMIT incidenceEndTimeDisplayChanged();
356 Q_EMIT durationDisplayStringChanged();
359void IncidenceWrapper::setIncidenceEndDate(
int day,
int month,
int year)
362 date.
setDate(year, month, day);
364 auto newEnd = incidenceEnd();
367 setIncidenceEnd(
newEnd,
true);
370void IncidenceWrapper::setIncidenceEndTime(
int hours,
int minutes)
373 time.
setHMS(hours, minutes, 0);
375 auto newEnd = incidenceEnd();
378 setIncidenceEnd(
newEnd,
true);
381QString IncidenceWrapper::incidenceEndDateDisplay()
const
386QString IncidenceWrapper::incidenceEndTimeDisplay()
const
391void IncidenceWrapper::setIncidenceTimeToNearestQuarterHour(
bool setStartTime,
bool setEndTime)
399 setIncidenceStart(startTime,
true);
402 setIncidenceEnd(startTime.addSecs(3600),
true);
411void IncidenceWrapper::setTimeZone(
const QByteArray &timeZone)
414 if (
start.isValid()) {
416 setIncidenceStart(
start,
true);
422 setIncidenceEnd(end,
true);
426 Q_EMIT startTimeZoneUTCOffsetMinsChanged();
427 Q_EMIT endTimeZoneUTCOffsetMinsChanged();
430int IncidenceWrapper::startTimeZoneUTCOffsetMins()
435int IncidenceWrapper::endTimeZoneUTCOffsetMins()
442 return m_incidence->duration();
458QString IncidenceWrapper::durationDisplayString()
const
460 return formatSpelloutDuration(duration(), m_format, allDay());
463bool IncidenceWrapper::allDay()
const
465 return m_incidence->allDay();
468void IncidenceWrapper::setAllDay(
bool allDay)
470 m_incidence->setAllDay(allDay);
474int IncidenceWrapper::priority()
const
476 return m_incidence->priority();
479void IncidenceWrapper::setPriority(
int priority)
481 m_incidence->setPriority(priority);
491QVariantMap IncidenceWrapper::recurrenceData()
500 QVariantList monthPositions;
512 {QStringLiteral(
"duration"), m_incidence->recurrence()->duration()},
513 {QStringLiteral(
"frequency"), m_incidence->recurrence()->frequency()},
514 {QStringLiteral(
"startDateTime"), m_incidence->recurrence()->startDateTime()},
516 {QStringLiteral(
"endDateTime"), m_incidence->recurrence()->endDateTime()},
518 {QStringLiteral(
"allDay"), m_incidence->recurrence()->allDay()},
519 {QStringLiteral(
"type"), m_incidence->recurrence()->recurrenceType()},
520 {QStringLiteral(
"monthDays"),
QVariant::fromValue(m_incidence->recurrence()->monthDays())},
521 {QStringLiteral(
"monthPositions"), monthPositions},
523 {QStringLiteral(
"yearDates"),
QVariant::fromValue(m_incidence->recurrence()->yearDates())},
524 {QStringLiteral(
"yearMonths"),
QVariant::fromValue(m_incidence->recurrence()->yearMonths())},
528void IncidenceWrapper::setRecurrenceDataItem(
const QString &key,
const QVariant &value)
530 QVariantMap
map = recurrenceData();
531 if (
map.contains(key)) {
535 if (!
jsval.isArray()) {
539 auto vlist =
jsval.toVariant().value<QVariantList>();
542 for (
int i = 0;
i <
vlist.size();
i++) {
549 for (
int i = 0;
i < 7; ++
i) {
550 if (days.testBit(
i)) {
556 rrule->setByDays(positions);
557 m_incidence->recurrence()->updated();
559 }
else if (key == QStringLiteral(
"duration")) {
560 m_incidence->recurrence()->setDuration(value.
toInt());
562 }
else if (key == QStringLiteral(
"frequency")) {
563 m_incidence->recurrence()->setFrequency(value.
toInt());
565 }
else if ((key == QStringLiteral(
"startDateTime") || key == QStringLiteral(
"endDateTime")) && value.
toDateTime().
isValid()) {
568 adjustedDt.setTimeZone(incidenceEnd().timeZone());
572 if (key == QStringLiteral(
"startDateTime")) {
573 m_incidence->recurrence()->setStartDateTime(
adjustedDt,
false);
575 }
else if (key == QStringLiteral(
"endDateTime")) {
576 m_incidence->recurrence()->setEndDateTime(
adjustedDt);
579 }
else if (key == QStringLiteral(
"allDay")) {
580 m_incidence->recurrence()->setAllDay(value.
toBool());
597 for (
const auto &pos : values) {
599 newPos.setDay(pos[QStringLiteral(
"day")].toInt());
600 newPos.setPos(pos[QStringLiteral(
"pos")].toInt());
607 Q_EMIT recurrenceDataChanged();
610QString IncidenceWrapper::googleConferenceUrl()
612 return m_incidence->customProperty(
"LIBKGAPI",
"EventHangoutLink");
615QVariantMap IncidenceWrapper::organizer()
643bool IncidenceWrapper::todoCompleted()
650 return todo->isCompleted();
653void IncidenceWrapper::setTodoCompleted(
bool completed)
660 todo->setCompleted(completed);
662 Q_EMIT todoCompletionDtChanged();
663 Q_EMIT todoPercentCompleteChanged();
664 Q_EMIT incidenceIconNameChanged();
665 Q_EMIT todoCompletedChanged();
668QDateTime IncidenceWrapper::todoCompletionDt()
675 return todo->completed();
678int IncidenceWrapper::todoPercentComplete()
685 return todo->percentComplete();
688void IncidenceWrapper::setTodoPercentComplete(
int todoPercentComplete)
695 todo->setPercentComplete(todoPercentComplete);
697 Q_EMIT todoPercentCompleteChanged();
699 if (todoPercentComplete < 100 && todoCompleted()) {
700 setTodoCompleted(
false);
703 Q_EMIT todoCompletedChanged();
706void IncidenceWrapper::triggerEditMode()
714static int nearestQuarterHour(
int secsSinceEpoch)
716 const int quarterHourInSecs = 60 * 15;
717 return secsSinceEpoch + (quarterHourInSecs - secsSinceEpoch % quarterHourInSecs);
720void IncidenceWrapper::setNewEvent()
725 event->setDtStart(
start);
726 event->setDtEnd(
start.addSecs(60 * 60));
729 alarm->setEnabled(
true);
731 alarm->setStartOffset(-1 * 15 * 60);
733 event->addAlarm(
alarm);
735 setNewIncidence(
event);
738void IncidenceWrapper::setNewTodo()
741 setNewIncidence(todo);
748 setIncidenceItem(incidenceItem);
760void IncidenceWrapper::updateParentIncidence()
766 if (!parent().isEmpty() && (!m_parentIncidence || m_parentIncidence->uid() != parent())) {
768 m_parentIncidence->setIncidenceItem(CalendarManager::instance()->incidenceItem(parent()));
769 Q_EMIT parentIncidenceChanged();
773void IncidenceWrapper::resetChildIncidences()
775 cleanupChildIncidences();
781 const auto incidences = CalendarManager::instance()->childIncidences(uid());
784 for (
const auto &incidence : incidences) {
786 wrappedIncidence->setIncidenceItem(CalendarManager::instance()->incidenceItem(incidence));
791 Q_EMIT childIncidencesChanged();
794void IncidenceWrapper::cleanupChildIncidences()
796 while (!m_childIncidences.isEmpty()) {
797 const auto incidence = m_childIncidences.takeFirst();
806 for (
int i = 0;
i < alarms.
size();
i++) {
807 m_incidence->addAlarm(alarms[
i]);
811void IncidenceWrapper::setRegularRecurrence(IncidenceWrapper::RecurrenceIntervals interval,
int freq)
815 m_incidence->recurrence()->setDaily(
freq);
816 Q_EMIT recurrenceDataChanged();
819 m_incidence->recurrence()->setWeekly(
freq);
820 Q_EMIT recurrenceDataChanged();
823 m_incidence->recurrence()->setMonthly(
freq);
824 Q_EMIT recurrenceDataChanged();
827 m_incidence->recurrence()->setYearly(
freq);
828 Q_EMIT recurrenceDataChanged();
831 qWarning() <<
"Unknown interval for recurrence" << interval;
836void IncidenceWrapper::setMonthlyPosRecurrence(
short pos,
int day)
840 m_incidence->recurrence()->addMonthlyPos(pos,
daysBitArray);
843void IncidenceWrapper::setRecurrenceOccurrences(
int occurrences)
845 m_incidence->recurrence()->setDuration(
occurrences);
846 Q_EMIT recurrenceDataChanged();
849void IncidenceWrapper::clearRecurrences()
851 m_incidence->recurrence()->clear();
852 Q_EMIT recurrenceDataChanged();
859 setIncidenceItem(
item);
866 setCollectionId(collection.
id());
869#ifndef UNITY_CMAKE_SUPPORT
void setAncestorRetrieval(AncestorRetrieval ancestorDepth)
void fetchAllAttributes(bool fetch=true)
void setFetchRelations(bool fetchRelations)
void fetchFullPayload(bool fetch=true)
void setItem(const Item &item)
void setPayload(const T &p)
Collection & parentCollection()
This class is a wrapper for a KCalendarCore::Incidence::Ptr object.
void setDtEnd(const QDateTime &dtEnd)
QSharedPointer< Event > Ptr
virtual QDateTime dtEnd() const
QSharedPointer< Todo > Ptr
Q_SCRIPTABLE Q_NOREPLY void start()
QString i18n(const char *text, const TYPE &arg...)
AKONADI_CALENDAR_EXPORT KCalendarCore::Incidence::Ptr incidence(const Akonadi::Item &item)
AKONADI_CALENDAR_EXPORT KCalendarCore::Todo::Ptr todo(const Akonadi::Item &item)
const QList< QKeySequence > & end()
bool setDate(int year, int month, int day)
QDateTime addSecs(qint64 s) const const
QDateTime currentDateTime()
qint64 currentSecsSinceEpoch()
bool isValid() const const
void setSecsSinceEpoch(qint64 secs)
void setTimeZone(const QTimeZone &toZone)
QTimeZone timeZone() const const
void append(QList< T > &&value)
qsizetype size() const const
QString toString(QDate date, FormatType format) const const
virtual bool event(QEvent *e)
T qobject_cast(QObject *object)
QSharedPointer< X > staticCast() const const
QFuture< void > map(Iterator begin, Iterator end, MapFunctor &&function)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
bool setHMS(int h, int m, int s, int ms)
QByteArray id() const const
int offsetFromUtc(const QDateTime &atDateTime) const const
bool canConvert() const const
QVariant fromValue(T &&value)
bool toBool() const const
QDateTime toDateTime() const const
int toInt(bool *ok) const const