diff --git a/dialog.cpp b/dialog.cpp index 42e281629..e5454b5f5 100644 --- a/dialog.cpp +++ b/dialog.cpp @@ -172,7 +172,10 @@ Plasma::Applet *DialogPrivate::applet() Extender *extender = qobject_cast(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(); diff --git a/extenders/extender.cpp b/extenders/extender.cpp index 548b1a2bc..f19070341 100644 --- a/extenders/extender.cpp +++ b/extenders/extender.cpp @@ -137,7 +137,11 @@ QList 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(); + } + + Containment *containment = d->applet.data()->containment(); if (!containment) { return result; } @@ -146,7 +150,7 @@ QList 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 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(); + } + Containment *containment = d->applet.data()->containment(); if (!containment) { return result; } @@ -177,7 +184,7 @@ QList 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 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(d->applet); + + if (!d->applet) { + return; + } + + PopupApplet *popupApplet = qobject_cast(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(d->applet); + PopupApplet *popupApplet = qobject_cast(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(d->applet); + PopupApplet *popupApplet = qobject_cast(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(d->applet); + ExtenderApplet *extenderApplet = qobject_cast(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(applet); + PopupApplet *popupApplet = qobject_cast(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(); diff --git a/extenders/extenderitem.cpp b/extenders/extenderitem.cpp index a4ac7eb98..53fa97d02 100644 --- a/extenders/extenderitem.cpp +++ b/extenders/extenderitem.cpp @@ -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(d->extender->d->applet); + ExtenderApplet *extenderApplet = qobject_cast(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; } diff --git a/private/extender_p.h b/private/extender_p.h index 38204d3d9..5cbc033e1 100644 --- a/private/extender_p.h +++ b/private/extender_p.h @@ -75,7 +75,7 @@ class ExtenderPrivate Extender *q; - Applet *applet; + QWeakPointer applet; QGraphicsLinearLayout *layout; FrameSvg *background;