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