-rw-r--r-- | bin/kdepim/WhatsNew.txt | 13 | ||||
-rw-r--r-- | korganizer/calendarview.cpp | 46 | ||||
-rw-r--r-- | korganizer/calendarview.h | 3 | ||||
-rw-r--r-- | korganizer/koagendaitem.cpp | 4 | ||||
-rw-r--r-- | korganizer/komonthview.cpp | 10 | ||||
-rw-r--r-- | korganizer/komonthview.h | 3 | ||||
-rw-r--r-- | korganizer/koviewmanager.cpp | 3 | ||||
-rw-r--r-- | korganizer/mainwindow.cpp | 7 | ||||
-rw-r--r-- | libkcal/calendar.cpp | 11 | ||||
-rw-r--r-- | libkcal/calendar.h | 3 | ||||
-rw-r--r-- | libkcal/calendarlocal.cpp | 9 | ||||
-rw-r--r-- | libkcal/incidence.cpp | 14 | ||||
-rw-r--r-- | libkcal/incidence.h | 1 | ||||
-rw-r--r-- | version | 2 |
14 files changed, 119 insertions, 10 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt index 5021212..46d59a3 100644 --- a/bin/kdepim/WhatsNew.txt +++ b/bin/kdepim/WhatsNew.txt @@ -1,8 +1,21 @@ Info about the changes in new versions of KDE-Pim/Pi +********** VERSION 1.9.15 ************ + +Usebilty enhancements in KO/Pi: +When clicking on the date in a month view cell, the day view is shown. +Old behaviour was, that the "new event" dialog popped up. + +Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu). +That means, you can restore the latest +event/todo/journal you have deleted. +A journal is deleted, if you clear all the text of the journal. + + + ********** VERSION 1.9.14 ************ Fixed some problems with the dialog sizes when switching portrait/landscape mode on 640x480 PDA display. Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi. diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp index 543897a..15c5dd9 100644 --- a/korganizer/calendarview.cpp +++ b/korganizer/calendarview.cpp @@ -488,12 +488,19 @@ CalendarView::~CalendarView() delete mViewManager; delete mStorage; delete mDateFrame ; delete beamDialog; //kdDebug() << "~CalendarView() done" << endl; } + +void CalendarView::showDay( QDate d ) +{ + dateNavigator()->selectDate( d ); + mViewManager->showWeekView(); + dateNavigator()->selectDate( d ); +} void CalendarView::timerAlarm() { //qDebug("CalendarView::timerAlarm() "); computeAlarm(mAlarmNotification ); } @@ -2206,12 +2213,13 @@ void CalendarView::edit_paste() void CalendarView::edit_options() { mDialogManager->showOptionsDialog(); //writeSettings(); } + void CalendarView::slotSelectPickerDate( QDate d) { mDateFrame->hide(); if ( mDatePickerMode == 1 ) { mNavigator->slotDaySelect( d ); } else if ( mDatePickerMode == 2 ) { @@ -2226,12 +2234,25 @@ void CalendarView::slotSelectPickerDate( QDate d) to->setHasDueDate( true ); } QDateTime dt ( d,tim ); to->setDtDue( dt ); todoChanged( to ); } else { + if ( mMoveIncidence->doesRecur() ) { +#if 0 + // PENDING implement this + Incidence* newInc = mMoveIncidence->recreateCloneException( mMoveIncidenceOldDate ); + mCalendar()->addIncidence( newInc ); + if ( mMoveIncidence->type() == "Todo" ) + emit todoMoved((Todo*)mMoveIncidence, KOGlobals::EVENTEDITED ); + else + emit incidenceChanged(mMoveIncidence, KOGlobals::EVENTEDITED); + mMoveIncidence = newInc; + +#endif + } QTime tim = mMoveIncidence->dtStart().time(); int secs = mMoveIncidence->dtStart().secsTo( mMoveIncidence->dtEnd()); QDateTime dt ( d,tim ); mMoveIncidence->setDtStart( dt ); ((Event*)mMoveIncidence)->setDtEnd( dt.addSecs( secs ) ); changeEventDisplay((Event*)mMoveIncidence, KOGlobals::EVENTEDITED); @@ -2423,12 +2444,14 @@ void CalendarView::moveIncidence(Incidence * inc ) da = to->dtDue().date(); else da = QDate::currentDate(); } else { da = mMoveIncidence->dtStart().date(); } + //PENDING set date for recurring incidence to date of recurrence + //mMoveIncidenceOldDate; mDatePicker->setDate( da ); } void CalendarView::showDatePicker( ) { //qDebug("CalendarView::showDatePicker( ) "); if ( mDateFrame->isVisible() ) @@ -2881,21 +2904,21 @@ void CalendarView::deleteEvent(Event *anEvent) if (anEvent->recurrence()->doesRecur()) { QDate itemDate = mViewManager->currentSelectionDate(); int km; if (!itemDate.isValid()) { //kdDebug() << "Date Not Valid" << endl; if (KOPrefs::instance()->mConfirm) { - km = KMessageBox::warningContinueCancel(this,anEvent->summary() + + km = KMessageBox::warningContinueCancel(this,anEvent->summary().left(25) + i18n("\nThis event recurs\nover multiple dates.\nAre you sure you want\nto delete this event\nand all its recurrences?"), i18n("KO/Pi Confirmation"),i18n("Delete All")); if ( km == KMessageBox::Continue ) km = KMessageBox::No; // No = all below } else km = KMessageBox::No; } else { - km = KMessageBox::warningYesNoCancel(this,anEvent->summary() + + km = KMessageBox::warningYesNoCancel(this,anEvent->summary().left(25) + i18n("\nThis event recurs\nover multiple dates.\nDo you want to delete\nall it's recurrences,\nor only the current one on:\n")+ KGlobal::locale()->formatDate(itemDate)+i18n(" ?\n\nDelete:\n"), i18n("KO/Pi Confirmation"),i18n("Current"), i18n("All")); } switch(km) { @@ -2930,13 +2953,13 @@ void CalendarView::deleteEvent(Event *anEvent) } break; //#endif } // switch } else { if (KOPrefs::instance()->mConfirm) { - switch (KMessageBox::warningContinueCancel(this,anEvent->summary() + + switch (KMessageBox::warningContinueCancel(this,anEvent->summary().left(25) + i18n("\nAre you sure you want\nto delete this event?"), i18n("KO/Pi Confirmation"),i18n("Delete"))) { case KMessageBox::Continue: // OK if (anEvent->organizer()==KOPrefs::instance()->email() && anEvent->attendeeCount()>0) schedule(Scheduler::Cancel,anEvent); checkExternalId( anEvent); @@ -3796,6 +3819,23 @@ void CalendarView::setSyncManager(KSyncManager* manager) void CalendarView::removeSyncInfo( QString syncProfile) { qDebug("removeSyncInfo for profile %s ", syncProfile.latin1()); mCalendar->removeSyncInfo( syncProfile ); } + +void CalendarView::undo_delete() +{ + //qDebug("undo_delete() "); + Incidence* undo = mCalendar->undoIncidence(); + if ( !undo ) { + KMessageBox::sorry(this,i18n("There is nothing to undo!"), + i18n("KO/Pi")); + return; + } + if ( KMessageBox::Continue ==KMessageBox::warningContinueCancel(this,undo->summary().left(25) + + i18n("\nAre you sure you want\nto restore this?"), + i18n("KO/Pi Confirmation"),i18n("Restore"))) { + mCalendar->undoDeleteIncidence(); + updateView(); + } +} diff --git a/korganizer/calendarview.h b/korganizer/calendarview.h index 437a51c..646973d 100644 --- a/korganizer/calendarview.h +++ b/korganizer/calendarview.h @@ -447,12 +447,14 @@ class CalendarView : public KOrg::CalendarViewBase, public KCal::Calendar::Obser void beamIncidenceList(QPtrList<Incidence>) ; void manageCategories(); int addCategories(); void removeCategories(); void setSyncDevice( QString ); void setSyncName( QString ); + void showDay( QDate ); + void undo_delete(); protected slots: void timerAlarm(); void suspendAlarm(); void beamDone( Ir *ir ); /** Select a view or adapt the current view to display the specified dates. */ void showDates( const KCal::DateList & ); @@ -551,12 +553,13 @@ class CalendarView : public KOrg::CalendarViewBase, public KCal::Calendar::Obser bool mModified; // flag indicating if calendar is modified bool mReadOnly; // flag indicating if calendar is read-only QDate mSaveSingleDate; Incidence *mSelectedIncidence; Incidence *mMoveIncidence; + QDate mMoveIncidenceOldDate; KOTodoView *mTodoList; KOEventEditor * mEventEditor; KOTodoEditor * mTodoEditor; KOEventViewerDialog * mEventViewerDialog; void keyPressEvent ( QKeyEvent *e) ; //QMap<Incidence*,KOIncidenceEditor*> mDialogList; diff --git a/korganizer/koagendaitem.cpp b/korganizer/koagendaitem.cpp index f027343..46184ac 100644 --- a/korganizer/koagendaitem.cpp +++ b/korganizer/koagendaitem.cpp @@ -147,23 +147,25 @@ KOAgendaItem::~KOAgendaItem() // qDebug("deleteKOAgendaItem::~KOAgendaItem( "); } void KOAgendaItem::recreateIncidence() { +#if 0 Incidence* newInc = mIncidence->clone(); newInc->recreate(); if ( mIncidence->doesRecur() ) { mIncidence->addExDate( mDate ); newInc->recurrence()->unsetRecurs(); int len = mIncidence->dtStart().secsTo( ((Event*)mIncidence)->dtEnd()); QTime tim = mIncidence->dtStart().time(); newInc->setDtStart( QDateTime(mDate, tim) ); ((Event*)newInc)->setDtEnd( newInc->dtStart().addSecs( len ) ); } - mIncidence = newInc; +#endif + mIncidence = mIncidence->recreateCloneException( mDate ); } bool KOAgendaItem::updateIcons(QPainter * p, bool horLayout) { int size = AGENDA_ICON_SIZE; int yOff = 0; diff --git a/korganizer/komonthview.cpp b/korganizer/komonthview.cpp index 7d1e82f..08232e2 100644 --- a/korganizer/komonthview.cpp +++ b/korganizer/komonthview.cpp @@ -278,14 +278,14 @@ MonthViewCell::MonthViewCell( KOMonthView *parent) // QColor( 0,0,255 ) QColor( 160,1600,255 ) mStandardPalette = palette(); mStandardPalette.setColor(QColorGroup::Base, mStandardPalette.color( QPalette::Normal, QColorGroup::Background ) ); enableScrollBars( false ); updateConfig(); - connect( mLabel, SIGNAL( clicked( )), - SLOT( newEvent() )); + //connect( mLabel, SIGNAL( clicked( )), SLOT( newEvent() )); + connect( mLabel, SIGNAL( clicked( )), SLOT( showDay() )); connect( mItemList, SIGNAL( doubleClicked( QListBoxItem *) ), SLOT( defaultAction( QListBoxItem * ) ) ); connect( mItemList, SIGNAL( rightButtonPressed( QListBoxItem *, const QPoint &) ), SLOT( contextMenu( QListBoxItem * ) ) ); connect( mItemList, SIGNAL( highlighted( QListBoxItem *) ), @@ -626,12 +626,16 @@ void MonthViewCell::defaultAction( QListBoxItem *item ) if ( !item ) return; MonthViewItem *eventItem = static_cast<MonthViewItem *>( item ); Incidence *incidence = eventItem->incidence(); if ( incidence ) mMonthView->defaultAction( incidence ); } +void MonthViewCell::showDay() +{ + emit showDaySignal( date() ); +} void MonthViewCell::newEvent() { QDateTime dt( date(), QTime( KOPrefs::instance()->mStartTime, 0 ) ); emit newEventSignal( dt ); } void MonthViewCell::cellClicked( QListBoxItem *item ) @@ -726,12 +730,14 @@ KOMonthView::KOMonthView(Calendar *calendar, QWidget *parent, const char *name) mCells.insert( row * mDaysPerWeek + col, cell ); connect( cell, SIGNAL( defaultAction( Incidence * ) ), SLOT( defaultAction( Incidence * ) ) ); connect( cell, SIGNAL( newEventSignal( QDateTime ) ), SIGNAL( newEventSignal( QDateTime ) ) ); + connect( cell, SIGNAL( showDaySignal( QDate ) ), + SIGNAL( showDaySignal( QDate ) ) ); } } mContextMenu = eventPopup(); // updateConfig(); //useless here diff --git a/korganizer/komonthview.h b/korganizer/komonthview.h index e94952f..5124057 100644 --- a/korganizer/komonthview.h +++ b/korganizer/komonthview.h @@ -140,22 +140,24 @@ class MonthViewCell : public QWidget void deselect(); void select(); signals: void defaultAction( Incidence * ); void newEventSignal( QDateTime ); + void showDaySignal( QDate ); protected: void resizeEvent( QResizeEvent * ); protected slots: void defaultAction( QListBoxItem * ); void contextMenu( QListBoxItem * ); void selection( QListBoxItem * ); void cellClicked( QListBoxItem * ); void newEvent(); + void showDay(); private: KOMonthView *mMonthView; QDate mDate; bool mPrimary; @@ -218,12 +220,13 @@ class KOMonthView: public KOEventView void setSelectedCell( MonthViewCell * ); protected slots: void processSelectionChange(); signals: void selectWeekNum ( int ); + void showDaySignal( QDate ); protected: void resizeEvent(QResizeEvent *); void viewChanged(); void updateDayLabels(); private: diff --git a/korganizer/koviewmanager.cpp b/korganizer/koviewmanager.cpp index 391f98c..6e151f9 100644 --- a/korganizer/koviewmanager.cpp +++ b/korganizer/koviewmanager.cpp @@ -29,12 +29,13 @@ #include <kglobal.h> #ifndef DESKTOP_VERSION #include <qpe/qpeapplication.h> #else #include <qapplication.h> #endif +#include <qdatetime.h> #include "calendarview.h" #include "datenavigator.h" #include "kotodoview.h" #include "koagendaview.h" #include "kodialogmanager.h" #include "komonthview.h" @@ -441,12 +442,14 @@ void KOViewManager::showMonthView() connect( mMonthView, SIGNAL( moveIncidenceSignal( Incidence * ) ), mMainView, SLOT ( moveIncidence( Incidence * ) ) ); connect( mMonthView, SIGNAL( beamIncidenceSignal( Incidence * ) ), mMainView, SLOT ( beamIncidence( Incidence * ) ) ); connect( mMonthView, SIGNAL( selectWeekNum( int ) ), mMainView, SLOT ( selectWeekNum( int ) ) ); + connect( mMonthView, SIGNAL( showDaySignal( QDate ) ), + mMainView, SLOT ( showDay( QDate ) ) ); connect(mMainView, SIGNAL(configChanged()), mMonthView, SLOT(updateConfig())); mMonthView->updateConfig(); } globalFlagBlockAgenda = 1; //mFlagShowNextxDays = false; diff --git a/korganizer/mainwindow.cpp b/korganizer/mainwindow.cpp index 46ae6a0..a652c05 100644 --- a/korganizer/mainwindow.cpp +++ b/korganizer/mainwindow.cpp @@ -573,12 +573,19 @@ void MainWindow::initActions() icon = loadPixmap( pathString + "configure" ); action = new QAction( i18n("Configure"),icon, i18n("Configure..."), 0, this ); action->addTo( actionMenu ); connect( action, SIGNAL( activated() ), mView, SLOT( edit_options() ) ); actionMenu->insertSeparator(); + + action = new QAction( i18n("Undo Delete"), i18n("Undo Delete..."), 0, this ); + action->addTo( actionMenu ); + connect( action, SIGNAL( activated() ), + mView, SLOT( undo_delete() ) ); + actionMenu->insertSeparator(); + icon = loadPixmap( pathString + "newevent" ); configureToolBarMenu->insertItem(i18n("Stretched TB"), 5 ); configureToolBarMenu->insertSeparator(); configureToolBarMenu->insertItem(icon, i18n("New Event..."), 10 ); QAction* ne_action = new QAction( i18n("New Event..."), icon, i18n("New Event..."), 0, this ); ne_action->addTo( actionMenu ); diff --git a/libkcal/calendar.cpp b/libkcal/calendar.cpp index 52daaaa..88351eb 100644 --- a/libkcal/calendar.cpp +++ b/libkcal/calendar.cpp @@ -49,13 +49,13 @@ Calendar::Calendar( const QString &timeZoneId ) } void Calendar::init() { mObserver = 0; mNewObserver = false; - + mUndoIncidence = 0; mModified = false; // Setup default filter, which does nothing mDefaultFilter = new CalFilter; mFilter = mDefaultFilter; mFilter->setEnabled(false); @@ -106,19 +106,28 @@ void Calendar::init() // KOPrefs::instance()->writeConfig(); } Calendar::~Calendar() { delete mDefaultFilter; + if ( mUndoIncidence ) + delete mUndoIncidence; } const QString &Calendar::getOwner() const { return mOwner; } +bool Calendar::undoDeleteIncidence() +{ + if (!mUndoIncidence) + return false; + addIncidence(mUndoIncidence); + mUndoIncidence = 0; +} void Calendar::setOwner(const QString &os) { int i; mOwner = os; i = mOwner.find(','); if (i != -1) diff --git a/libkcal/calendar.h b/libkcal/calendar.h index b7d6a1f..2f2c3aa 100644 --- a/libkcal/calendar.h +++ b/libkcal/calendar.h @@ -62,12 +62,14 @@ class Calendar : public QObject, public CustomProperties, { Q_OBJECT public: Calendar(); Calendar(const QString &timeZoneId); virtual ~Calendar(); + Incidence * undoIncidence() { return mUndoIncidence; }; + bool undoDeleteIncidence(); void deleteIncidence(Incidence *in); void resetTempSyncStat(); void resetPilotStat(int id); /** Clears out the current calendar, freeing all used memory etc. */ @@ -319,12 +321,13 @@ public: Get events in a range of dates. If inclusive is set to true, only events are returned, which are completely included in the range. */ virtual QPtrList<Event> rawEvents( const QDate &start, const QDate &end, bool inclusive = false ) = 0; Incidence *mNextAlarmIncidence; + Incidence *mUndoIncidence; private: void init(); QString mOwner; // who the calendar belongs to QString mOwnerEmail; // email address of the owner diff --git a/libkcal/calendarlocal.cpp b/libkcal/calendarlocal.cpp index 3f46d53..12294c0 100644 --- a/libkcal/calendarlocal.cpp +++ b/libkcal/calendarlocal.cpp @@ -149,14 +149,14 @@ bool CalendarLocal::addEvent( Event *event ) return true; } void CalendarLocal::deleteEvent( Event *event ) { - - + if ( mUndoIncidence ) delete mUndoIncidence; + mUndoIncidence = event->clone(); if ( mEventList.removeRef( event ) ) { setModified( true ); } } @@ -198,12 +198,14 @@ bool CalendarLocal::addTodo( Todo *todo ) return true; } void CalendarLocal::deleteTodo( Todo *todo ) { // Handle orphaned children + if ( mUndoIncidence ) delete mUndoIncidence; + mUndoIncidence = todo->clone(); removeRelations( todo ); if ( mTodoList.removeRef( todo ) ) { setModified( true ); } } @@ -684,12 +686,15 @@ bool CalendarLocal::addJournal(Journal *journal) return true; } void CalendarLocal::deleteJournal( Journal *journal ) { + if ( mUndoIncidence ) delete mUndoIncidence; + mUndoIncidence = journal->clone(); + mUndoIncidence->setSummary( mUndoIncidence->description().left(25)); if ( mJournalList.removeRef(journal) ) { setModified( true ); } } Journal *CalendarLocal::journal( const QDate &date ) diff --git a/libkcal/incidence.cpp b/libkcal/incidence.cpp index 5a9ef0e..28402ae 100644 --- a/libkcal/incidence.cpp +++ b/libkcal/incidence.cpp @@ -170,12 +170,26 @@ bool KCal::operator==( const Incidence& i1, const Incidence& i2 ) i1.resources() == i2.resources() && i1.secrecy() == i2.secrecy() && i1.priority() == i2.priority() && stringCompare( i1.location(), i2.location() ); } +Incidence* Incidence::recreateCloneException( QDate d ) +{ + Incidence* newInc = clone(); + newInc->recreate(); + if ( doesRecur() ) { + addExDate( d ); + newInc->recurrence()->unsetRecurs(); + int len = dtStart().secsTo( ((Event*)this)->dtEnd()); + QTime tim = dtStart().time(); + newInc->setDtStart( QDateTime(d, tim) ); + ((Event*)newInc)->setDtEnd( newInc->dtStart().addSecs( len ) ); + } + return newInc; +} void Incidence::recreate() { setCreated(QDateTime::currentDateTime()); setUid(CalFormat::createUniqueId()); diff --git a/libkcal/incidence.h b/libkcal/incidence.h index 7dc6f10..1807bc4 100644 --- a/libkcal/incidence.h +++ b/libkcal/incidence.h @@ -119,12 +119,13 @@ class Incidence : public IncidenceBase /** Recreate event. The event is made a new unique event, but already stored event information is preserved. Sets uniquie id, creation date, last modification date and revision number. */ void recreate(); + Incidence* recreateCloneException(QDate); /** set creation date */ void setCreated(QDateTime); /** return time and date of creation. */ QDateTime created() const; @@ -1 +1 @@ -version = "1.9.14"; +version = "1.9.15"; |