From ed8c50e03fc803dfa22242f95d2e7ad1ad13c0b8 Mon Sep 17 00:00:00 2001 From: "Aaron J. Seigo" Date: Sat, 24 Nov 2007 23:38:37 +0000 Subject: [PATCH] completely change how we save and load containments and panels. it all happens from one file now using nested groups. this has two major effects: - one file to rule them all for any given corona; this makes things even nicer for use in other apps, btw. - the ability to easily save, send/share and restore corona configuration layouts; something i've wanted from the start svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=741158 --- applet.cpp | 100 +++++++++++++++++++-------------------- applet.h | 2 +- containment.h | 2 +- corona.cpp | 128 ++++++++++++++++++++++++++------------------------ corona.h | 10 ++++ 5 files changed, 128 insertions(+), 114 deletions(-) diff --git a/applet.cpp b/applet.cpp index d5c84250f..c4bfe0122 100644 --- a/applet.cpp +++ b/applet.cpp @@ -71,8 +71,6 @@ class Applet::Private public: Private(KService::Ptr service, int uniqueID) : appletId(uniqueID), - globalConfig(0), - appletConfig(0), appletDescription(service), package(0), background(0), @@ -170,7 +168,8 @@ public: QString xmlPath = package->filePath("mainconfigxml"); if (!xmlPath.isEmpty()) { QFile file(xmlPath); - configXml = new ConfigXml(config(), &file); + // FIXME: KConfigSkeleton doesn't play well with KConfigGroup =/ + //configXml = new ConfigXml(applet->config(), &file); } if (!package->filePath("mainconfigui").isEmpty()) { @@ -303,17 +302,6 @@ public: return s_maxAppletId; } - KSharedConfig::Ptr config() { - if (!appletConfig) { - QString file = KStandardDirs::locateLocal("appdata", - "applets/" + instanceName() + "rc", - true); - appletConfig = KSharedConfig::openConfig(file); - } - - return appletConfig; - } - QString instanceName() { if (!appletDescription.isValid()) { @@ -346,8 +334,6 @@ public: //TODO: examine the usage of memory here; there's a pretty large // number of members at this point. uint appletId; - KSharedConfig::Ptr globalConfig; - KSharedConfig::Ptr appletConfig; KPluginInfo appletDescription; Package* package; QList watchedForFocus; @@ -391,16 +377,7 @@ Applet::Applet(QObject* parentObject, const QVariantList& args) Applet::~Applet() { - needsFocus( false ); - - if (d->appletConfig) { - d->appletConfig->sync(); - } - - if (d->globalConfig) { - d->globalConfig->sync(); - } - + needsFocus(false); delete d; } @@ -413,11 +390,6 @@ uint Applet::id() const return d->appletId; } -KConfigGroup Applet::config() const -{ - return KConfigGroup(d->config(), "General"); -} - void Applet::save(KConfigGroup* group) const { group->writeEntry("plugin", pluginName()); @@ -436,12 +408,8 @@ void Applet::save(KConfigGroup* group) const //group->writeEntry("transform", transformToString(transform())); } - Containment* c = containment(); - if (c) { - group->writeEntry("containment", c->id()); - } - - saveState(group); + KConfigGroup appletConfigGroup(group, "Configuration"); + saveState(&appletConfigGroup); } void Applet::saveState(KConfigGroup* group) const @@ -449,20 +417,53 @@ void Applet::saveState(KConfigGroup* group) const Q_UNUSED(group) } -KConfigGroup Applet::config(const QString& group) const +KConfigGroup Applet::config(const QString &group) const { KConfigGroup cg = config(); - return KConfigGroup(cg.config(), instanceName() + '-' + group); + return KConfigGroup(&cg, group); +} + +KConfigGroup Applet::config() const +{ + if (d->isContainment) { + const Containment *asContainment = qobject_cast(const_cast(this)); + Q_ASSERT(asContainment); + + KConfigGroup containmentConfig; + if (asContainment->corona()) { + containmentConfig = KConfigGroup(asContainment->corona()->config(), "Containments"); + } else { + containmentConfig = KConfigGroup(KGlobal::config(), "Containments"); + } + + containmentConfig = KConfigGroup(&containmentConfig, QString::number(d->appletId)); + return containmentConfig; + } + + KConfigGroup appletConfig; + if (containment()) { + appletConfig = containment()->config(); + appletConfig = KConfigGroup(&appletConfig, "Applets"); + } else { + kWarning() << "requesting config for" << name() << "without a containment!"; + appletConfig = KConfigGroup(KGlobal::config(), "Applets"); + } + + appletConfig = KConfigGroup(&appletConfig, QString::number(d->appletId)); + return KConfigGroup(&appletConfig, "Configuration"); } KConfigGroup Applet::globalConfig() const { - if ( !d->globalConfig ) { - QString file = KStandardDirs::locateLocal( "config", "plasma_" + globalName() + "rc" ); - d->globalConfig = KSharedConfig::openConfig( file ); + KConfigGroup globalAppletConfig; + if (containment() && containment()->corona()) { + KSharedConfig::Ptr coronaConfig = containment()->corona()->config(); + globalAppletConfig = KConfigGroup(coronaConfig, "AppletGlobals"); + } else { + globalAppletConfig = KConfigGroup(KGlobal::config(), "AppletGlobals"); } - return KConfigGroup(d->globalConfig, "General"); + return KConfigGroup(&globalAppletConfig, globalName()); } void Applet::destroy() @@ -471,13 +472,7 @@ void Applet::destroy() d->configXml->setDefaults(); } - if (d->appletConfig) { - foreach (const QString& group, d->appletConfig->groupList()) { - d->appletConfig->deleteGroup(group); - } - d->appletConfig = 0; - } - + config().deleteGroup(); deleteLater(); } @@ -749,6 +744,7 @@ QSizeF Applet::sizeHint() const int bottom = 0; d->getBorderSize(left, top, right, bottom); + QSizeF borderSize = QSizeF(left + right, top + bottom); //kDebug() << "Applet content size hint: " << contentSizeHint() << "plus our borders" << left << right << top << bottom; @@ -890,7 +886,7 @@ QSizeF Applet::contentSizeHint() const return layout()->sizeHint(); } - return QSizeF(0, 0); + return contentSize(); } QString Applet::globalName() const @@ -1179,6 +1175,8 @@ void Applet::setGeometry(const QRectF& geometry) if (managingLayout()) { managingLayout()->invalidate(); } + + updateConstraints(Plasma::SizeConstraint); } setPos(geometry.topLeft()); diff --git a/applet.h b/applet.h index 74bced14e..42e42471b 100644 --- a/applet.h +++ b/applet.h @@ -127,7 +127,7 @@ class PLASMA_EXPORT Applet : public Widget * * @param group the name of the group to access **/ - KConfigGroup config(const QString& group) const; + KConfigGroup config(const QString &group) const; /** * Saves state information about this applet. diff --git a/containment.h b/containment.h index 9f07846b5..cadf565b0 100644 --- a/containment.h +++ b/containment.h @@ -262,12 +262,12 @@ class PLASMA_EXPORT Containment : public Applet */ void setFormFactor(Plasma::FormFactor formFactor); - protected: /** * Returns the Corona (if any) that this Containment is hosted by */ Corona* corona() const; + protected: void contextMenuEvent(QGraphicsSceneContextMenuEvent * event); void hoverEnterEvent(QGraphicsSceneHoverEvent *event); void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); diff --git a/corona.cpp b/corona.cpp index 1e204dd15..ac8c0f47e 100644 --- a/corona.cpp +++ b/corona.cpp @@ -50,7 +50,9 @@ class Corona::Private public: Private() : immutable(false), - mimetype("text/x-plasmoidservicename") + mimetype("text/x-plasmoidservicename"), + configName("plasma-appletsrc"), + config(0) { } @@ -65,6 +67,8 @@ public: bool immutable; QString mimetype; + QString configName; + KSharedConfigPtr config; QList containments; }; @@ -117,18 +121,18 @@ QString Corona::appletMimeType() void Corona::saveApplets(const QString &config) const { KConfig cg(config); - foreach (const QString& group, cg.groupList()) { - cg.deleteGroup(group); - } + d->configName = config; QStringList containmentIds; + KConfigGroup containments(&cg, "Containments"); foreach (const Containment *containment, d->containments) { QString cid = QString::number(containment->id()); - KConfigGroup containmentConfig(&cg, cid.append("-containment")); + KConfigGroup containmentConfig(&containments, cid); containment->saveConstraints(&containmentConfig); containment->save(&containmentConfig); + KConfigGroup applets(&containmentConfig, "Applets"); foreach (const Applet* applet, containment->applets()) { - KConfigGroup appletConfig(&cg, QString::number(applet->id()).append("-applet")); + KConfigGroup appletConfig(&applets, QString::number(applet->id())); applet->save(&appletConfig); } } @@ -136,85 +140,67 @@ void Corona::saveApplets(const QString &config) const void Corona::saveApplets() const { - saveApplets("plasma-appletsrc"); + saveApplets(d->configName); } -void Corona::loadApplets(const QString& configname) +void Corona::loadApplets(const QString& configName) { clearApplets(); + d->configName = configName; - KConfig config(configname, KConfig::SimpleConfig); - - QList applets; - QHash containments; - foreach (const QString& group, config.groupList()) { - KConfigGroup appletConfig(&config, group); - if (group.endsWith("containment")) { - int cid = group.left(group.indexOf('-')).toUInt(); - Containment *c = addContainment(appletConfig.readEntry("plugin", QString()), QVariantList(), - cid, true); - if (c) { - addItem(c); - containments.insert(c->id(), c); - c->loadConstraints(&appletConfig); - //kDebug() << "Containment" << c->id() << "geometry is" << c->geometry().toRect() << "config'd with" << appletConfig.name(); - } - } else { - // it's an applet, let's grab the containment association - //kDebug() << "insert multi" << group; - applets.append(appletConfig); - } - } - - //int maxContainment = containments.size(); - //kDebug() << "number of applets?" << applets.count(); - foreach (KConfigGroup cg, applets) { - int cid = cg.readEntry("containment", 0); - //kDebug() << "trying to load applet " << cg.name() << " in containment " << cid; - - Containment* c = containments.value(cid, 0); + KConfig config(configName, KConfig::SimpleConfig); + KConfigGroup containments(&config, "Containments"); + foreach (const QString& group, containments.groupList()) { + KConfigGroup containmentConfig(&containments, group); + int cid = group.toUInt(); + kDebug() << "got a containment in the config, trying to make a" << containmentConfig.readEntry("plugin", QString()) << "from" << group; + Containment *c = addContainment(containmentConfig.readEntry("plugin", QString()), QVariantList(), + cid, true); if (!c) { - kDebug() << "couldn't find containment " << cid << ", skipping this applet"; continue; } - //kDebug() << "creating applet " << cg.name() << "in containment" << cid << "at geometry" << cg.readEntry("geometry", QRectF()); - int appId = cg.name().left(cg.name().indexOf('-')).toUInt(); - Applet *applet = c->addApplet(cg.readEntry("plugin", QString()), QVariantList(), - appId, cg.readEntry("geometry", QRectF()), true); - QList m = cg.readEntry("transform", QList()); - if (m.count() == 9) { - QTransform t(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); + addItem(c); + c->loadConstraints(&containmentConfig); + //kDebug() << "Containment" << c->id() << "geometry is" << c->geometry().toRect() << "config'd with" << appletConfig.name(); + KConfigGroup applets(&containmentConfig, "Applets"); + + foreach (const QString &appletGroup, applets.groupList()) { + kDebug() << "reading from applet group" << appletGroup; + int appId = appletGroup.toUInt(); + KConfigGroup appletConfig(&applets, appletGroup); + kDebug() << "the name is" << appletConfig.name(); + Applet *applet = c->addApplet(appletConfig.readEntry("plugin", QString()), QVariantList(), + appId, appletConfig.readEntry("geometry", QRectF()), true); + Q_UNUSED(applet) // FIXME: the transform does not stick; it gets set then almost immediately reset. // find out why and then reenable this - //applet->setTransform(t); + /* + QList m = cg.readEntry("transform", QList()); + if (m.count() == 9) { + QTransform t(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]); + applet->setTransform(t); + } + */ } } - foreach (Containment* c, containments) { - QString cid = QString::number(c->id()); - KConfigGroup containmentConfig(&config, cid.append("-containment")); - c->setImmutable(containmentConfig.isImmutable()); - } - if (d->containments.count() < 1) { loadDefaultSetup(); } else { foreach (Containment* containment, d->containments) { + QString cid = QString::number(containment->id()); containment->init(); + KConfigGroup containmentConfig(&containments, cid); + containment->setImmutable(containmentConfig.isImmutable()); foreach(Applet* applet, containment->applets()) { applet->init(); } - } - } - foreach (Containment* containment, d->containments) { - // we need to manually flush the constraints changes - // because we may not get back to the event loop before - // view set up - containment->flushUpdatedConstraints(); + containment->flushUpdatedConstraints(); + } } setImmutable(config.isImmutable()); @@ -222,7 +208,7 @@ void Corona::loadApplets(const QString& configname) void Corona::loadApplets() { - loadApplets("plasma-appletsrc"); + loadApplets(d->configName); } void Corona::loadDefaultSetup() @@ -300,6 +286,15 @@ void Corona::clearApplets() } } +KSharedConfigPtr Corona::config() +{ + if (!d->config) { + d->config = KSharedConfig::openConfig(d->configName); + } + + return d->config; +} + Containment* Corona::addContainment(const QString& name, const QVariantList& args, uint id, bool delayedInit) { QString pluginName = name; @@ -344,6 +339,17 @@ Containment* Corona::addContainment(const QString& name, const QVariantList& arg return containment; } +void Corona::destroyContainment(Containment *c) +{ + if (!d->containments.contains(c)) { + return; + } + + d->containments.removeAll(c); + c->config().deleteGroup(); + c->deleteLater(); +} + Applet* Corona::addApplet(const QString& name, const QVariantList& args, uint id, const QRectF& geometry) { if (d->containments.size() < 1) { diff --git a/corona.h b/corona.h index ec105e4c4..26b5c9ba0 100644 --- a/corona.h +++ b/corona.h @@ -93,6 +93,11 @@ public: */ void clearApplets(); + /** + * Returns the the config file used to store the configuration for this Corona + */ + KSharedConfig::Ptr config(); + public Q_SLOTS: /** * Load applets from the default config file @@ -137,6 +142,11 @@ public Q_SLOTS: Containment* addContainment(const QString& name, const QVariantList& args = QVariantList(), uint id = 0, bool delayInit = false); + /** + * Removes a given containment from the corona + */ + void destroyContainment(Containment *containment); + /** * Returns the Containment, if any, for a given physical screen *