give proper control over saving/restoring to the containment

svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=811211
This commit is contained in:
Aaron J. Seigo 2008-05-22 15:53:48 +00:00
parent 73c4847a75
commit 26f7e83a53
5 changed files with 90 additions and 72 deletions

View File

@ -135,42 +135,42 @@ uint Applet::id() const
return d->appletId;
}
void Applet::save(KConfigGroup* group) const
void Applet::save(KConfigGroup &group) const
{
// we call the dptr member directly for locked since isImmutable()
// also checks kiosk and parent containers
group->writeEntry("immutability", (int)d->immutability);
group->writeEntry("plugin", pluginName());
group.writeEntry("immutability", (int)d->immutability);
group.writeEntry("plugin", pluginName());
//FIXME: for containments, we need to have some special values here w/regards to
// screen affinity (e.g. "bottom of screen 0")
//kDebug() << pluginName() << "geometry is" << geometry() << "pos is" << pos() << "bounding rect is" << boundingRect();
group->writeEntry("geometry", geometry());
group->writeEntry("zvalue", zValue());
group.writeEntry("geometry", geometry());
group.writeEntry("zvalue", zValue());
if (transform() == QTransform()) {
group->deleteEntry("transform");
group.deleteEntry("transform");
} else {
QList<qreal> m;
QTransform t = transform();
m << t.m11() << t.m12() << t.m13() << t.m21() << t.m22() << t.m23() << t.m31() << t.m32() << t.m33();
group->writeEntry("transform", m);
//group->writeEntry("transform", transformToString(transform()));
group.writeEntry("transform", m);
//group.writeEntry("transform", transformToString(transform()));
}
KConfigGroup appletConfigGroup(group, "Configuration");
KConfigGroup appletConfigGroup(&group, "Configuration");
//FIXME: we need a global save state too
saveState(&appletConfigGroup);
saveState(appletConfigGroup);
}
void Applet::restore(KConfigGroup *c)
void Applet::restore(KConfigGroup &group)
{
QList<qreal> m = c->readEntry("transform", QList<qreal>());
QList<qreal> m = group.readEntry("transform", QList<qreal>());
if (m.count() == 9) {
QTransform t(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]);
setTransform(t);
}
qreal z = c->readEntry("zvalue", 0);
qreal z = group.readEntry("zvalue", 0);
if (z >= Private::s_maxZValue) {
Private::s_maxZValue = z;
@ -178,9 +178,9 @@ void Applet::restore(KConfigGroup *c)
setZValue(z);
setImmutability((ImmutabilityType)c->readEntry("immutability", (int)Mutable));
setImmutability((ImmutabilityType)group.readEntry("immutability", (int)Mutable));
QRectF geom = c->readEntry("geometry",QRectF());
QRectF geom = group.readEntry("geometry",QRectF());
if (geom.isValid()) {
setGeometry(geom);
}
@ -217,13 +217,13 @@ void Applet::setFailedToLaunch(bool failed, const QString& reason)
update();
}
void Applet::saveState(KConfigGroup* group) const
void Applet::saveState(KConfigGroup &group) const
{
if (group->config()->name() != config().config()->name()) {
if (group.config()->name() != config().config()->name()) {
// we're being saved to a different file!
// let's just copy the current values in our configuration over
KConfigGroup c = config();
d->copyEntries(&c, group);
c.copyTo(&group);
}
}
@ -589,7 +589,7 @@ bool Applet::hasFailedToLaunch() const
return d->failed;
}
void Applet::paintWindowFrame ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
void Applet::paintWindowFrame(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
//Here come the code for the window frame
//kDebug()<<"ENTER in windowFrame";
@ -1415,6 +1415,7 @@ void Applet::Private::init()
if (!appletDescription.isValid()) {
q->setFailedToLaunch(true, i18n("Invalid applet description"));
kDebug() << "Check your constructor! You must be passing a Service::Ptr or a QVariantList args through!";
return;
}
@ -1546,22 +1547,6 @@ KConfigGroup* Applet::Private::mainConfigGroup()
return mainConfig;
}
void Applet::Private::copyEntries(KConfigGroup *source, KConfigGroup *destination)
{
foreach (const QString &group, source->groupList()) {
KConfigGroup subSource(source, group);
KConfigGroup subDest(destination, group);
copyEntries(&subSource, &subDest);
}
QMap<QString, QString> entries = source->entryMap();
QMapIterator<QString, QString> it(entries);
while (it.hasNext()) {
it.next();
destination->writeEntry(it.key(), it.value());
}
}
QString Applet::Private::visibleFailureText(const QString& reason)
{
QString text;

View File

@ -26,8 +26,9 @@
#include <QtGui/QWidget>
#include <QtGui/QGraphicsWidget>
#include <KDE/KPluginInfo>
#include <KDE/KConfigGroup>
#include <KDE/KGenericFactory>
#include <KDE/KPluginInfo>
#include <plasma/configxml.h>
#include <plasma/packagestructure.h>
@ -120,12 +121,12 @@ class PLASMA_EXPORT Applet : public QGraphicsWidget
/**
* Saves state information about this applet.
**/
void save(KConfigGroup* group) const;
virtual void save(KConfigGroup &group) const;
/**
* Restores state information about this applet.
**/
void restore(KConfigGroup* group);
virtual void restore(KConfigGroup &group);
/**
* Returns a KConfigGroup object to be shared by all applets of this
@ -582,7 +583,7 @@ class PLASMA_EXPORT Applet : public QGraphicsWidget
* Called when a request to save the state of the applet is made
* during runtime
**/
virtual void saveState(KConfigGroup* config) const;
virtual void saveState(KConfigGroup &config) const;
/**
* Sets whether or not this applet provides a user interface for

View File

@ -184,15 +184,19 @@ bool appletConfigLessThan(const KConfigGroup &c1, const KConfigGroup &c2)
return p1.y() < p2.y();
}
void Containment::loadContainment(KConfigGroup* group)
void Containment::restore(KConfigGroup &group)
{
/*kDebug() << "!!!!!!!!!!!!initConstraints" << group->name() << containmentType();
kDebug() << " location:" << group->readEntry("location", (int)d->location);
kDebug() << " geom:" << group->readEntry("geometry", geometry());
kDebug() << " formfactor:" << group->readEntry("formfactor", (int)d->formFactor);
kDebug() << " screen:" << group->readEntry("screen", d->screen);*/
/*kDebug() << "!!!!!!!!!!!!initConstraints" << group.name() << containmentType();
kDebug() << " location:" << group.readEntry("location", (int)d->location);
kDebug() << " geom:" << group.readEntry("geometry", geometry());
kDebug() << " formfactor:" << group.readEntry("formfactor", (int)d->formFactor);
kDebug() << " screen:" << group.readEntry("screen", d->screen);*/
if (!isContainment()) {
Applet::restore(group);
return;
}
QRectF geo = group->readEntry("geometry", geometry());
QRectF geo = group.readEntry("geometry", geometry());
//override max/min
//this ensures panels are set to their saved size even when they have max & min set to prevent
//resizing
@ -204,13 +208,38 @@ void Containment::loadContainment(KConfigGroup* group)
}
setGeometry(geo);
setLocation((Plasma::Location)group->readEntry("location", (int)d->location));
setFormFactor((Plasma::FormFactor)group->readEntry("formfactor", (int)d->formFactor));
setScreen(group->readEntry("screen", d->screen));
setLocation((Plasma::Location)group.readEntry("location", (int)d->location));
setFormFactor((Plasma::FormFactor)group.readEntry("formfactor", (int)d->formFactor));
setScreen(group.readEntry("screen", d->screen));
flushPendingConstraintsEvents();
//kDebug() << "Containment" << id() << "geometry is" << geometry() << "config'd with" << appletConfig.name();
KConfigGroup applets(group, "Applets");
restoreContents(group);
setImmutability((ImmutabilityType)group.readEntry("immutability", (int)Mutable));
}
void Containment::save(KConfigGroup &group) const
{
// locking is saved in Applet::save
Applet::save(group);
group.writeEntry("screen", d->screen);
group.writeEntry("formfactor", (int)d->formFactor);
group.writeEntry("location", (int)d->location);
saveContents(group);
}
void Containment::saveContents(KConfigGroup &group) const
{
KConfigGroup applets(&group, "Applets");
foreach (const Applet* applet, d->applets) {
KConfigGroup appletConfig(&applets, QString::number(applet->id()));
applet->save(appletConfig);
}
}
void Containment::restoreContents(KConfigGroup &group)
{
KConfigGroup applets(&group, "Applets");
// Sort the applet configs in order of geometry to ensure that applets
// are added from left to right or top to bottom for a panel containment
@ -232,18 +261,10 @@ void Containment::loadContainment(KConfigGroup* group)
}
Applet *applet = d->addApplet(plugin, QVariantList(), appletConfig.readEntry("geometry", QRectF()), appId, true);
applet->restore(&appletConfig);
applet->restore(appletConfig);
}
}
void Containment::saveContainment(KConfigGroup* group) const
{
// locking is saved in Applet::save
group->writeEntry("screen", d->screen);
group->writeEntry("formfactor", (int)d->formFactor);
group->writeEntry("location", (int)d->location);
}
Containment::Type Containment::containmentType() const
{
return d->type;

View File

@ -210,14 +210,14 @@ class PLASMA_EXPORT Containment : public Applet
QPoint effectiveScreenPos() const;
/**
* @internal
* @reimplemented from Applet
*/
void saveContainment(KConfigGroup *group) const;
void save(KConfigGroup &group) const;
/**
* @internal
* @reimplemented from Applet
*/
void loadContainment(KConfigGroup *group);
void restore(KConfigGroup &group);
/**
* Constructs a ToolBox item and adds it to the toolbox. The toolbox takes over ownership of the item. Returns the constructed tool.
@ -369,6 +369,23 @@ class PLASMA_EXPORT Containment : public Applet
*/
void setContainmentType(Containment::Type type);
/**
* Called when the contents of the containment should be saved. By default this saves
* all loaded Applets
*
* @param group the KConfigGroup to save settings under
*/
virtual void saveContents(KConfigGroup &group) const;
/**
* Called when the contents of the containment should be loaded. By default this loads
* all previously saved Applets
*
* @param group the KConfigGroup to save settings under
*/
virtual void restoreContents(KConfigGroup &group);
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);

View File

@ -89,13 +89,7 @@ public:
foreach (const Containment *containment, containments) {
QString cid = QString::number(containment->id());
KConfigGroup containmentConfig(&containmentsGroup, cid);
containment->saveContainment(&containmentConfig);
containment->save(&containmentConfig);
KConfigGroup applets(&containmentConfig, "Applets");
foreach (const Applet* applet, containment->applets()) {
KConfigGroup appletConfig(&applets, QString::number(applet->id()));
applet->save(&appletConfig);
}
containment->save(containmentConfig);
}
}
@ -115,7 +109,7 @@ public:
// so this unsafe looking code is actually just fine.
Containment* containment = static_cast<Plasma::Containment*>(obj);
int index = containments.indexOf(containment);
if (index > -1) {
containments.removeAt(index);
}
@ -276,7 +270,7 @@ void Corona::loadLayout(const QString& configName)
addItem(c);
c->init();
c->loadContainment(&containmentConfig);
c->restore(containmentConfig);
}
if (d->containments.isEmpty()) {