41 using namespace KCalCore;
48 class KCalCore::Todo::Private
54 Private(
const KCalCore::Todo::Private &other)
59 void init(
const KCalCore::Todo::Private &other);
63 KDateTime mDtRecurrence;
70 bool recurTodo(
Todo *todo);
73 void KCalCore::Todo::Private::init(
const KCalCore::Todo::Private &other)
75 mDtDue = other.mDtDue;
76 mDtRecurrence = other.mDtRecurrence;
77 mCompleted = other.mCompleted;
78 mPercentComplete = other.mPercentComplete;
84 : d(new KCalCore::
Todo::Private)
90 d(new KCalCore::
Todo::Private(*other.d))
101 return new Todo(*
this);
106 if (&other !=
this) {
108 const Todo *t =
static_cast<const Todo*
>(&other);
120 const Todo *t =
static_cast<const Todo*
>(&todo);
122 (!
dtDue().isValid() && !t->
dtDue().isValid())) &&
156 d->mDtRecurrence =
dtDue;
162 kDebug() <<
"To-do recurrences are now calculated against DTSTART. Fixing legacy to-do.";
178 if (
recurs() && !first && d->mDtRecurrence.isValid()) {
179 return d->mDtRecurrence;
187 return d->mDtDue.isValid();
197 d->mDtDue = KDateTime();
198 d->mDtRecurrence = KDateTime();
217 if (!
comments().filter(
"NoStartDate").count()) {
221 QString s(
"NoStartDate");
241 if (
recurs() && !first && d->mDtRecurrence.isValid()) {
257 return d->mPercentComplete == 100;
264 d->mPercentComplete = 100;
266 d->mPercentComplete = 0;
267 d->mCompleted = KDateTime();
276 return d->mCompleted;
285 if (!d->recurTodo(
this)) {
286 d->mPercentComplete = 100;
287 d->mCompleted = completed.toUtc();
295 return d->mCompleted.isValid();
300 return d->mPercentComplete;
307 }
else if (percent < 0) {
312 d->mPercentComplete = percent;
313 if (percent != 100) {
314 d->mCompleted = KDateTime();
326 if (d->mPercentComplete > 0) {
332 QDate currDate = QDate::currentDate();
333 if (
dtStart(first).date() <= currDate && currDate <
dtDue(first).date()) {
337 KDateTime currDate = KDateTime::currentUtcDateTime();
338 if (
dtStart(first) <= currDate && currDate <
dtDue(first)) {
358 if (d->mPercentComplete > 0) {
367 if (
dtStart(first).date() >= QDate::currentDate()) {
371 if (
dtStart(first) >= KDateTime::currentUtcDateTime()) {
379 const KDateTime::Spec &newSpec)
382 d->mDtDue = d->mDtDue.toTimeSpec(oldSpec);
383 d->mDtDue.setTimeSpec(newSpec);
385 d->mDtRecurrence = d->mDtRecurrence.toTimeSpec(oldSpec);
386 d->mDtRecurrence.setTimeSpec(newSpec);
389 d->mCompleted = d->mCompleted.toTimeSpec(oldSpec);
390 d->mCompleted.setTimeSpec(newSpec);
396 d->mDtRecurrence = dt;
402 return d->mDtRecurrence.isValid() ? d->mDtRecurrence : d->mDtDue;
407 QDate today = QDate::currentDate();
410 !(date < today && d->mDtRecurrence.date() < today &&
416 if (!
dtDue().isValid()) {
420 const bool inPast =
allDay() ?
421 dtDue().date() < QDate::currentDate() :
422 dtDue() < KDateTime::currentUtcDateTime();
437 bool Todo::Private::recurTodo(
Todo *todo)
439 if (todo && todo->
recurs()) {
441 const KDateTime recurrenceEndDateTime = r->
endDateTime();
445 (nextOccurrenceDateTime.isValid() && recurrenceEndDateTime.isValid() &&
446 nextOccurrenceDateTime <= recurrenceEndDateTime))) {
448 const KDateTime rightNow =
449 KDateTime::currentUtcDateTime().toTimeSpec(nextOccurrenceDateTime.timeSpec());
450 const bool isDateOnly = todo->
allDay();
458 while (!todo->
recursAt(nextOccurrenceDateTime) ||
459 (!isDateOnly && nextOccurrenceDateTime <= rightNow) ||
460 (isDateOnly && nextOccurrenceDateTime.date() < rightNow.date())) {
462 if (!nextOccurrenceDateTime.isValid() ||
463 (nextOccurrenceDateTime > recurrenceEndDateTime && r->
duration() != -1)) {
483 return v.
visit(incidence.staticCast<
Todo>());
503 case RoleEndRecurrenceBase:
515 }
else if (alarm->hasEndOffset() &&
hasDueDate()) {
545 kDebug() <<
"Unhandled role" << role;
563 return QLatin1String(
"application/x-vnd.akonadi.calendar.todo");
570 if (
recurs() && occurrenceDT.isDateOnly()) {
571 occurrenceDT.setTime(QTime(0, 0));
574 const bool usesCompletedTaskPixmap =
isCompleted() ||
575 (
recurs() && occurrenceDT.isValid() &&
576 occurrenceDT <
dtDue(
false));
578 if (usesCompletedTaskPixmap) {
579 return QLatin1String(
"task-complete");
581 return QLatin1String(
"view-calendar-tasks");