too much classes clobbers with the Extender's private, protect d->applet behind a QWeakPointer

BUG:195369
BUG:232408
CCBUG:233563
BUG:239022

svn path=/trunk/KDE/kdelibs/; revision=1131248
This commit is contained in:
Marco Martin 2010-05-27 19:59:15 +00:00
parent 653fdbbfb6
commit b8893a8044
4 changed files with 66 additions and 36 deletions

View File

@ -172,7 +172,10 @@ Plasma::Applet *DialogPrivate::applet()
Extender *extender = qobject_cast<Extender*>(graphicsWidgetPtr.data());
Plasma::Applet *applet = 0;
if (extender) {
applet = extender->d->applet;
if (!extender->d->applet) {
return 0;
}
applet = extender->d->applet.data();
} else if (graphicsWidgetPtr) {
QObject *pw = graphicsWidgetPtr.data();

View File

@ -137,7 +137,11 @@ QList<ExtenderItem*> Extender::items() const
//FIXME: a triple nested loop ... ew. there should be a more efficient way to do this
//iterate through all extenders we can find and check each extenders source applet.
Containment *containment = d->applet->containment();
if (!d->applet) {
return QList<ExtenderItem*>();
}
Containment *containment = d->applet.data()->containment();
if (!containment) {
return result;
}
@ -146,7 +150,7 @@ QList<ExtenderItem*> Extender::items() const
foreach (Applet *applet, c->applets()) {
if (applet->d->extender) {
foreach (ExtenderItem *item, applet->d->extender.data()->attachedItems()) {
if (item->d->sourceApplet == d->applet) {
if (item->d->sourceApplet == d->applet.data()) {
result.append(item);
}
}
@ -168,7 +172,10 @@ QList<ExtenderItem*> Extender::detachedItems() const
//FIXME: a triple nested loop ... ew. there should be a more efficient way to do this
//iterate through all extenders we can find and check each extenders source applet.
Containment *containment = d->applet->containment();
if (!d->applet) {
return QList<ExtenderItem*>();
}
Containment *containment = d->applet.data()->containment();
if (!containment) {
return result;
}
@ -177,7 +184,7 @@ QList<ExtenderItem*> Extender::detachedItems() const
foreach (Applet *applet, c->applets()) {
if (applet->d->extender) {
foreach (ExtenderItem *item, applet->d->extender.data()->attachedItems()) {
if (item->d->sourceApplet == d->applet && item->isDetached()) {
if (item->d->sourceApplet == d->applet.data() && item->isDetached()) {
result.append(item);
}
}
@ -192,7 +199,7 @@ ExtenderItem *Extender::item(const QString &name) const
{
// chances are the item is in our own extender, so check there first
foreach (ExtenderItem *item, d->attachedExtenderItems) {
if (item->d->sourceApplet == d->applet && item->name() == name) {
if (item->d->sourceApplet == d->applet.data() && item->name() == name) {
return item;
}
}
@ -200,7 +207,10 @@ ExtenderItem *Extender::item(const QString &name) const
// maybe it's been moved elsewhere, so lets search through the entire tree of elements
//FIXME: a triple nested loop ... ew. there should be a more efficient way to do this
//iterate through all extenders we can find and check each extenders source applet.
Containment *containment = d->applet->containment();
if (!d->applet) {
return 0;
}
Containment *containment = d->applet.data()->containment();
if (!containment) {
return 0;
}
@ -221,7 +231,7 @@ ExtenderItem *Extender::item(const QString &name) const
}
foreach (ExtenderItem *item, applet->d->extender.data()->attachedItems()) {
if (item->d->sourceApplet == d->applet && item->name() == name) {
if (item->d->sourceApplet == d->applet.data() && item->name() == name) {
return item;
}
}
@ -243,6 +253,10 @@ bool Extender::hasItem(const QString &name) const
return true;
}
if (!d->applet) {
return false;
}
//if item(name) returns false, that doesn't mean that the item doesn't exist, just that it has
//not been instantiated yet. check to see if there's mention of this item existing in the
//plasma config's section DetachedExtenderItems
@ -254,9 +268,9 @@ bool Extender::hasItem(const QString &name) const
KConfigGroup extenderItemGroup(corona->config(), "DetachedExtenderItems");
foreach (const QString &extenderItemId, extenderItemGroup.groupList()) {
KConfigGroup cg = extenderItemGroup.group(extenderItemId);
if (uint(cg.readEntry("sourceAppletId", 0)) == d->applet->id() &&
if (uint(cg.readEntry("sourceAppletId", 0)) == d->applet.data()->id() &&
cg.readEntry("extenderItemName", "") == name &&
cg.readEntry("sourceAppletPluginName", "") == d->applet->pluginName()) {
cg.readEntry("sourceAppletPluginName", "") == d->applet.data()->pluginName()) {
return true;
}
}
@ -295,7 +309,7 @@ QList<ExtenderGroup*> Extender::groups() const
Applet *Extender::applet() const
{
return d->applet;
return d->applet.data();
}
void Extender::saveState()
@ -323,7 +337,12 @@ void Extender::resizeEvent(QGraphicsSceneResizeEvent *event)
void Extender::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Q_UNUSED(event)
PopupApplet *popupApplet = qobject_cast<PopupApplet*>(d->applet);
if (!d->applet) {
return;
}
PopupApplet *popupApplet = qobject_cast<PopupApplet*>(d->applet.data());
if (isEmpty() && popupApplet) {
popupApplet->hidePopup();
}
@ -340,7 +359,7 @@ void Extender::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
if (mimeData) {
itemHoverEnterEvent(mimeData->extenderItem());
PopupApplet *popupApplet = qobject_cast<PopupApplet*>(d->applet);
PopupApplet *popupApplet = qobject_cast<PopupApplet*>(d->applet.data());
if (popupApplet) {
popupApplet->showPopup();
}
@ -375,7 +394,7 @@ void Extender::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
//Hide popups when they're not the extender where we started, and we're leaving the
//extender. Use a small timeout here, to avoid accidental hides of extenders we're
//targetting.
PopupApplet *popupApplet = qobject_cast<PopupApplet*>(d->applet);
PopupApplet *popupApplet = qobject_cast<PopupApplet*>(d->applet.data());
if (popupApplet && sourceExtender != this) {
kDebug() << "leaving another extender then the extender we started, so hide the popup.";
popupApplet->showPopup(250);
@ -389,7 +408,7 @@ void Extender::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
//Hide empty internal extender containers when we drag the last item away. Avoids having
//an ugly empty applet on the desktop temporarily.
ExtenderApplet *extenderApplet = qobject_cast<ExtenderApplet*>(d->applet);
ExtenderApplet *extenderApplet = qobject_cast<ExtenderApplet*>(d->applet.data());
if (extenderApplet && sourceExtender == this && attachedItems().count() < 2 &&
extenderApplet->formFactor() != Plasma::Horizontal &&
extenderApplet->formFactor() != Plasma::Vertical) {
@ -573,7 +592,7 @@ void ExtenderPrivate::removeExtenderItem(ExtenderItem *item)
//collapse the popupapplet if the last item is removed.
if (!q->attachedItems().count()) {
PopupApplet *popupApplet = qobject_cast<PopupApplet*>(applet);
PopupApplet *popupApplet = qobject_cast<PopupApplet*>(applet.data());
if (popupApplet) {
popupApplet->hidePopup();
}
@ -606,7 +625,11 @@ int ExtenderPrivate::insertIndexFromPos(const QPointF &pos) const
void ExtenderPrivate::loadExtenderItems()
{
KConfigGroup cg = applet->config("ExtenderItems");
if (!applet) {
return;
}
KConfigGroup cg = applet.data()->config("ExtenderItems");
//first create a list of extenderItems, and then sort them on their position, so the items get
//recreated in the correct order.
@ -631,17 +654,17 @@ void ExtenderPrivate::loadExtenderItems()
bool temporarySourceApplet = false;
kDebug() << "applet id = " << applet->id();
kDebug() << "applet id = " << applet.data()->id();
kDebug() << "sourceappletid = " << sourceAppletId;
//find the source applet.
Applet *sourceApplet = 0;
if (applet->id() == sourceAppletId) {
if (applet.data()->id() == sourceAppletId) {
// it's ours!
sourceApplet = applet;
sourceApplet = applet.data();
} else {
// maybe it's foreign?
Containment *containment = applet->containment();
Containment *containment = applet.data()->containment();
if (containment) {
Corona *corona = containment->corona();

View File

@ -130,7 +130,7 @@ ExtenderItem::ExtenderItem(Extender *hostExtender, uint extenderItemId)
d->toolboxLayout = new QGraphicsLinearLayout(d->toolbox);
//create items's configgroup
KConfigGroup cg = hostExtender->d->applet->config("ExtenderItems");
KConfigGroup cg = hostExtender->d->applet.data()->config("ExtenderItems");
KConfigGroup dg = KConfigGroup(&cg, QString::number(d->extenderItemId));
//create own layout
@ -149,11 +149,11 @@ ExtenderItem::ExtenderItem(Extender *hostExtender, uint extenderItemId)
if (!sourceAppletId) {
//The item is new
dg.writeEntry("sourceAppletPluginName", hostExtender->d->applet->pluginName());
dg.writeEntry("sourceAppletId", hostExtender->d->applet->id());
dg.writeEntry("extenderIconName", hostExtender->d->applet->icon());
d->sourceApplet = hostExtender->d->applet;
d->collapseIcon->setIcon(KIcon(hostExtender->d->applet->icon()));
dg.writeEntry("sourceAppletPluginName", hostExtender->d->applet.data()->pluginName());
dg.writeEntry("sourceAppletId", hostExtender->d->applet.data()->id());
dg.writeEntry("extenderIconName", hostExtender->d->applet.data()->icon());
d->sourceApplet = hostExtender->d->applet.data();
d->collapseIcon->setIcon(KIcon(hostExtender->d->applet.data()->icon()));
} else {
//The item already exists.
d->name = dg.readEntry("extenderItemName", "");
@ -171,7 +171,7 @@ ExtenderItem::ExtenderItem(Extender *hostExtender, uint extenderItemId)
d->group = hostExtender->d->findGroup(groupName);
//Find the sourceapplet.
Corona *corona = hostExtender->d->applet->containment()->corona();
Corona *corona = hostExtender->d->applet.data()->containment()->corona();
foreach (Containment *containment, corona->containments()) {
foreach (Applet *applet, containment->applets()) {
if (applet->id() == sourceAppletId &&
@ -199,7 +199,7 @@ ExtenderItem::ExtenderItem(Extender *hostExtender, uint extenderItemId)
setAcceptsHoverEvents(true);
connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()), this, SLOT(themeChanged()));
d->setMovable(d->extender->d->applet->immutability() == Plasma::Mutable);
d->setMovable(d->extender->d->applet.data()->immutability() == Plasma::Mutable);
}
ExtenderItem::~ExtenderItem()
@ -213,7 +213,7 @@ KConfigGroup ExtenderItem::config() const
if (!d->extender->d->applet) {
return KConfigGroup();
}
KConfigGroup cg = d->extender->d->applet->config("ExtenderItems");
KConfigGroup cg = d->extender->d->applet.data()->config("ExtenderItems");
return KConfigGroup(&cg, QString::number(d->extenderItemId));
}
@ -314,7 +314,7 @@ void ExtenderItem::setExtender(Extender *extender, const QPointF &pos)
//move the configuration.
if (d->hostApplet() && (extender != d->extender)) {
KConfigGroup c = extender->d->applet->config("ExtenderItems");
KConfigGroup c = extender->d->applet.data()->config("ExtenderItems");
config().reparent(&c);
}
@ -576,7 +576,7 @@ void ExtenderItem::resizeEvent(QGraphicsSceneResizeEvent *event)
void ExtenderItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (!(d->dragHandleRect().contains(event->pos())) ||
d->extender->d->applet->immutability() != Plasma::Mutable) {
d->extender->d->applet.data()->immutability() != Plasma::Mutable) {
event->ignore();
return;
}
@ -590,6 +590,10 @@ void ExtenderItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
return;
}
if (!d->extender->d->applet) {
return;
}
//Start the drag:
d->dragStarted = true;
QPointF curPos = pos();
@ -629,7 +633,7 @@ void ExtenderItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
//Hide empty internal extender containers when we drag the last item away. Avoids having
//an ugly empty applet on the desktop temporarily.
ExtenderApplet *extenderApplet = qobject_cast<ExtenderApplet*>(d->extender->d->applet);
ExtenderApplet *extenderApplet = qobject_cast<ExtenderApplet*>(d->extender->d->applet.data());
if (extenderApplet && d->extender->attachedItems().count() < 2 &&
extenderApplet->formFactor() != Plasma::Horizontal &&
extenderApplet->formFactor() != Plasma::Vertical) {
@ -649,7 +653,7 @@ void ExtenderItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
}
//and execute the drag.
QWidget *dragParent = extender()->d->applet->view();
QWidget *dragParent = extender()->d->applet.data()->view();
QDrag *drag = new QDrag(dragParent);
drag->setPixmap(pixmap);
drag->setMimeData(mimeData);
@ -845,7 +849,7 @@ void ExtenderItemPrivate::updateToolBox()
Applet *ExtenderItemPrivate::hostApplet() const
{
if (extender) {
return extender->d->applet;
return extender->d->applet.data();
} else {
return 0;
}

View File

@ -75,7 +75,7 @@ class ExtenderPrivate
Extender *q;
Applet *applet;
QWeakPointer<Applet> applet;
QGraphicsLinearLayout *layout;
FrameSvg *background;