KCalendarCore

todo.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the kcalcore library.
3 
4  SPDX-FileCopyrightText: 2001-2003 Cornelius Schumacher <[email protected]>
5  SPDX-FileCopyrightText: 2009 Allen Winter <[email protected]>
6 
7  SPDX-License-Identifier: LGPL-2.0-or-later
8 */
9 /**
10  @file
11  This file is part of the API for handling calendar data and
12  defines the Todo class.
13 
14  @brief
15  Provides a To-do in the sense of RFC2445.
16 
17  @author Cornelius Schumacher <[email protected]>
18  @author Allen Winter <[email protected]>
19 */
20 
21 #include "todo.h"
22 #include "recurrence.h"
23 #include "utils_p.h"
24 #include "visitor.h"
25 
26 #include "kcalendarcore_debug.h"
27 
28 #include <QTime>
29 
30 using namespace KCalendarCore;
31 
32 /**
33  Private class that helps to provide binary compatibility between releases.
34  @internal
35 */
36 //@cond PRIVATE
37 class Q_DECL_HIDDEN KCalendarCore::Todo::Private
38 {
39  Todo *const q;
40 
41  QDateTime mDtDue; // to-do due date (if there is one); also the first occurrence of a recurring to-do
42  QDateTime mDtRecurrence; // next occurrence (for recurring to-dos)
43  QDateTime mCompleted; // to-do completion date (if it has been completed)
44  int mPercentComplete = 0; // to-do percent complete [0,100]
45 
46 public:
47 
48  Private(Todo *todo)
49  : q(todo)
50  {
51  }
52 
53  Private(Todo * todo, const KCalendarCore::Todo::Private &other)
54  : q(todo)
55  {
56  init(other);
57  }
58 
59  void init(const KCalendarCore::Todo::Private &other);
60 
61  void setDtDue(const QDateTime dd);
62  QDateTime dtDue() const
63  {
64  return mDtDue;
65  }
66 
67  void setDtRecurrence(const QDateTime dr);
68  QDateTime dtRecurrence() const
69  {
70  return mDtRecurrence;
71  }
72 
73  void setCompleted(const QDateTime dc);
74  QDateTime completed() const
75  {
76  return mCompleted;
77  }
78 
79  void setPercentComplete(const int pc);
80  int percentComplete()
81  {
82  return mPercentComplete;
83  }
84 
85  /**
86  Returns true if the todo got a new date, else false will be returned.
87  */
88  bool recurTodo(Todo *todo);
89 };
90 
91 void Todo::Private::setDtDue(const QDateTime dd)
92 {
93  if (dd != mDtDue) {
94  mDtDue = dd;
95  q->setFieldDirty(FieldDtDue);
96  }
97 }
98 
99 void Todo::Private::setDtRecurrence(const QDateTime dr)
100 {
101  if (dr != mDtRecurrence) {
102  mDtRecurrence = dr;
103  q->setFieldDirty(FieldRecurrenceId);
104  }
105 }
106 
107 void Todo::Private::setCompleted(const QDateTime dc)
108 {
109  if (dc != mCompleted) {
110  mCompleted = dc.toUTC();
111  q->setFieldDirty(FieldCompleted);
112  }
113 }
114 
115 void Todo::Private::setPercentComplete(const int pc)
116 {
117  if (pc != mPercentComplete) {
118  mPercentComplete = pc;
119  q->setFieldDirty(FieldPercentComplete);
120  }
121 }
122 
123 void KCalendarCore::Todo::Private::init(const KCalendarCore::Todo::Private &other)
124 {
125  mDtDue = other.mDtDue;
126  mDtRecurrence = other.mDtRecurrence;
127  mCompleted = other.mCompleted;
128  mPercentComplete = other.mPercentComplete;
129 }
130 
131 //@endcond
132 
133 Todo::Todo()
134  : d(new KCalendarCore::Todo::Private(this))
135 {
136 }
137 
138 Todo::Todo(const Todo &other)
139  : Incidence(other)
140  , d(new KCalendarCore::Todo::Private(*other.d))
141 {
142 }
143 
144 Todo::Todo(const Incidence &other)
145  : Incidence(other)
146  , d(new KCalendarCore::Todo::Private(this))
147 {
148 }
149 
150 Todo::~Todo()
151 {
152  delete d;
153 }
154 
155 Todo *Todo::clone() const
156 {
157  return new Todo(*this);
158 }
159 
161 {
162  if (&other != this) {
163  Incidence::assign(other);
164  const Todo *t = static_cast<const Todo *>(&other);
165  d->init(*(t->d));
166  }
167  return *this;
168 }
169 
170 bool Todo::equals(const IncidenceBase &todo) const
171 {
172  if (!Incidence::equals(todo)) {
173  return false;
174  } else {
175  // If they weren't the same type IncidenceBase::equals would had returned false already
176  const Todo *t = static_cast<const Todo *>(&todo);
177  return ((dtDue() == t->dtDue()) || (!dtDue().isValid() && !t->dtDue().isValid())) && hasDueDate() == t->hasDueDate()
178  && hasStartDate() == t->hasStartDate() && ((completed() == t->completed()) || (!completed().isValid() && !t->completed().isValid()))
179  && hasCompletedDate() == t->hasCompletedDate() && percentComplete() == t->percentComplete();
180  }
181 }
182 
184 {
185  return TypeTodo;
186 }
187 
189 {
190  return QByteArrayLiteral("Todo");
191 }
192 void Todo::setDtDue(const QDateTime &dtDue, bool first)
193 {
194  startUpdates();
195 
196  // int diffsecs = d->mDtDue.secsTo(dtDue);
197 
198  /*if (mReadOnly) return;
199  const Alarm::List& alarms = alarms();
200  for (Alarm *alarm = alarms.first(); alarm; alarm = alarms.next()) {
201  if (alarm->enabled()) {
202  alarm->setTime(alarm->time().addSecs(diffsecs));
203  }
204  }*/
205 
206  if (recurs() && !first) {
207  d->setDtRecurrence(dtDue);
208  } else {
209  d->setDtDue(dtDue);
210  }
211 
212  if (recurs() && dtDue.isValid() && (!dtStart().isValid() || dtDue < recurrence()->startDateTime())) {
213  qCDebug(KCALCORE_LOG) << "To-do recurrences are now calculated against DTSTART. Fixing legacy to-do.";
214  setDtStart(dtDue);
215  }
216 
217  /*const Alarm::List& alarms = alarms();
218  for (Alarm *alarm = alarms.first(); alarm; alarm = alarms.next())
219  alarm->setAlarmStart(d->mDtDue);*/
220  endUpdates();
221 }
222 
223 QDateTime Todo::dtDue(bool first) const
224 {
225  if (!hasDueDate()) {
226  return QDateTime();
227  }
228 
229  const QDateTime start = IncidenceBase::dtStart();
230  if (recurs() && !first && d->dtRecurrence().isValid()) {
231  if (start.isValid()) {
232  // This is the normal case, recurring to-dos have a valid DTSTART.
233  const qint64 duration = start.daysTo(d->dtDue());
234  QDateTime dt = d->dtRecurrence().addDays(duration);
235  dt.setTime(d->dtDue().time());
236  return dt;
237  } else {
238  // This is a legacy case, where recurrence was calculated against DTDUE
239  return d->dtRecurrence();
240  }
241  }
242 
243  return d->dtDue();
244 }
245 
246 bool Todo::hasDueDate() const
247 {
248  return d->dtDue().isValid();
249 }
250 
251 bool Todo::hasStartDate() const
252 {
253  return IncidenceBase::dtStart().isValid();
254 }
255 
257 {
258  return dtStart(/*first=*/false);
259 }
260 
261 QDateTime Todo::dtStart(bool first) const
262 {
263  if (!hasStartDate()) {
264  return QDateTime();
265  }
266 
267  if (recurs() && !first && d->dtRecurrence().isValid()) {
268  return d->dtRecurrence();
269  } else {
270  return IncidenceBase::dtStart();
271  }
272 }
273 
274 bool Todo::isCompleted() const
275 {
276  return d->percentComplete() == 100 || status() == StatusCompleted || hasCompletedDate();
277 }
278 
279 void Todo::setCompleted(bool completed)
280 {
281  update();
282  if (completed) {
283  d->setPercentComplete(100);
284  } else {
285  d->setPercentComplete(0);
286  if (hasCompletedDate()) {
287  d->setCompleted(QDateTime());
288  }
289  }
290  updated();
291 
292  setStatus(completed ? StatusCompleted : StatusNone); // Calls update()/updated().
293 }
294 
296 {
297  if (hasCompletedDate()) {
298  return d->completed();
299  } else {
300  return QDateTime();
301  }
302 }
303 
304 void Todo::setCompleted(const QDateTime &completed)
305 {
306  update();
307  if (!d->recurTodo(this)) {
308  d->setPercentComplete(100);
309  d->setCompleted(completed);
310  }
311  updated();
312  if (status() != StatusNone) {
313  setStatus(StatusCompleted); // Calls update()/updated()
314  }
315 }
316 
318 {
319  return d->completed().isValid();
320 }
321 
323 {
324  return d->percentComplete();
325 }
326 
327 void Todo::setPercentComplete(int percent)
328 {
329  if (percent > 100) {
330  percent = 100;
331  } else if (percent < 0) {
332  percent = 0;
333  }
334 
335  update();
336  d->setPercentComplete(percent);
337  if (percent != 100) {
338  d->setCompleted(QDateTime());
339  }
340  updated();
341  if (percent != 100 && status() == Incidence::StatusCompleted) {
342  setStatus(Incidence::StatusNone); // Calls update()/updated().
343  }
344 }
345 
346 bool Todo::isInProgress(bool first) const
347 {
348  if (isOverdue()) {
349  return false;
350  }
351 
352  if (d->percentComplete() > 0) {
353  return true;
354  }
355 
356  if (hasStartDate() && hasDueDate()) {
357  if (allDay()) {
358  QDate currDate = QDate::currentDate();
359  if (dtStart(first).date() <= currDate && currDate < dtDue(first).date()) {
360  return true;
361  }
362  } else {
364  if (dtStart(first) <= currDate && currDate < dtDue(first)) {
365  return true;
366  }
367  }
368  }
369 
370  return false;
371 }
372 
373 bool Todo::isOpenEnded() const
374 {
375  if (!hasDueDate() && !isCompleted()) {
376  return true;
377  }
378  return false;
379 }
380 
381 bool Todo::isNotStarted(bool first) const
382 {
383  if (d->percentComplete() > 0) {
384  return false;
385  }
386 
387  if (!hasStartDate()) {
388  return false;
389  }
390 
391  if (allDay()) {
392  if (dtStart(first).date() >= QDate::currentDate()) {
393  return false;
394  }
395  } else {
396  if (dtStart(first) >= QDateTime::currentDateTimeUtc()) {
397  return false;
398  }
399  }
400  return true;
401 }
402 
403 void Todo::shiftTimes(const QTimeZone &oldZone, const QTimeZone &newZone)
404 {
405  Incidence::shiftTimes(oldZone, newZone);
406  auto dt = d->dtDue().toTimeZone(oldZone);
407  dt.setTimeZone(newZone);
408  d->setDtDue(dt);
409  if (recurs()) {
410  auto dr = d->dtRecurrence().toTimeZone(oldZone);
411  dr.setTimeZone(newZone);
412  d->setDtRecurrence(dr);
413  }
414  if (hasCompletedDate()) {
415  auto dc = d->completed().toTimeZone(oldZone);
416  dc.setTimeZone(newZone);
417  d->setCompleted(dc);
418  }
419 }
420 
422 {
423  d->setDtRecurrence(dt);
424 }
425 
427 {
428  return d->dtRecurrence().isValid() ? d->dtRecurrence() : d->dtDue();
429 }
430 
431 bool Todo::recursOn(const QDate &date, const QTimeZone &timeZone) const
432 {
433  QDate today = QDate::currentDate();
434  return Incidence::recursOn(date, timeZone) && !(date < today && d->dtRecurrence().date() < today && d->dtRecurrence() > recurrence()->startDateTime());
435 }
436 
437 bool Todo::isOverdue() const
438 {
439  if (!dtDue().isValid()) {
440  return false; // if it's never due, it can't be overdue
441  }
442 
443  const bool inPast = allDay() ? dtDue().date() < QDate::currentDate() : dtDue() < QDateTime::currentDateTimeUtc();
444 
445  return inPast && !isCompleted();
446 }
447 
448 void Todo::setAllDay(bool allday)
449 {
450  if (allday != allDay() && !mReadOnly) {
451  if (hasDueDate()) {
452  setFieldDirty(FieldDtDue);
453  }
454  Incidence::setAllDay(allday);
455  }
456 }
457 
458 //@cond PRIVATE
459 bool Todo::Private::recurTodo(Todo *todo)
460 {
461  if (todo && todo->recurs()) {
462  Recurrence *r = todo->recurrence();
463  const QDateTime recurrenceEndDateTime = r->endDateTime();
464  QDateTime nextOccurrenceDateTime = r->getNextDateTime(todo->dtStart());
465 
466  if ((r->duration() == -1 || (nextOccurrenceDateTime.isValid() && recurrenceEndDateTime.isValid() && nextOccurrenceDateTime <= recurrenceEndDateTime))) {
467  // We convert to the same timeSpec so we get the correct .date()
468  const auto rightNow = QDateTime::currentDateTimeUtc().toTimeZone(nextOccurrenceDateTime.timeZone());
469  const bool isDateOnly = todo->allDay();
470 
471  /* Now we search for the occurrence that's _after_ the currentUtcDateTime, or
472  * if it's dateOnly, the occurrrence that's _during or after today_.
473  * The reason we use "<" for date only, but "<=" for occurrences with time is that
474  * if it's date only, the user can still complete that occurrence today, so that's
475  * the current occurrence that needs completing.
476  */
477  while (!todo->recursAt(nextOccurrenceDateTime) || (!isDateOnly && nextOccurrenceDateTime <= rightNow)
478  || (isDateOnly && nextOccurrenceDateTime.date() < rightNow.date())) {
479  if (!nextOccurrenceDateTime.isValid() || (nextOccurrenceDateTime > recurrenceEndDateTime && r->duration() != -1)) {
480  return false;
481  }
482  nextOccurrenceDateTime = r->getNextDateTime(nextOccurrenceDateTime);
483  }
484 
485  todo->setDtRecurrence(nextOccurrenceDateTime);
486  todo->setCompleted(false);
487  todo->setRevision(todo->revision() + 1);
488 
489  return true;
490  }
491  }
492 
493  return false;
494 }
495 //@endcond
496 
497 bool Todo::accept(Visitor &v, const IncidenceBase::Ptr &incidence)
498 {
499  return v.visit(incidence.staticCast<Todo>());
500 }
501 
503 {
504  switch (role) {
505  case RoleAlarmStartOffset:
506  return dtStart();
507  case RoleAlarmEndOffset:
508  return dtDue();
509  case RoleSort:
510  // Sorting to-dos first compares dtDue, then dtStart if
511  // dtDue doesn't exist
512  return hasDueDate() ? dtDue() : dtStart();
513  case RoleCalendarHashing:
514  return dtDue();
515  case RoleStartTimeZone:
516  return dtStart();
517  case RoleEndTimeZone:
518  return dtDue();
519  case RoleEndRecurrenceBase:
520  return dtDue();
521  case RoleDisplayStart:
522  case RoleDisplayEnd:
523  return dtDue().isValid() ? dtDue() : dtStart();
524  case RoleAlarm:
525  if (alarms().isEmpty()) {
526  return QDateTime();
527  } else {
528  Alarm::Ptr alarm = alarms().at(0);
529  if (alarm->hasStartOffset() && hasStartDate()) {
530  return dtStart();
531  } else if (alarm->hasEndOffset() && hasDueDate()) {
532  return dtDue();
533  } else {
534  // The application shouldn't add alarms on to-dos without dates.
535  return QDateTime();
536  }
537  }
538  case RoleRecurrenceStart:
539  if (dtStart().isValid()) {
540  return dtStart();
541  }
542  return dtDue(); // For the sake of backwards compatibility
543  // where we calculated recurrences based on dtDue
544  case RoleEnd:
545  return dtDue();
546  default:
547  return QDateTime();
548  }
549 }
550 
551 void Todo::setDateTime(const QDateTime &dateTime, DateTimeRole role)
552 {
553  switch (role) {
554  case RoleDnD:
555  setDtDue(dateTime);
556  break;
557  case RoleEnd:
558  setDtDue(dateTime, true);
559  break;
560  default:
561  qCDebug(KCALCORE_LOG) << "Unhandled role" << role;
562  }
563 }
564 
565 void Todo::virtual_hook(VirtualHook id, void *data)
566 {
567  Q_UNUSED(id);
568  Q_UNUSED(data);
569 }
570 
572 {
573  return Todo::todoMimeType();
574 }
575 
577 {
578  return QLatin1String("application/x-vnd.akonadi.calendar.todo");
579 }
580 
581 QLatin1String Todo::iconName(const QDateTime &recurrenceId) const
582 {
583  const bool usesCompletedTaskPixmap = isCompleted() || (recurs() && recurrenceId.isValid() && (recurrenceId < dtStart(/*first=*/false)));
584 
585  if (usesCompletedTaskPixmap) {
586  return QLatin1String("task-complete");
587  } else {
588  return QLatin1String("view-calendar-tasks");
589  }
590 }
591 
592 void Todo::serialize(QDataStream &out) const
593 {
595  serializeQDateTimeAsKDateTime(out, d->dtDue());
596  serializeQDateTimeAsKDateTime(out, d->dtRecurrence());
597  serializeQDateTimeAsKDateTime(out, d->completed());
598  out << d->percentComplete();
599 }
600 
601 void Todo::deserialize(QDataStream &in)
602 {
604  d->setDtDue(deserializeKDateTimeAsQDateTime(in));
605  d->setDtRecurrence(deserializeKDateTimeAsQDateTime(in));
606  d->setCompleted(deserializeKDateTimeAsQDateTime(in));
607  int pc;
608  in >> pc;
609  d->setPercentComplete(pc);
610  resetDirtyFields();
611 }
612 
614 {
615  return true;
616 }
bool isInProgress(bool first) const
Returns true, if the to-do is in-progress (started, or >0% completed); otherwise return false...
Definition: todo.cpp:346
QLatin1String iconName(const QDateTime &recurrenceId={}) const override
Returns the name of the icon that best represents this incidence.
Definition: todo.cpp:581
int duration() const
Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the total number of re...
Definition: recurrence.cpp:484
bool hasStartDate() const
Returns if the todo has a start datetime.
Definition: todo.cpp:251
bool isCompleted() const
Returns whether the todo is completed or not.
Definition: todo.cpp:274
QDateTime toUTC() const const
void setPercentComplete(int percent)
Sets what percentage of the to-do is completed.
Definition: todo.cpp:327
Todo()
Constructs an empty to-do.
This class provides the interface for a visitor of calendar components.
Definition: visitor.h:30
void serialize(QDataStream &out) const override
Sub-type specific serialization.
Definition: incidence.cpp:1128
void setDtRecurrence(const QDateTime &dt)
Sets the due date/time of the current occurrence if recurrent.
Definition: todo.cpp:421
void virtual_hook(VirtualHook id, void *data) override
Standard trick to add virtuals later.
Definition: todo.cpp:565
virtual bool recursOn(const QDate &date, const QTimeZone &timeZone) const
Returns true if the date specified is one on which the event will recur.
Definition: incidence.cpp:614
qint64 daysTo(const QDateTime &other) const const
QDateTime dtStart() const override
Definition: todo.cpp:256
QDateTime endDateTime() const
Returns the date/time of the last recurrence.
Definition: recurrence.cpp:418
bool recurs() const
Returns whether the event recurs at all.
Definition: incidence.cpp:605
QLatin1String mimeType() const override
Returns the Akonadi specific sub MIME type of a KCalendarCore::IncidenceBase item, e.g.
Definition: todo.cpp:571
void setTime(const QTime &time)
QByteArray typeStr() const override
Prints the type of incidence as a string.
bool isOpenEnded() const
Returns true, if the to-do is open-ended (no due date); false otherwise.
Definition: todo.cpp:373
int percentComplete() const
Returns what percentage of the to-do is completed.
Definition: todo.cpp:322
bool hasDueDate() const
Returns if the todo has a due datetime.
Definition: todo.cpp:246
QDateTime toTimeZone(const QTimeZone &timeZone) const const
void shiftTimes(const QTimeZone &oldZone, const QTimeZone &newZone) override
Shift the times of the incidence so that they appear at the same clock time as before but in a new ti...
Definition: todo.cpp:403
DateTimeRole
The different types of incidence date/times roles.
void setRevision(int rev)
Sets the number of revisions this incidence has seen.
Definition: incidence.cpp:382
void setCompleted(bool completed)
Sets completion percentage and status.
Definition: todo.cpp:279
An abstract class that provides a common base for all calendar incidence classes. ...
Definition: incidencebase.h:97
void setTimeZone(const QTimeZone &toZone)
void setAllDay(bool allDay) override
Definition: incidence.cpp:350
IncidenceType type() const override
Returns the incidence type.
bool isOverdue() const
Returns true if this todo is overdue (e.g.
Definition: todo.cpp:437
bool supportsGroupwareCommunication() const override
Definition: todo.cpp:613
QDateTime dtDue(bool first=false) const
Returns the todo due datetime.
Definition: todo.cpp:223
void setDtDue(const QDateTime &dtDue, bool first=false)
Sets due date and time.
Status status() const
Returns the status of this message.
Todo * clone() const override
Returns an exact copy of this todo.
This file is part of the API for handling calendar data and defines the Todo class.
void shiftTimes(const QTimeZone &oldZone, const QTimeZone &newZone) override
Shift the times of the incidence so that they appear at the same clock time as before but in a new ti...
Definition: incidence.cpp:408
IncidenceBase & assign(const IncidenceBase &other) override
Provides polymorfic assignment.
bool recursAt(const QDateTime &dt) const
Returns true if the date/time specified is one at which the event will recur.
Definition: incidence.cpp:619
void setAllDay(bool allDay) override
Definition: todo.cpp:448
Provides a To-do in the sense of RFC2445.
Definition: todo.h:30
IncidenceType
The different types of incidences, per RFC2445.
QDateTime completed() const
Returns the to-do was completion datetime.
Definition: todo.cpp:295
QDateTime getNextDateTime(const QDateTime &preDateTime) const
Returns the start date/time of the earliest recurrence with a start date/time after the specified dat...
static QLatin1String todoMimeType()
Returns the Akonadi specific sub MIME type of a KCalendarCore::Todo.
Definition: todo.cpp:576
QCA_EXPORT void init()
bool isNotStarted(bool first) const
Returns true, if the to-do has yet to be started (no start date and 0% completed); otherwise return f...
Definition: todo.cpp:381
bool isValid() const const
bool recursOn(const QDate &date, const QTimeZone &timeZone) const override
Returns true if the date specified is one on which the to-do will recur.
Definition: todo.cpp:431
Recurrence * recurrence() const
Returns the recurrence rule associated with this incidence.
Definition: incidence.cpp:577
This class represents a recurrence rule for a calendar incidence.
Definition: recurrence.h:76
QDate date() const const
bool hasCompletedDate() const
Returns if the to-do has a completion datetime.
Definition: todo.cpp:317
QDateTime dateTime(DateTimeRole role) const override
Returns a date/time corresponding to the specified DateTimeRole.
Definition: todo.cpp:502
QDate currentDate()
void deserialize(QDataStream &in) override
Sub-type specific deserialization.
Definition: incidence.cpp:1154
virtual bool visit(const Event::Ptr &event)
Reimplement this function in your concrete subclass of IncidenceBase::Visitor to perform actions on a...
Definition: visitor.cpp:25
virtual QDateTime dtStart() const
Returns an incidence&#39;s starting date/time as a QDateTime.
QDateTime dtRecurrence() const
Returns the due date/time of the current occurrence if recurrent.
Definition: todo.cpp:426
Provides the abstract base class common to non-FreeBusy (Events, To-dos, Journals) calendar component...
Definition: incidence.h:56
void setDateTime(const QDateTime &dateTime, DateTimeRole role) override
Sets the date/time corresponding to the specified DateTimeRole.
Definition: todo.cpp:551
~Todo() override
Destroys a to-do.
QSharedPointer< X > staticCast() const const
QDateTime addDays(qint64 ndays) const const
IncidenceBase & assign(const IncidenceBase &other) override
Provides polymorfic assignment.
Definition: incidence.cpp:207
bool equals(const IncidenceBase &todo) const override
Compare this with todo for equality.
int revision() const
Returns the number of revisions this incidence has seen.
Definition: incidence.cpp:395
QDateTime currentDateTimeUtc()
bool equals(const IncidenceBase &incidence) const override
Compares this with Incidence incidence for equality.
Definition: incidence.cpp:220
Namespace for all KCalendarCore types.
Definition: alarm.h:36
QTimeZone timeZone() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Sat Sep 25 2021 22:52:09 by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.