Branch 'kolab/integration/4.13.0' - 2 commits - calendarsupport/kcalprefs.cpp calendarsupport/kcalprefs.h korganizer/calendarview.cpp

Christian Mollekopf mollekopf at kolabsys.com
Sun Oct 19 19:24:41 CEST 2014


 calendarsupport/kcalprefs.cpp |   81 ++++++++++++++++++++++++++++++++++++------
 calendarsupport/kcalprefs.h   |   30 +++++++++++++++
 korganizer/calendarview.cpp   |    4 ++
 3 files changed, 104 insertions(+), 11 deletions(-)

New commits:
commit a8698bc2b4c47fc64f19a3612d09955dbc1bc43c
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Oct 17 18:30:06 2014 +0200

    CalendarSupport/KCalPrefs: Store category colors in tags.

diff --git a/calendarsupport/kcalprefs.cpp b/calendarsupport/kcalprefs.cpp
index 559377b..46e521d 100644
--- a/calendarsupport/kcalprefs.cpp
+++ b/calendarsupport/kcalprefs.cpp
@@ -23,7 +23,12 @@
 
 #include "kcalprefs.h"
 #include "identitymanager.h"
-#include "categoryconfig.h"
+
+#include <akonadi/tagattribute.h>
+#include <akonadi/tagmodifyjob.h>
+#include <akonadi/tagfetchjob.h>
+#include <akonadi/tagfetchscope.h>
+#include <akonadi/monitor.h>
 
 #include <KMime/HeaderParsing>
 
@@ -37,6 +42,7 @@
 
 using namespace CalendarSupport;
 
+
 K_GLOBAL_STATIC( KCalPrefs, globalPrefs )
 
 class KCalPrefs::Private
@@ -45,19 +51,16 @@ class KCalPrefs::Private
     Private( KCalPrefs *qq ) : mDefaultCalendarId( -1 ), q( qq )
     {
       mDefaultCategoryColor = QColor( 151, 235, 121 );
-      mCategoryConfig = new CategoryConfig( q );
     }
 
     ~Private()
     {
-      delete mCategoryConfig;
     }
 
     KDateTime::Spec mTimeSpec;
     Akonadi::Entity::Id mDefaultCalendarId;
 
-    CategoryConfig *mCategoryConfig;
-    QHash<QString,QColor> mCategoryColors;
+    TagCache mTagCache;
     QColor mDefaultCategoryColor;
     QDateTime mDayBegins;
 
@@ -166,8 +169,6 @@ void KCalPrefs::usrReadConfig()
   KConfigGroup defaultCalendarConfig( config(), "Calendar" );
   d->mDefaultCalendarId = defaultCalendarConfig.readEntry( "Default Calendar", -1 );
 
-  // Category colors
-  d->mCategoryColors = d->mCategoryConfig->readColors();
 #if 0
   config()->setGroup( "FreeBusy" );
   if ( mRememberRetrievePw ) {
@@ -183,7 +184,6 @@ void KCalPrefs::usrReadConfig()
 void KCalPrefs::usrWriteConfig()
 {
   KConfigGroup generalConfig( config(), "General" );
-  d->mCategoryConfig->setColors( d->mCategoryColors );
 
 #if 0
   if ( mRememberRetrievePw ) {
@@ -312,7 +312,10 @@ bool KCalPrefs::thatIsMe( const QString &_email )
 
 void KCalPrefs::setCategoryColor( const QString &cat, const QColor &color )
 {
-  d->mCategoryColors.insert( cat, color );
+  Akonadi::Tag tag = d->mTagCache.getTagByGid(cat.toUtf8());
+  Akonadi::TagAttribute *attr = tag.attribute<Akonadi::TagAttribute>(Akonadi::AttributeEntity::AddIfMissing);
+  attr->setBackgroundColor(color);
+  new Akonadi::TagModifyJob(tag);
 }
 
 QColor KCalPrefs::categoryColor( const QString &cat ) const
@@ -320,7 +323,10 @@ QColor KCalPrefs::categoryColor( const QString &cat ) const
   QColor color;
 
   if ( !cat.isEmpty() ) {
-    color = d->mCategoryColors.value( cat );
+    Akonadi::Tag tag = d->mTagCache.getTagByGid(cat.toUtf8());
+    if (Akonadi::TagAttribute *attr = tag.attribute<Akonadi::TagAttribute>()) {
+      color = attr->backgroundColor();
+    }
   }
 
   return color.isValid() ? color : d->mDefaultCategoryColor;
@@ -328,7 +334,7 @@ QColor KCalPrefs::categoryColor( const QString &cat ) const
 
 bool KCalPrefs::hasCategoryColor( const QString &cat ) const
 {
-  return d->mCategoryColors[ cat ].isValid();
+  return (categoryColor(cat) != d->mDefaultCategoryColor);
 }
 
 void KCalPrefs::setDayBegins( const QDateTime &dateTime )
@@ -340,3 +346,56 @@ QDateTime KCalPrefs::dayBegins() const
 {
   return d->mDayBegins;
 }
+
+TagCache::TagCache()
+    : QObject(),
+      mMonitor(new Akonadi::Monitor(this))
+{
+    mMonitor->setTypeMonitored(Akonadi::Monitor::Tags);
+    mMonitor->tagFetchScope().fetchAttribute<Akonadi::TagAttribute>();
+    connect(mMonitor, SIGNAL(tagAdded(Akonadi::Tag)), this, SLOT(onTagAdded(Akonadi::Tag)));
+    connect(mMonitor, SIGNAL(tagRemoved(Akonadi::Tag)), this, SLOT(onTagRemoved(Akonadi::Tag)));
+    connect(mMonitor, SIGNAL(tagChanged(Akonadi::Tag)), this, SLOT(onTagChanged(Akonadi::Tag)));
+    retrieveTags();
+}
+
+Akonadi::Tag TagCache::getTagByGid(const QByteArray &gid)
+{
+    return mCache.value(mGidCache.value(gid));
+}
+
+void TagCache::onTagAdded(const Akonadi::Tag &tag)
+{
+    mCache.insert(tag.id(), tag);
+    mGidCache.insert(tag.gid(), tag.id());
+}
+
+void TagCache::onTagChanged(const Akonadi::Tag &tag)
+{
+    onTagAdded(tag);
+}
+
+void TagCache::onTagRemoved(const Akonadi::Tag &tag)
+{
+    mCache.remove(tag.id());
+    mGidCache.remove(tag.gid());
+}
+
+void TagCache::retrieveTags()
+{
+    Akonadi::TagFetchJob *tagFetchJob = new Akonadi::TagFetchJob(this);
+    tagFetchJob->fetchScope().fetchAttribute<Akonadi::TagAttribute>();
+    connect(tagFetchJob, SIGNAL(result(KJob*)), this, SLOT(onTagsFetched(KJob*)));
+}
+
+void TagCache::onTagsFetched(KJob *job)
+{
+    if (job->error()) {
+        kWarning() << "Failed to fetch tags: " << job->errorString();
+        return;
+    }
+    Akonadi::TagFetchJob *fetchJob = static_cast<Akonadi::TagFetchJob*>(job);
+    Q_FOREACH(const Akonadi::Tag &tag, fetchJob->tags()) {
+        onTagAdded(tag);
+    }
+}
diff --git a/calendarsupport/kcalprefs.h b/calendarsupport/kcalprefs.h
index e12c005..4e01c57 100644
--- a/calendarsupport/kcalprefs.h
+++ b/calendarsupport/kcalprefs.h
@@ -26,9 +26,15 @@
 #include "kcalprefs_base.h"
 
 #include <Akonadi/Entity>
+#include <Akonadi/Tag>
 
 #include <KDateTime>
 
+namespace Akonadi {
+    class Monitor;
+};
+class KJob;
+
 namespace CalendarSupport {
 
 class CALENDARSUPPORT_EXPORT KCalPrefs : public KCalPrefsBase
@@ -91,6 +97,30 @@ class CALENDARSUPPORT_EXPORT KCalPrefs : public KCalPrefsBase
     Private *const d;
 };
 
+/**
+ * A tag cache
+ */
+class TagCache : public QObject
+{
+  Q_OBJECT
+public:
+    TagCache();
+    Akonadi::Tag getTagByGid(const QByteArray &gid);
+
+private Q_SLOTS:
+    void onTagAdded(const Akonadi::Tag &);
+    void onTagChanged(const Akonadi::Tag &);
+    void onTagRemoved(const Akonadi::Tag &);
+    void onTagsFetched(KJob*);
+
+private:
+    void retrieveTags();
+
+    QHash<Akonadi::Tag::Id, Akonadi::Tag> mCache;
+    QHash<QByteArray, Akonadi::Tag::Id> mGidCache;
+    Akonadi::Monitor *mMonitor;
+};
+
 }
 
 #endif


commit 60b3eece4398429f9c2098fc6d812fcdf2a2abd9
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Oct 15 13:27:26 2014 +0200

    Declined/OpenInvitations calendars: Avoid remote searches
    
    They don't work anyways so avoid the additional cost of a remote search try.

diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp
index 0815eb9..af231d5 100644
--- a/korganizer/calendarview.cpp
+++ b/korganizer/calendarview.cpp
@@ -360,6 +360,7 @@ void CalendarView::onIdentitiesChanged()
     if (!mOpenInvitationCollection.isValid()) {
         const QString name = QLatin1String("OpenInvitations");
         Akonadi::SearchCreateJob *job = new Akonadi::SearchCreateJob(name, query);
+        job->setRemoteSearchEnabled(false);
         job->setSearchMimeTypes(QStringList() << KCalCore::Event::eventMimeType()
             << KCalCore::Todo::todoMimeType()
             << KCalCore::Journal::journalMimeType());
@@ -370,6 +371,7 @@ void CalendarView::onIdentitiesChanged()
         Akonadi::PersistentSearchAttribute *attribute = mOpenInvitationCollection.attribute<Akonadi::PersistentSearchAttribute>( Akonadi::Entity::AddIfMissing );
         Akonadi::EntityDisplayAttribute *displayname  = mOpenInvitationCollection.attribute<Akonadi::EntityDisplayAttribute >( Akonadi::Entity::AddIfMissing );
         attribute->setQueryString( QString::fromLatin1(query.toJSON()) );
+        attribute->setRemoteSearchEnabled(false);
         displayname->setDisplayName(i18nc("A collection of all open invidations.", "Open Invitations"));
         Akonadi::CollectionModifyJob *job = new Akonadi::CollectionModifyJob( mOpenInvitationCollection, this );
         connect( job, SIGNAL(result(KJob*)), this, SLOT(modifyResult(KJob*)) );
@@ -384,6 +386,7 @@ void CalendarView::onIdentitiesChanged()
     if (!mDeclineCollection.isValid()) {
         const QString name = QLatin1String("DeclinedInvitations");
         Akonadi::SearchCreateJob *job = new Akonadi::SearchCreateJob(name, query);
+        job->setRemoteSearchEnabled(false);
         job->setSearchMimeTypes(QStringList() << KCalCore::Event::eventMimeType()
             << KCalCore::Todo::todoMimeType()
             << KCalCore::Journal::journalMimeType());
@@ -395,6 +398,7 @@ void CalendarView::onIdentitiesChanged()
         Akonadi::EntityDisplayAttribute *displayname  = mDeclineCollection.attribute<Akonadi::EntityDisplayAttribute >( Akonadi::Entity::AddIfMissing );
 
         persistentsearch->setQueryString( QString::fromLatin1(query.toJSON()) );
+        persistentsearch->setRemoteSearchEnabled(false);
         displayname->setDisplayName(i18nc("A collection of all declined invidations.", "Declined Invitations"));
         Akonadi::CollectionModifyJob *job = new Akonadi::CollectionModifyJob( mDeclineCollection, this );
         connect( job, SIGNAL(result(KJob*)), this, SLOT(modifyResult(KJob*)) );




More information about the commits mailing list