From kde-commits Mon Nov 12 19:27:25 2007 From: Kevin Ottens Date: Mon, 12 Nov 2007 19:27:25 +0000 To: kde-commits Subject: KDE/kdebase/workspace/libs/plasma Message-Id: <1194895645.824689.13686.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=119489568906915 SVN commit 735845 by ervin: Add support for applet handles in plasma containments. Still a couple of issues to flesh out, but that's usable already. M +1 -0 CMakeLists.txt M +2 -3 applet.cpp A applethandle.cpp [License: LGPL] A applethandle_p.h [License: LGPL] M +42 -50 containment.cpp M +6 -2 containment.h M +0 -3 corona.cpp --- trunk/KDE/kdebase/workspace/libs/plasma/CMakeLists.txt #735844:735845 @@ -24,6 +24,7 @@ appletbrowser/kcategorizeditemsviewmodels.cpp appletbrowser/plasmaappletitemmodel.cpp appletbrowser/customdragtreeview.cpp + applethandle.cpp configxml.cpp containment.cpp corona.cpp --- trunk/KDE/kdebase/workspace/libs/plasma/applet.cpp #735844:735845 @@ -110,6 +110,7 @@ void init(Applet* applet) { + applet->setAcceptsHoverEvents(true); applet->setZValue(100); kioskImmutable = applet->globalConfig().isImmutable() || applet->config().isImmutable(); @@ -218,7 +219,7 @@ p.setRenderHint(QPainter::SmoothPixmapTransform); //FIXME: This is a hack to fix a drawing problems with svg files where a thin transparent border is drawn around the svg image. - // the transparent border around the svg seems to vary in size depending on the size of the svg and as a result increasing the + // the transparent border around the svg seems to vary in size depending on the size of the svg and as a result increasing the // svn image by 2 all around didn't resolve the issue. For now it resizes based on the border size. background->resize(contentWidth, contentHeight); @@ -574,8 +575,6 @@ void Applet::setImmutable(bool immutable) { d->immutable = immutable; - setFlag(QGraphicsItem::ItemIsMovable, d->immutable || d->kioskImmutable || - !scene() || !static_cast(scene())->isImmutable()); } bool Applet::drawStandardBackground() --- trunk/KDE/kdebase/workspace/libs/plasma/containment.cpp #735844:735845 @@ -36,6 +36,7 @@ #include #include +#include "applethandle_p.h" #include "corona.h" #include "phase.h" #include "svg.h" @@ -68,6 +69,7 @@ FormFactor formFactor; Location location; Applet::List applets; + QMap handles; int screen; bool immutable; }; @@ -102,7 +104,7 @@ //TODO: would be nice to not do this on init, as it causes Phase to init connect(Phase::self(), SIGNAL(animationComplete(QGraphicsItem*,Plasma::Phase::Animation)), - this, SLOT(appletDisappearComplete(QGraphicsItem*,Plasma::Phase::Animation))); + this, SLOT(appletAnimationComplete(QGraphicsItem*,Plasma::Phase::Animation))); } void Containment::initConstraints(KConfigGroup* group) @@ -182,45 +184,10 @@ foreach(QAction* action, actions) { desktopMenu.addAction(action); } - } else if (applet->isImmutable()) { + } else { kDebug() << "immutable applet"; QGraphicsItem::contextMenuEvent(event); return; - } else { - bool hasEntries = false; - if (applet->hasConfigurationInterface()) { - QAction* configureApplet = new QAction(i18n("%1 Settings...", applet->name()), &desktopMenu); - connect(configureApplet, SIGNAL(triggered(bool)), - applet, SLOT(showConfigurationInterface())); - desktopMenu.addAction(configureApplet); - hasEntries = true; - } - - if (scene() && !static_cast(scene())->isImmutable()) { - QAction* closeApplet = new QAction(i18n("Remove this %1", applet->name()), &desktopMenu); - QVariant appletV; - appletV.setValue((QObject*)applet); - closeApplet->setData(appletV); - connect(closeApplet, SIGNAL(triggered(bool)), - this, SLOT(destroyApplet())); - desktopMenu.addAction(closeApplet); - hasEntries = true; - } - - QList actions = applet->contextActions(); - if (!actions.isEmpty()) { - desktopMenu.addSeparator(); - foreach(QAction* action, actions) { - desktopMenu.addAction(action); - } - hasEntries = true; - } - - if (!hasEntries) { - QGraphicsItem::contextMenuEvent(event); - kDebug() << "no entries"; - return; - } } event->accept(); @@ -375,20 +342,8 @@ } } -void Containment::destroyApplet() +void Containment::appletAnimationComplete(QGraphicsItem *item, Plasma::Phase::Animation anim) { - QAction *action = qobject_cast(sender()); - - if (!action) { - return; - } - - Applet *applet = qobject_cast(action->data().value()); - Phase::self()->animateItem(applet, Phase::Disappear); -} - -void Containment::appletDisappearComplete(QGraphicsItem *item, Plasma::Phase::Animation anim) -{ if (anim == Phase::Disappear) { if (item->parentItem() == this) { Applet *applet = qgraphicsitem_cast(item); @@ -397,6 +352,10 @@ applet->destroy(); } } + } else if (anim == Phase::Appear) { + if (type()==DesktopContainment) { + item->installSceneEventFilter(this); + } } } @@ -550,6 +509,39 @@ Q_UNUSED(event) } +bool Containment::sceneEventFilter(QGraphicsItem *watched, QEvent *event) +{ + Applet *applet = qgraphicsitem_cast(watched); + //QEvent::GraphicsSceneHoverEnter + + // Otherwise we're watching something we shouldn't be... + Q_ASSERT(applet!=0); + Q_ASSERT(d->applets.contains(applet)); + + switch (event->type()) + { + case QEvent::GraphicsSceneHoverEnter: + if (!d->immutable && !applet->isImmutable() + && !d->handles.contains(applet)) { + AppletHandle *handle = new AppletHandle(this, applet); + d->handles[applet] = handle; + connect(handle, SIGNAL(disappearDone(AppletHandle*)), + this, SLOT(handleDisappeared(AppletHandle*))); + } + break; + default: + break; + } + + return false; } +void Containment::handleDisappeared(AppletHandle *handle) +{ + d->handles.remove(handle->applet()); + handle->deleteLater(); +} + +} + #include "containment.moc" --- trunk/KDE/kdebase/workspace/libs/plasma/containment.h #735844:735845 @@ -33,6 +33,7 @@ namespace Plasma { +class AppletHandle; class DataEngine; class Package; class Corona; @@ -226,16 +227,19 @@ void contextMenuEvent(QGraphicsSceneContextMenuEvent * event); void hoverEnterEvent(QGraphicsSceneHoverEvent *event); void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + bool sceneEventFilter(QGraphicsItem *watched, QEvent *event); protected Q_SLOTS: /** * @internal */ void appletDestroyed(QObject*); - void destroyApplet(); - void appletDisappearComplete(QGraphicsItem *item, Plasma::Phase::Animation anim); + void appletAnimationComplete(QGraphicsItem *item, Plasma::Phase::Animation anim); void dropEvent(QGraphicsSceneDragDropEvent* event); + private Q_SLOTS: + void handleDisappeared(AppletHandle *handle); + private: Q_DISABLE_COPY(Containment) --- trunk/KDE/kdebase/workspace/libs/plasma/corona.cpp #735844:735845 @@ -415,9 +415,6 @@ } d->immutable = immutable; - foreach (QGraphicsItem* item, items()) { - item->setFlag(QGraphicsItem::ItemIsMovable, immutable); - } } } // namespace Plasma