even tough extender is private in Applet, applet has too many friends, so to be sure it's properly guarded, use a weak pointer

BUG:220482

svn path=/trunk/KDE/kdelibs/; revision=1067549
This commit is contained in:
Marco Martin 2009-12-29 19:38:37 +00:00
parent edc2fccdf4
commit a0162ccdef
4 changed files with 40 additions and 19 deletions

View File

@ -188,9 +188,9 @@ Applet::~Applet()
//problem with calling saveState(). Doing this in saveState() might be a possibility, but
//that would require every extender savestate implementation to call it's parent function,
//which isn't very nice.
d->extender->saveState();
d->extender.data()->saveState();
foreach (ExtenderItem *item, d->extender->attachedItems()) {
foreach (ExtenderItem *item, d->extender.data()->attachedItems()) {
if (item->autoExpireDelay()) {
//destroy temporary extender items, or items that aren't detached, so their
//configuration won't linger after a plasma restart.
@ -543,7 +543,7 @@ void AppletPrivate::createMessageOverlay(bool usePopup)
messageOverlayProxy->setWidget(popup->widget());
messageOverlay = new AppletOverlayWidget(messageOverlayProxy);
} else if (popup->graphicsWidget() &&
popup->graphicsWidget() != extender) {
popup->graphicsWidget() != extender.data()) {
messageOverlay = new AppletOverlayWidget(popup->graphicsWidget());
}
}
@ -570,7 +570,7 @@ void AppletPrivate::positionMessageOverlay()
// popupapplet with widget()
topItem = popup->d->proxy.data();
messageOverlay->setGeometry(popup->widget()->contentsRect());
} else if (usePopup && popup->graphicsWidget() && popup->graphicsWidget() != extender) {
} else if (usePopup && popup->graphicsWidget() && popup->graphicsWidget() != extender.data()) {
// popupapplet with graphicsWidget()
topItem = popup->graphicsWidget();
QGraphicsWidget *w = dynamic_cast<QGraphicsWidget *>(topItem);
@ -746,7 +746,7 @@ Extender *Applet::extender() const
new Extender(const_cast<Applet*>(this));
}
return d->extender;
return d->extender.data();
}
void Applet::setBusy(bool busy)
@ -2490,7 +2490,6 @@ bool Applet::isContainment() const
AppletPrivate::AppletPrivate(KService::Ptr service, int uniqueID, Applet *applet)
: appletId(uniqueID),
q(applet),
extender(0),
service(0),
preferredBackgroundHints(Applet::StandardBackground),
backgroundHints(Applet::NoBackground),
@ -2533,8 +2532,7 @@ AppletPrivate::~AppletPrivate()
}
if (extender) {
delete extender;
extender = 0;
delete extender.data();
}
delete script;

View File

@ -37,6 +37,7 @@
#include "svg.h"
#include "theme.h"
#include "widgets/label.h"
#include "widgets/scrollwidget.h"
#include "private/applet_p.h"
#include "private/applethandle_p.h"
@ -100,7 +101,7 @@ Extender::Extender(Applet *applet)
if (applet->d->extender) {
kWarning() << "Applet already has an extender, and can have only one extender."
<< "The previous extender will be destroyed.";
delete applet->d->extender;
delete applet->d->extender.data();
}
applet->d->extender = this;
@ -118,7 +119,6 @@ Extender::Extender(Applet *applet)
Extender::~Extender()
{
d->applet->d->extender = 0;
delete d;
}
@ -150,7 +150,7 @@ QList<ExtenderItem*> Extender::items() const
foreach (Containment *c, containment->corona()->containments()) {
foreach (Applet *applet, c->applets()) {
if (applet->d->extender) {
foreach (ExtenderItem *item, applet->d->extender->attachedItems()) {
foreach (ExtenderItem *item, applet->d->extender.data()->attachedItems()) {
if (item->d->sourceApplet == d->applet) {
result.append(item);
}
@ -181,7 +181,7 @@ QList<ExtenderItem*> Extender::detachedItems() const
foreach (Containment *c, containment->corona()->containments()) {
foreach (Applet *applet, c->applets()) {
if (applet->d->extender) {
foreach (ExtenderItem *item, applet->d->extender->attachedItems()) {
foreach (ExtenderItem *item, applet->d->extender.data()->attachedItems()) {
if (item->d->sourceApplet == d->applet && item->isDetached()) {
result.append(item);
}
@ -213,12 +213,12 @@ ExtenderItem *Extender::item(const QString &name) const
foreach (Containment *c, containment->corona()->containments()) {
foreach (Applet *applet, c->applets()) {
if (applet->d->extender) {
if (applet->d->extender == this) {
if (applet->d->extender.data() == this) {
// skip it, we checked it already
continue;
}
foreach (ExtenderItem *item, applet->d->extender->attachedItems()) {
foreach (ExtenderItem *item, applet->d->extender.data()->attachedItems()) {
if (item->d->sourceApplet == d->applet && item->name() == name) {
return item;
}
@ -418,16 +418,32 @@ void Extender::itemAddedEvent(ExtenderItem *item, const QPointF &pos)
if (pos == QPointF(-1, -1)) {
//if just plain adding an item, add it at a sane position:
if (!item->group()) {
ScrollWidget *scroll;
if (item->isGroup()) {
scroll = new Plasma::ScrollWidget(this);
QGraphicsWidget *mainWidget = new QGraphicsWidget(scroll);
QGraphicsLinearLayout *lay = new QGraphicsLinearLayout(mainWidget);
}
if (appearance() == BottomUpStacked) {
//at the top
if (item->isGroup()) {
d->layout->insertItem(0, scroll);
}
d->layout->insertItem(0, item);
} else {
//at the bottom
d->layout->addItem(item);
if (item->isGroup()) {
d->layout->addItem(scroll);
}
}
} else {
//at the top in the group it belongs to
d->layout->insertItem(d->insertIndexFromPos(item->group()->pos()) + 1, item);
//d->layout->insertItem(d->insertIndexFromPos(item->group()->pos()) + 1, item);
Plasma::ScrollWidget *scroll = dynamic_cast<Plasma::ScrollWidget *>(d->layout->itemAt(d->insertIndexFromPos(item->group()->pos()) + 1));
if (scroll) {
static_cast<QGraphicsLinearLayout *>(scroll->widget()->layout())->insertItem(0, item);
}
}
} else {
d->layout->insertItem(d->insertIndexFromPos(pos), item);
@ -440,6 +456,13 @@ void Extender::itemAddedEvent(ExtenderItem *item, const QPointF &pos)
void Extender::itemRemovedEvent(ExtenderItem *item)
{
if (item->isGroup()) {
QGraphicsLayoutItem *layoutItem = d->layout->itemAt(d->insertIndexFromPos(item->pos()) + 1);
if (dynamic_cast<ScrollWidget *>(layoutItem)) {
d->layout->removeItem(layoutItem);
delete item;
}
}
d->layout->removeItem(item);
if (d->spacerWidget) {

View File

@ -167,7 +167,7 @@ QGraphicsWidget *PopupApplet::graphicsWidget()
if (d->graphicsWidget != 0) {
return d->graphicsWidget;
} else {
return static_cast<Applet*>(this)->d->extender;
return static_cast<Applet*>(this)->d->extender.data();
}
}
@ -617,8 +617,8 @@ void PopupAppletPrivate::internalTogglePopup()
d->clearFocus();
} else {
if (q->graphicsWidget() &&
q->graphicsWidget() == static_cast<Applet*>(q)->d->extender &&
static_cast<Applet*>(q)->d->extender->isEmpty()) {
q->graphicsWidget() == static_cast<Applet*>(q)->d->extender.data() &&
static_cast<Applet*>(q)->d->extender.data()->isEmpty()) {
// we have nothing to show, so let's not.
return;
}

View File

@ -125,7 +125,7 @@ public:
Applet *q;
// applet attributes
Extender *extender;
QWeakPointer<Extender> extender;
Service *service;
Applet::BackgroundHints preferredBackgroundHints;
Applet::BackgroundHints backgroundHints;