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:
parent
edc2fccdf4
commit
a0162ccdef
14
applet.cpp
14
applet.cpp
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -125,7 +125,7 @@ public:
|
||||
Applet *q;
|
||||
|
||||
// applet attributes
|
||||
Extender *extender;
|
||||
QWeakPointer<Extender> extender;
|
||||
Service *service;
|
||||
Applet::BackgroundHints preferredBackgroundHints;
|
||||
Applet::BackgroundHints backgroundHints;
|
||||
|
Loading…
Reference in New Issue
Block a user