Branch 'kolab/integration/4.13.0' - 6 commits - calendarviews/agenda incidenceeditor-ng/resourcemanagement.cpp korganizer/views

Sandro Knauß knauss at kolabsys.com
Fri Mar 13 17:57:15 CET 2015


 calendarviews/agenda/agenda.cpp                      |   79 ++++++++++++++-----
 calendarviews/agenda/agenda.h                        |    8 -
 calendarviews/agenda/agendaitem.cpp                  |    4 
 calendarviews/agenda/agendaview.cpp                  |   55 ++++++-------
 calendarviews/agenda/agendaview.h                    |    1 
 calendarviews/agenda/viewcalendar.cpp                |   29 ++++++
 calendarviews/agenda/viewcalendar.h                  |    4 
 incidenceeditor-ng/resourcemanagement.cpp            |    7 +
 korganizer/views/collectionview/calendardelegate.cpp |   28 +++++-
 korganizer/views/collectionview/calendardelegate.h   |    3 
 korganizer/views/collectionview/quickview.cpp        |    7 +
 11 files changed, 161 insertions(+), 64 deletions(-)

New commits:
commit 140da9f7e3aa16c41edb424ca3c5c754106b57f2
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Fri Mar 13 17:23:58 2015 +0100

    Fix the delete exception behaviour.
    
    if only the exception is deleted, than update the main event after the
    deletion and not delete every agendaitem.
    
    KOLAB: 4844

diff --git a/calendarviews/agenda/agenda.cpp b/calendarviews/agenda/agenda.cpp
index 03dec7d..a9f8ae6 100644
--- a/calendarviews/agenda/agenda.cpp
+++ b/calendarviews/agenda/agenda.cpp
@@ -1923,8 +1923,13 @@ void Agenda::removeIncidence( const KCalCore::Incidence::Ptr &incidence )
     return;
   }
   foreach ( const AgendaItem::QPtr &agendaItem, agendaItems ) {
-    if ( agendaItem && !removeAgendaItem( agendaItem ) ) {
-      kWarning() << "Agenda::removeIncidence() Failed to remove " << incidence->uid();
+    if (agendaItem) {
+      if (incidence->instanceIdentifier() != agendaItem->incidence()->instanceIdentifier() ) {
+        continue;
+      }
+      if ( !removeAgendaItem( agendaItem ) ) {
+        kWarning() << "Agenda::removeIncidence() Failed to remove " << incidence->uid();
+      }
     }
   }
 }
diff --git a/calendarviews/agenda/agendaview.cpp b/calendarviews/agenda/agendaview.cpp
index 08d6c83..c26d883 100644
--- a/calendarviews/agenda/agendaview.cpp
+++ b/calendarviews/agenda/agendaview.cpp
@@ -479,10 +479,10 @@ void AgendaView::Private::calendarIncidenceDeleted( const KCalCore::Incidence::P
   if ( incidence->hasRecurrenceId()) {
     // Reevaluate the main event, if it exists. The exception was removed so the main recurrent series
     // will no be bigger.
-    if ( mViewCalendar->isValid(incidence) ) {
-      KCalCore::Incidence::Ptr mainIncidence = q->calendar2(incidence)->incidence( incidence->uid() );
+    if ( mViewCalendar->isValid(incidence->uid()) ) {
+      KCalCore::Incidence::Ptr mainIncidence = q->calendar2(incidence->uid())->incidence( incidence->uid() );
       if ( mainIncidence ) {
-        reevaluateIncidence( mainIncidence  );
+        reevaluateIncidence( mainIncidence );
       }
     }
   } else if ( mightBeVisible( incidence ) ) {
@@ -847,6 +847,10 @@ KCalCore::Calendar::Ptr AgendaView::calendar2(KCalCore::Incidence::Ptr incidence
   return d->mViewCalendar->findCalendar(incidence)->getCalendar();
 }
 
+KCalCore::Calendar::Ptr AgendaView::calendar2(const QString &incidenceIdentifier) const
+{
+  return d->mViewCalendar->findCalendar(incidenceIdentifier)->getCalendar();
+}
 
 void AgendaView::setCalendar( const Akonadi::ETMCalendar::Ptr &cal )
 {
@@ -2176,8 +2180,10 @@ void AgendaView::removeIncidence( const KCalCore::Incidence::Ptr &incidence )
   d->mAllDayAgenda->removeIncidence( incidence );
   d->mAgenda->removeIncidence( incidence );
 
-  if ( !incidence->hasRecurrenceId() && d->mViewCalendar->isValid(incidence)) {
-    KCalCore::Incidence::List exceptions = calendar2(incidence)->instances( incidence );
+  if (!incidence->hasRecurrenceId() && d->mViewCalendar->isValid(incidence->uid())) {
+    // Deleted incidence is an main incidence
+    // Delete all exceptions as well
+    KCalCore::Incidence::List exceptions = calendar2(incidence->uid())->instances( incidence );
     foreach ( const KCalCore::Incidence::Ptr &exception, exceptions ) {
       if ( exception->allDay() ) {
         d->mAllDayAgenda->removeIncidence( exception );
diff --git a/calendarviews/agenda/agendaview.h b/calendarviews/agenda/agendaview.h
index 03b49f6..c5b1a1e 100644
--- a/calendarviews/agenda/agendaview.h
+++ b/calendarviews/agenda/agendaview.h
@@ -161,6 +161,7 @@ class EVENTVIEWS_EXPORT AgendaView : public EventView
      * TODO: replace EventsView::calendar()
      */
     virtual KCalCore::Calendar::Ptr calendar2(KCalCore::Incidence::Ptr incidence) const;
+    virtual KCalCore::Calendar::Ptr calendar2(const QString &incidenceIdentifier) const;
 
   public slots:
     virtual void updateView();


commit dc9c162082ea1ec095033f62daf351682393645b
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Fri Mar 13 17:23:21 2015 +0100

    some cleanup

diff --git a/calendarviews/agenda/agendaitem.cpp b/calendarviews/agenda/agendaitem.cpp
index 6625dd1..5ef3f9b 100644
--- a/calendarviews/agenda/agendaitem.cpp
+++ b/calendarviews/agenda/agendaitem.cpp
@@ -844,7 +844,7 @@ void AgendaItem::paintEvent( QPaintEvent *ev )
       todo->dtDue().toTimeSpec( CalendarSupport::KCalPrefs::instance()->timeSpec() ).date();
     const QDate today =
       KDateTime::currentDateTime( CalendarSupport::KCalPrefs::instance()->timeSpec() ).date();
-    const QDate occurrenceDate = mOccurrenceDateTime.toTimeSpec( CalendarSupport::KCalPrefs::instance()->timeSpec() ).date();
+    const QDate occurrenceDate = this->occurrenceDate();
     if ( todo->isOverdue() && today >= occurrenceDate ) {
       bgColor = mEventView->preferences()->todoOverdueColor();
     } else if ( dueDate == today && dueDate == occurrenceDate ) {
@@ -1362,7 +1362,7 @@ bool AgendaItem::event( QEvent *event )
         KCalUtils::IncidenceFormatter::toolTipStr(
           mCalendar->displayName(mIncidence),
           mIncidence,
-          mOccurrenceDateTime.toTimeSpec( mEventView->preferences()->timeSpec() ).date(), true, mEventView->preferences()->timeSpec() ),
+          occurrenceDate(), true, mEventView->preferences()->timeSpec() ),
         this );
     }
   }


commit e4c6ef862312e540077bacabfc2cbe9ed3e3f761
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Fri Mar 13 17:20:53 2015 +0100

    ViewCalendar: Add support for search incidences via instanceIdentifier
    
    If exceptions form incidences are deleted, we need a way to get to the
    corresponding main incidence. Because the exception itself is already
    deleted, we have to search via the uid.

diff --git a/calendarviews/agenda/viewcalendar.cpp b/calendarviews/agenda/viewcalendar.cpp
index aa1555d..8aeb095 100644
--- a/calendarviews/agenda/viewcalendar.cpp
+++ b/calendarviews/agenda/viewcalendar.cpp
@@ -46,6 +46,16 @@ ViewCalendar::Ptr MultiViewCalendar::findCalendar(const KCalCore::Incidence::Ptr
     return ViewCalendar::Ptr();
 }
 
+ViewCalendar::Ptr MultiViewCalendar::findCalendar(const QString &incidenceIdentifier) const
+{
+    foreach(const ViewCalendar::Ptr &cal, mSubCalendars) {
+        if (cal->isValid(incidenceIdentifier)) {
+            return cal;
+        }
+    }
+    return ViewCalendar::Ptr();
+}
+
 void MultiViewCalendar::addCalendar(const ViewCalendar::Ptr &calendar)
 {
     if (!mSubCalendars.contains(calendar)) {
@@ -87,6 +97,13 @@ bool MultiViewCalendar::isValid(const KCalCore::Incidence::Ptr &incidence) const
     return cal;
 }
 
+bool MultiViewCalendar::isValid(const QString &incidenceIdentifier) const
+{
+    ViewCalendar::Ptr cal = findCalendar(incidenceIdentifier);
+    return cal;
+}
+
+
 QColor MultiViewCalendar::resourceColor(const KCalCore::Incidence::Ptr &incidence) const
 {
     ViewCalendar::Ptr cal = findCalendar(incidence);
@@ -121,9 +138,19 @@ bool AkonadiViewCalendar::isValid(const KCalCore::Incidence::Ptr &incidence) con
     return false;
 }
 
-Akonadi::Item AkonadiViewCalendar::item(const KCalCore::Incidence::Ptr &incidence) const
+bool AkonadiViewCalendar::isValid(const QString &incidenceIdentifier) const
 {
     if (!mCalendar) {
+        return false;
+    }
+
+    return !mCalendar->incidence(incidenceIdentifier).isNull();
+}
+
+
+Akonadi::Item AkonadiViewCalendar::item(const KCalCore::Incidence::Ptr &incidence) const
+{
+    if (!mCalendar || !incidence) {
         return Akonadi::Item();
     }
     bool ok = false;
diff --git a/calendarviews/agenda/viewcalendar.h b/calendarviews/agenda/viewcalendar.h
index 53551e5..afa39a6 100644
--- a/calendarviews/agenda/viewcalendar.h
+++ b/calendarviews/agenda/viewcalendar.h
@@ -42,6 +42,7 @@ public:
 
   virtual ~ViewCalendar();
   virtual bool isValid(const KCalCore::Incidence::Ptr &incidence) const=0;
+  virtual bool isValid(const QString &incidenceIdentifier) const=0;
   virtual QString displayName(const KCalCore::Incidence::Ptr &incidence) const=0;
 
   virtual QColor resourceColor(const KCalCore::Incidence::Ptr &incidence) const=0;
@@ -57,6 +58,7 @@ public:
 
     virtual ~AkonadiViewCalendar();
     virtual bool isValid(const KCalCore::Incidence::Ptr &incidence) const;
+    virtual bool isValid(const QString &incidenceIdentifier) const;
     virtual QString displayName(const KCalCore::Incidence::Ptr &incidence) const;
 
     virtual QColor resourceColor(const KCalCore::Incidence::Ptr &incidence) const;
@@ -78,7 +80,9 @@ public:
 
     virtual ~MultiViewCalendar();
     ViewCalendar::Ptr findCalendar(const KCalCore::Incidence::Ptr &incidence) const;
+    ViewCalendar::Ptr findCalendar(const QString &incidenceIdentifier) const;
     virtual bool isValid(const KCalCore::Incidence::Ptr &incidence) const;
+    virtual bool isValid(const QString &incidenceIdentifier) const;
     virtual QString displayName(const KCalCore::Incidence::Ptr &incidence) const;
 
     virtual QColor resourceColor(const KCalCore::Incidence::Ptr &incidence) const;
diff --git a/incidenceeditor-ng/resourcemanagement.cpp b/incidenceeditor-ng/resourcemanagement.cpp
index b75c9d3..ff36677 100644
--- a/incidenceeditor-ng/resourcemanagement.cpp
+++ b/incidenceeditor-ng/resourcemanagement.cpp
@@ -62,7 +62,12 @@ public:
     virtual ~FreebusyViewCalendar() {};
     virtual bool isValid(const KCalCore::Incidence::Ptr &incidence) const
     {
-        return incidence->uid().startsWith("fb-");
+        return isValid(incidence->uid());
+    }
+
+    virtual bool isValid(const QString &incidenceIdentifier) const
+    {
+        return incidenceIdentifier.startsWith("fb-");
     }
 
     virtual QString displayName(const KCalCore::Incidence::Ptr &incidence) const
diff --git a/korganizer/views/collectionview/quickview.cpp b/korganizer/views/collectionview/quickview.cpp
index 3417fb1..de3e43e 100644
--- a/korganizer/views/collectionview/quickview.cpp
+++ b/korganizer/views/collectionview/quickview.cpp
@@ -47,7 +47,12 @@ public:
     virtual ~FreebusyViewCalendar() {};
     virtual bool isValid(const KCalCore::Incidence::Ptr &incidence) const
     {
-        return incidence->uid().startsWith(QLatin1String("fb-"));
+        return isValid(incidence->uid());
+    }
+
+    virtual bool isValid(const QString &incidenceIdentifier) const
+    {
+        return incidenceIdentifier.startsWith(QLatin1String("fb-"));
     }
 
     virtual QString displayName(const KCalCore::Incidence::Ptr &incidence) const


commit d7184ff8a66dc6856211233aa1d28855577a941d
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Thu Mar 12 20:52:21 2015 +0100

    Add propper exception support to korganizer
    
    Create and update exceptions for incidence.

diff --git a/calendarviews/agenda/agenda.cpp b/calendarviews/agenda/agenda.cpp
index cc2a156..03dec7d 100644
--- a/calendarviews/agenda/agenda.cpp
+++ b/calendarviews/agenda/agenda.cpp
@@ -1163,15 +1163,32 @@ void Agenda::endItemAction()
 
   bool multiModify = false;
   // FIXME: do the cloning here...
-  const KCalCore::Incidence::Ptr incidence = d->mActionItem->incidence();
+  KCalCore::Incidence::Ptr incidence = d->mActionItem->incidence();
+  const KDateTime recurrenceId = d->mActionItem->occurrenceDateTime();
+
   d->mItemMoved = d->mItemMoved && !( d->mStartCell.x() == d->mEndCell.x() &&
                                       d->mStartCell.y() == d->mEndCell.y() );
 
   bool addIncidence = false;
   if ( d->mItemMoved ) {
     bool modify = false;
-    if ( incidence->recurs() ) {
-      const int res = d->mAgendaView->showMoveRecurDialog( d->mActionItem->incidence(), d->mActionItem->occurrenceDate() );
+
+    //get the main event and not the exception
+    if (incidence->hasRecurrenceId() && !incidence->recurs()) {
+      KCalCore::Incidence::Ptr mainIncidence;
+      KCalCore::Calendar::Ptr cal = d->mCalendar->findCalendar(incidence)->getCalendar();
+      if (CalendarSupport::hasEvent(incidence)) {
+        mainIncidence = cal->event(incidence->uid());
+      } else if (CalendarSupport::hasTodo(incidence)) {
+        mainIncidence =  cal->todo(incidence->uid());
+      }
+      incidence = mainIncidence;
+    }
+
+    Akonadi::Item item = d->mCalendar->item(incidence);
+
+    if ( incidence->recurs()) {
+      const int res = d->mAgendaView->showMoveRecurDialog( incidence, recurrenceId.date() );
       switch ( res ) {
       case KCalUtils::RecurrenceActions::AllOccurrences: // All occurrences
         // Moving the whole sequene of events is handled by the itemModified below.
@@ -1185,16 +1202,24 @@ void Agenda::endItemAction()
         multiModify = true;
         d->mChanger->startAtomicOperation( i18n( "Dissociate event from recurrence" ) );
         KCalCore::Incidence::Ptr newInc( KCalCore::Calendar::createException(
-          incidence, d->mActionItem->occurrenceDateTime(), thisAndFuture ) );
+          incidence, recurrenceId, thisAndFuture ) );
         if ( newInc ) {
+          newInc->removeCustomProperty("VOLATILE", "AKONADI-ID");
+          Akonadi::Item newItem = d->mCalendar->item(newInc);
+
+          if (newItem.isValid() && newItem != item ) {             //it is not a new exception
+            item = newItem;
+            newInc->setCustomProperty("VOLATILE", "AKONADI-ID", QString::number(newItem.id()));
+            addIncidence = false;
+          } else {
+            addIncidence = true;
+          }
           // don't recreate items, they already have the correct position
           d->mAgendaView->enableAgendaUpdate( false );
 
           d->mActionItem->setIncidence( newInc );
           d->mActionItem->dissociateFromMultiItem();
 
-          addIncidence = true;
-
           d->mAgendaView->enableAgendaUpdate( true );
         } else {
           KMessageBox::sorry(
@@ -1218,6 +1243,17 @@ void Agenda::endItemAction()
       placeItem = d->mActionItem;
     }
 
+    Akonadi::Collection::Id saveCollection = -1;
+
+    if ( item.isValid()) {
+      saveCollection = item.parentCollection().id();
+
+      // if parent collection is only a search collection for example
+      if (!(item.parentCollection().rights() & Akonadi::Collection::CanCreateItem)) {
+          saveCollection = item.storageCollectionId();
+      }
+    }
+
     if ( modify ) {
       d->mActionItem->endMove();
 
@@ -1242,9 +1278,8 @@ void Agenda::endItemAction()
       // calling when we move item.
       // Not perfect need to improve it!
       //mChanger->endChange( inc );
-      Akonadi::Item item = d->mCalendar->item(incidence);
       if (item.isValid()) {
-        d->mAgendaView->updateEventDates( modif, addIncidence, item.parentCollection().id() );
+        d->mAgendaView->updateEventDates( modif, addIncidence, saveCollection );
       }
       if ( addIncidence ) {
         // delete the one we dragged, there's a new one being added async, due to dissociation.
@@ -1253,9 +1288,8 @@ void Agenda::endItemAction()
     } else {
       // the item was moved, but not further modified, since it's not recurring
       // make sure the view updates anyhow, with the right item
-      Akonadi::Item item = d->mCalendar->item(incidence);
       if (item.isValid()) {
-        d->mAgendaView->updateEventDates( placeItem, addIncidence, item.parentCollection().id() );
+        d->mAgendaView->updateEventDates( placeItem, addIncidence, saveCollection );
       }
     }
   }
diff --git a/calendarviews/agenda/agendaview.cpp b/calendarviews/agenda/agendaview.cpp
index f7d4ed3..08d6c83 100644
--- a/calendarviews/agenda/agendaview.cpp
+++ b/calendarviews/agenda/agendaview.cpp
@@ -1473,15 +1473,13 @@ void AgendaView::updateEventDates( AgendaItem *item, bool addIncidence,
   int daysLength = 0;
   //  startDt.setDate( startDate );
 
-  Akonadi::Item aitem = d->mViewCalendar->item(item->incidence());
-  KCalCore::Incidence::Ptr incidence = CalendarSupport::incidence( aitem );
-  if ( !aitem.isValid() || !incidence || !changer() ) {
+  KCalCore::Incidence::Ptr incidence = item->incidence();
+  Akonadi::Item aitem = d->mViewCalendar->item(incidence);
+  if ( (!aitem.isValid() && !addIncidence) || !incidence || !changer() ) {
     kWarning() << "changer is " << changer() << " and incidence is " << incidence.data();
     return;
   }
 
-  KCalCore::Incidence::Ptr oldIncidence( incidence->clone() );
-
   QTime startTime( 0, 0, 0 ), endTime( 0, 0, 0 );
   if ( incidence->allDay() ) {
     daysLength = item->cellWidth() - 1;
@@ -1575,14 +1573,18 @@ void AgendaView::updateEventDates( AgendaItem *item, bool addIncidence,
     }
     td->setDtDue( endDt.toTimeSpec( td->dtDue().timeSpec() ) );
   }
-  item->setOccurrenceDateTime( startDt );
+
+  if (!incidence->hasRecurrenceId()) {
+      item->setOccurrenceDateTime( startDt );
+  }
 
   bool result;
   if ( addIncidence ) {
     Akonadi::Collection collection = calendar()->collection( collectionId );
-    kDebug() << "Collection isValid() = " << collection.isValid();
     result = changer()->createIncidence( incidence, collection, this ) != -1;
   } else {
+    KCalCore::Incidence::Ptr oldIncidence( CalendarSupport::incidence(aitem) );
+    aitem.setPayload<KCalCore::Incidence::Ptr>(incidence);
     result = changer()->modifyIncidence( aitem, oldIncidence, this ) != -1;
   }
 


commit 64ed8c66bf3cda2c26683fce7d76e7d77d0d70e0
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Thu Mar 12 20:45:18 2015 +0100

    Select the correct exceptions and agendaitem uses recurrenceId
    
    Do not mix up recurrence id and start date of exception. agendaitem
    should get the recurrence id.

diff --git a/calendarviews/agenda/agenda.cpp b/calendarviews/agenda/agenda.cpp
index 6aace12..cc2a156 100644
--- a/calendarviews/agenda/agenda.cpp
+++ b/calendarviews/agenda/agenda.cpp
@@ -1696,7 +1696,7 @@ void Agenda::setStartTime( const QTime &startHour )
 /*
   Insert AgendaItem into agenda.
 */
-AgendaItem::QPtr Agenda::insertItem( const KCalCore::Incidence::Ptr &incidence, const KDateTime &qd,
+AgendaItem::QPtr Agenda::insertItem( const KCalCore::Incidence::Ptr &incidence, const KDateTime &recurrenceId,
                                      int X, int YTop, int YBottom, int itemPos, int itemCount,
                                      bool isSelected )
 {
@@ -1707,7 +1707,7 @@ AgendaItem::QPtr Agenda::insertItem( const KCalCore::Incidence::Ptr &incidence,
 
   d->mActionType = NOP;
 
-  AgendaItem::QPtr agendaItem = createAgendaItem( incidence, itemPos, itemCount, qd, isSelected );
+  AgendaItem::QPtr agendaItem = createAgendaItem( incidence, itemPos, itemCount, recurrenceId, isSelected );
   if ( !agendaItem ) {
     return AgendaItem::QPtr();
   }
@@ -1742,7 +1742,7 @@ AgendaItem::QPtr Agenda::insertItem( const KCalCore::Incidence::Ptr &incidence,
 /*
   Insert all-day AgendaItem into agenda.
 */
-AgendaItem::QPtr Agenda::insertAllDayItem( const KCalCore::Incidence::Ptr &incidence, const KDateTime &occurrenceDateTime,
+AgendaItem::QPtr Agenda::insertAllDayItem( const KCalCore::Incidence::Ptr &incidence, const KDateTime &recurrenceId,
                                            int XBegin, int XEnd, bool isSelected )
 {
   if ( !d->mAllDayMode ) {
@@ -1752,7 +1752,7 @@ AgendaItem::QPtr Agenda::insertAllDayItem( const KCalCore::Incidence::Ptr &incid
 
   d->mActionType = NOP;
 
-  AgendaItem::QPtr agendaItem = createAgendaItem( incidence, 1, 1, occurrenceDateTime, isSelected );
+  AgendaItem::QPtr agendaItem = createAgendaItem( incidence, 1, 1, recurrenceId, isSelected );
   if ( !agendaItem ) {
     return AgendaItem::QPtr();
   }
@@ -1779,7 +1779,7 @@ AgendaItem::QPtr Agenda::insertAllDayItem( const KCalCore::Incidence::Ptr &incid
 }
 
 AgendaItem::QPtr Agenda::createAgendaItem( const KCalCore::Incidence::Ptr &incidence, int itemPos,
-                                           int itemCount, const KDateTime &qd, bool isSelected )
+                                           int itemCount, const KDateTime &recurrenceId, bool isSelected )
 {
   if ( !incidence ) {
     kWarning() << "Agenda::createAgendaItem() item is invalid.";
@@ -1787,7 +1787,7 @@ AgendaItem::QPtr Agenda::createAgendaItem( const KCalCore::Incidence::Ptr &incid
   }
 
   AgendaItem::QPtr agendaItem = new AgendaItem( d->mAgendaView, d->mCalendar, incidence,
-                                                itemPos, itemCount, qd, isSelected, this );
+                                                itemPos, itemCount, recurrenceId, isSelected, this );
 
   connect( agendaItem, SIGNAL(removeAgendaItem(AgendaItem::QPtr)), SLOT(removeAgendaItem(AgendaItem::QPtr)) );
   connect( agendaItem, SIGNAL(showAgendaItem(AgendaItem::QPtr)), SLOT(showAgendaItem(AgendaItem::QPtr)) );
@@ -1797,7 +1797,7 @@ AgendaItem::QPtr Agenda::createAgendaItem( const KCalCore::Incidence::Ptr &incid
   return agendaItem;
 }
 
-void Agenda::insertMultiItem( const KCalCore::Incidence::Ptr &event, const KDateTime &occurrenceDateTime, int XBegin,
+void Agenda::insertMultiItem( const KCalCore::Incidence::Ptr &event, const KDateTime &recurrenceId, int XBegin,
                               int XEnd, int YTop, int YBottom, bool isSelected )
 {
   KCalCore::Event::Ptr ev = CalendarSupport::event( event );
@@ -1832,7 +1832,7 @@ void Agenda::insertMultiItem( const KCalCore::Incidence::Ptr &event, const KDate
       newtext = QString::fromLatin1( "(%1/%2): " ).arg( count ).arg( width );
       newtext.append( ev->summary() );
 
-      current = insertItem( event, occurrenceDateTime, cellX, cellYTop, cellYBottom, count, width, isSelected );
+      current = insertItem( event, recurrenceId, cellX, cellYTop, cellYBottom, count, width, isSelected );
       Q_ASSERT( current );
       current->setText( newtext );
       multiItems.append( current );
diff --git a/calendarviews/agenda/agenda.h b/calendarviews/agenda/agenda.h
index e1dd790..db14daf 100644
--- a/calendarviews/agenda/agenda.h
+++ b/calendarviews/agenda/agenda.h
@@ -121,13 +121,13 @@ class EVENTVIEWS_EXPORT Agenda : public QWidget
 
     void setStartTime( const QTime &startHour );
 
-    AgendaItem::QPtr insertItem ( const KCalCore::Incidence::Ptr &incidence, const KDateTime &occurrenceDateTime, int X, int YTop,
+    AgendaItem::QPtr insertItem ( const KCalCore::Incidence::Ptr &incidence, const KDateTime &recurrenceId, int X, int YTop,
                                   int YBottom, int itemPos, int itemCount, bool isSelected );
 
-    AgendaItem::QPtr insertAllDayItem ( const KCalCore::Incidence::Ptr &event, const KDateTime &occurrenceDateTime, int XBegin,
+    AgendaItem::QPtr insertAllDayItem ( const KCalCore::Incidence::Ptr &event, const KDateTime &recurrenceId, int XBegin,
                                         int XEnd, bool isSelected );
 
-    void insertMultiItem ( const KCalCore::Incidence::Ptr &event, const KDateTime &occurrenceDateTime, int XBegin, int XEnd,
+    void insertMultiItem ( const KCalCore::Incidence::Ptr &event, const KDateTime &recurrenceId, int XBegin, int XEnd,
                            int YTop, int YBottom, bool isSelected );
 
     /**
@@ -235,7 +235,7 @@ class EVENTVIEWS_EXPORT Agenda : public QWidget
     };
 
     AgendaItem::QPtr createAgendaItem( const KCalCore::Incidence::Ptr &item, int itemPos,
-                                       int itemCount, const KDateTime &qd, bool isSelected );
+                                       int itemCount, const KDateTime &recurrentId, bool isSelected );
 
   protected:
     /**
diff --git a/calendarviews/agenda/agendaview.cpp b/calendarviews/agenda/agendaview.cpp
index eca73d0..f7d4ed3 100644
--- a/calendarviews/agenda/agendaview.cpp
+++ b/calendarviews/agenda/agendaview.cpp
@@ -274,7 +274,7 @@ class AgendaView::Private : public Akonadi::ETMCalendar::CalendarObserver
     AgendaItem::List agendaItems( const QString &uid ) const;
 
     // insertAtDateTime is in the view's timezone
-    void insertIncidence( const KCalCore::Incidence::Ptr &,
+    void insertIncidence( const KCalCore::Incidence::Ptr &, const KDateTime &recurrenceId,
                           const KDateTime &insertAtDateTime, bool createSelected );
     void reevaluateIncidence( const KCalCore::Incidence::Ptr &incidence );
 
@@ -531,7 +531,7 @@ void AgendaView::Private::clearView()
 }
 
 void AgendaView::Private::insertIncidence( const KCalCore::Incidence::Ptr &incidence,
-                                           const KDateTime &insertAtDateTime,
+                                           const KDateTime &recurrenceId, const KDateTime &insertAtDateTime,
                                            bool createSelected )
 {
   if ( !q->filterByCollectionSelection( incidence ) ) {
@@ -588,10 +588,10 @@ void AgendaView::Private::insertIncidence( const KCalCore::Incidence::Ptr &incid
   const KDateTime::Spec timeSpec = q->preferences()->timeSpec();
   const QDate today = KDateTime::currentDateTime( timeSpec ).date();
   if ( todo && todo->isOverdue() && today >= insertAtDate ) {
-    mAllDayAgenda->insertAllDayItem( incidence, insertAtDateTime, curCol, curCol,
+    mAllDayAgenda->insertAllDayItem( incidence, recurrenceId, curCol, curCol,
                                      createSelected );
   } else if ( incidence->allDay() ) {
-    mAllDayAgenda->insertAllDayItem( incidence, insertAtDateTime, beginX, endX,
+    mAllDayAgenda->insertAllDayItem( incidence, recurrenceId, beginX, endX,
                                      createSelected );
   } else if ( event && event->isMultiDay( timeSpec ) ) {
     // TODO: We need a better isMultiDay(), one that receives the occurrence.
@@ -612,7 +612,7 @@ void AgendaView::Private::insertIncidence( const KCalCore::Incidence::Ptr &incid
     }
     const int endY = mAgenda->timeToY( endTime ) - 1;
     if ( ( beginX <= 0 && curCol == 0 ) || beginX == curCol ) {
-      mAgenda->insertMultiItem( incidence, insertAtDateTime, beginX, endX, startY, endY,
+      mAgenda->insertMultiItem( incidence, recurrenceId, beginX, endX, startY, endY,
                                 createSelected );
     }
     if ( beginX == curCol ) {
@@ -683,7 +683,7 @@ void AgendaView::Private::insertIncidence( const KCalCore::Incidence::Ptr &incid
     if ( endY < startY ) {
       endY = startY;
     }
-    mAgenda->insertItem( incidence, insertAtDateTime, curCol, startY, endY, 1, 1,
+    mAgenda->insertItem( incidence, recurrenceId, curCol, startY, endY, 1, 1,
                          createSelected );
     if ( startY < mMinY[curCol] ) {
       mMinY[curCol] = startY;
@@ -1831,17 +1831,10 @@ bool AgendaView::displayIncidence( const  KCalCore::Incidence::Ptr &incidence, b
         busyEvents.append( event );
       }
 
-      const Akonadi::Item item = calendar()->item( rIt.incidence() );
-      if ( !item.isValid() ) {
-        kWarning() << "Couldn't find item for "
-                   << rIt.incidence()->uid() << rIt.incidence()->recurrenceId().toString();
-        continue;
-      }
-      Q_ASSERT( item.hasPayload() );
       if ( occurrenceDate.date() == today ) {
         alreadyAddedToday = true;
       }
-      d->insertIncidence( incidence, occurrenceDate, createSelected );
+      d->insertIncidence( rIt.incidence(), rIt.recurrenceId(), occurrenceDate, createSelected );
     }
 
   } else {
@@ -1896,7 +1889,7 @@ bool AgendaView::displayIncidence( const  KCalCore::Incidence::Ptr &incidence, b
       busyEvents.append( event );
     }
 
-    d->insertIncidence( incidence, t->toTimeSpec( timeSpec ), createSelected );
+    d->insertIncidence( incidence, t->toTimeSpec( timeSpec ), t->toTimeSpec( timeSpec ), createSelected );
   }
 
   // Can be multiday


commit 7876f0ec6f1f4e41e28540bf2d4799579598a9a8
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Thu Mar 12 20:32:02 2015 +0100

    Show number of pending invitations.
    
    Display the number open/decliend invitations. So the user can see how
    many open invitations he has.
    
    KOLAB: 4816

diff --git a/korganizer/views/collectionview/calendardelegate.cpp b/korganizer/views/collectionview/calendardelegate.cpp
index c8b6a40..f1f3514 100644
--- a/korganizer/views/collectionview/calendardelegate.cpp
+++ b/korganizer/views/collectionview/calendardelegate.cpp
@@ -24,6 +24,7 @@
 #include <QApplication>
 #include <QPainter>
 #include <QMouseEvent>
+#include <akonadi/collectionstatistics.h>
 
 #include <calendarsupport/utils.h>
 #include <kohelper.h>
@@ -142,6 +143,9 @@ QList<StyledCalendarDelegate::Action> StyledCalendarDelegate::getActions(const Q
     if (!isToplevelSearchCollection && !isToplevelKolabCollection) {
         buttons << Quickview;
     }
+    if (isSearchCollection && !isToplevelSearchCollection) {
+        buttons << Total;
+    }
     return buttons;
 }
 
@@ -166,14 +170,24 @@ void StyledCalendarDelegate::paint( QPainter * painter, const QStyleOptionViewIt
         QList<Action> buttons;
         int i = 1;
         Q_FOREACH (Action action, getActions(option, index)) {
-            QStyleOptionButton buttonOption = buttonOpt(opt, mPixmap.value(action), i);
-            if (action == Enable && showButtons) {
-                buttonOption.state = QStyle::State_Active;
-            }
-            if (action == Enable && !showButtons && enabled == Qt::PartiallyChecked) {
-                buttonOption.state = QStyle::State_Active;
+            if (action != Total) {
+                QStyleOptionButton buttonOption = buttonOpt(opt, mPixmap.value(action), i);
+                if (action == Enable && showButtons) {
+                    buttonOption.state = QStyle::State_Active;
+                }
+                if (action == Enable && !showButtons && enabled == Qt::PartiallyChecked) {
+                    buttonOption.state = QStyle::State_Active;
+                }
+                s->drawControl(QStyle::CE_PushButton, &buttonOption, painter, 0);
+            } else {
+                QStyleOptionButton buttonOption = buttonOpt(opt, QPixmap(), i);
+                buttonOption.features = QStyleOptionButton::Flat;
+                buttonOption.rect.setHeight(buttonOption.rect.height() + 4);
+                if (col.statistics().count() > 0) {
+                    buttonOption.text = QString::number(col.statistics().count());
+                }
+                s->drawControl(QStyle::CE_PushButton, &buttonOption, painter, 0);
             }
-            s->drawControl(QStyle::CE_PushButton, &buttonOption, painter, 0);
             i++;
         }
     }
diff --git a/korganizer/views/collectionview/calendardelegate.h b/korganizer/views/collectionview/calendardelegate.h
index 0be37f6..979c174 100644
--- a/korganizer/views/collectionview/calendardelegate.h
+++ b/korganizer/views/collectionview/calendardelegate.h
@@ -36,7 +36,8 @@ public:
         AddToList,
         RemoveFromList,
         Enable,
-        Quickview
+        Quickview,
+        Total
     };
 
 Q_SIGNALS:




More information about the commits mailing list