void TodoTest::testRoles() { const KDateTime today = KDateTime::currentUtcDateTime(); const KDateTime yesterday = today.addDays(-1); Todo todo; todo.setDtStart(today.addDays(-1)); todo.setDtDue(today); QCOMPARE(todo.dateTime(Incidence::RoleDisplayStart), today); QCOMPARE(todo.dateTime(Incidence::RoleDisplayEnd), today); todo.setDtDue(KDateTime()); QCOMPARE(todo.dateTime(Incidence::RoleDisplayStart), yesterday); QCOMPARE(todo.dateTime(Incidence::RoleDisplayEnd), yesterday); }
void KOTodoView::setNewDate( QDate date ) { if ( !mActiveItem || !mChanger ) return; Todo *todo = mActiveItem->todo(); if ( !todo ) return; if ( !todo->isReadOnly() && mChanger->beginChange( todo ) ) { Todo *oldTodo = todo->clone(); QDateTime dt; dt.setDate( date ); if ( !todo->doesFloat() ) dt.setTime( todo->dtDue().time() ); if ( date.isNull() ) todo->setHasDueDate( false ); else if ( !todo->hasDueDate() ) todo->setHasDueDate( true ); todo->setDtDue( dt ); mActiveItem->construct(); mChanger->changeIncidence( oldTodo, todo, KOGlobals::COMPLETION_MODIFIED ); mChanger->endChange( todo ); delete oldTodo; } else { kdDebug(5850) << "No active item, active item is read-only, or locking failed" << endl; } }
Incidence * pasteIncidence( Incidence *inc, const QDate &newDate, const QTime *newTime = 0 ) { if ( inc ) { inc = inc->clone(); inc->recreate(); } if ( inc && newDate.isValid() ) { if ( inc->type() == "Event" ) { Event *anEvent = static_cast<Event*>( inc ); // Calculate length of event int daysOffset = anEvent->dtStart().date().daysTo( anEvent->dtEnd().date() ); // new end date if event starts at the same time on the new day KDateTime endDate( anEvent->dtEnd() ); endDate.setDate( newDate.addDays( daysOffset ) ); KDateTime startDate( anEvent->dtStart() ); startDate.setDate( newDate ); if ( newTime ) { // additional offset for new time of day int addSecsOffset( anEvent->dtStart().time().secsTo( *newTime ) ); endDate=endDate.addSecs( addSecsOffset ); startDate.setTime( *newTime ); } anEvent->setDtStart( startDate ); anEvent->setDtEnd( endDate ); } else if ( inc->type() == "Todo" ) { Todo *anTodo = static_cast<Todo*>( inc ); KDateTime dueDate( anTodo->dtDue() ); dueDate.setDate( newDate ); if ( newTime ) { dueDate.setTime( *newTime ); } anTodo->setDtDue( dueDate ); } else if ( inc->type() == "Journal" ) { Journal *anJournal = static_cast<Journal*>( inc ); KDateTime startDate( anJournal->dtStart() ); startDate.setDate( newDate ); if ( newTime ) { startDate.setTime( *newTime ); } else { startDate.setTime( QTime( 0, 0, 0 ) ); } anJournal->setDtStart( startDate ); } else { kDebug() << "Trying to paste unknown incidence of type" << inc->type(); } } return inc; }
void TodoTest::testValidity() { QDate dt = QDate::currentDate(); Todo *todo = new Todo(); todo->setDtStart(KDateTime(dt)); todo->setDtDue(KDateTime(dt).addDays(1)); todo->setSummary(QStringLiteral("To-do1 Summary")); todo->setDescription(QStringLiteral("This is a description of the first to-do")); todo->setLocation(QStringLiteral("the place")); todo->setPercentComplete(5); //KDE5: QVERIFY( todo->typeStr() == i18n( "to-do" ) ); QVERIFY(todo->summary() == QLatin1String("To-do1 Summary")); QVERIFY(todo->location() == QLatin1String("the place")); QVERIFY(todo->percentComplete() == 5); }
void KOTodoView::copyTodoToDate( QDate date ) { QDateTime dt( date ); if ( mActiveItem && mChanger ) { Todo *newTodo = mActiveItem->todo()->clone(); newTodo->recreate(); newTodo->setHasDueDate( !date.isNull() ); newTodo->setDtDue( dt ); newTodo->setPercentComplete( 0 ); // avoid forking if ( newTodo->doesRecur() ) newTodo->recurrence()->unsetRecurs(); mChanger->addIncidence( newTodo, this ); } }
/** Dissociate a single occurrence or all future occurrences from a recurring sequence. The new incidence is returned, but not automatically inserted into the calendar, which is left to the calling application */ Incidence *Calendar::dissociateOccurrence(Incidence *incidence, QDate date, bool single) { if(!incidence || !incidence->doesRecur()) return 0; Incidence *newInc = incidence->clone(); newInc->recreate(); newInc->setRelatedTo(incidence); Recurrence *recur = newInc->recurrence(); if(single) { recur->clear(); } else { // Adjust the recurrence for the future incidences. In particular // adjust the "end after n occurrences" rules! "No end date" and "end by ..." // don't need to be modified. int duration = recur->duration(); if(duration > 0) { int doneduration = recur->durationTo(date.addDays(-1)); if(doneduration >= duration) { kdDebug(5850) << "The dissociated event already occurred more often " << "than it was supposed to ever occur. ERROR!" << endl; recur->clear(); } else { recur->setDuration(duration - doneduration); } } } // Adjust the date of the incidence if(incidence->type() == "Event") { Event *ev = static_cast<Event *>(newInc); QDateTime start(ev->dtStart()); int daysTo = start.date().daysTo(date); ev->setDtStart(start.addDays(daysTo)); ev->setDtEnd(ev->dtEnd().addDays(daysTo)); } else if(incidence->type() == "Todo") { Todo *td = static_cast<Todo *>(newInc); bool haveOffset = false; int daysTo = 0; if(td->hasDueDate()) { QDateTime due(td->dtDue()); daysTo = due.date().daysTo(date); td->setDtDue(due.addDays(daysTo), true); haveOffset = true; } if(td->hasStartDate()) { QDateTime start(td->dtStart()); if(!haveOffset) daysTo = start.date().daysTo(date); td->setDtStart(start.addDays(daysTo)); haveOffset = true; } } recur = incidence->recurrence(); if(recur) { if(single) { recur->addExDate(date); } else { // Make sure the recurrence of the past events ends // at the corresponding day recur->setEndDate(date.addDays(-1)); } } return newInc; }