From kde-commits Thu Feb 21 10:26:40 2008 From: Marco Martin Date: Thu, 21 Feb 2008 10:26:40 +0000 To: kde-commits Subject: KDE/kdebase/workspace Message-Id: <1203589600.841444.32076.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=120358961024514 SVN commit 777705 by mart: transplant of sceneEventFilter and mouseMoveEvent from the icon applet to the applet class, this will cause a lot less duplication. if you want to make a widget draggable around just call the new function void watchForMouseMove(QGraphicsItem * watched, bool watch) also, some style fixes. M +73 -8 libs/plasma/applet.cpp M +24 -2 libs/plasma/applet.h M +1 -45 plasma/applets/icon/icon.cpp M +0 -2 plasma/applets/icon/icon.h --- trunk/KDE/kdebase/workspace/libs/plasma/applet.cpp #777704:777705 @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -284,6 +285,7 @@ KPluginInfo appletDescription; Package* package; QList watchedForFocus; + QList watchedForMouseMove; QStringList loadedEngines; Plasma::SvgPanel *background; Plasma::LineEdit *failureText; @@ -1104,22 +1106,40 @@ void Applet::watchForFocus(QObject *widget, bool watch) { - if ( !widget ) { + if (!widget) { return; } int index = d->watchedForFocus.indexOf(widget); - if ( watch ) { - if ( index == -1 ) { - d->watchedForFocus.append( widget ); - widget->installEventFilter( this ); + if (watch) { + if (index == -1) { + d->watchedForFocus.append(widget); + widget->installEventFilter(this); } - } else if ( index != -1 ) { - d->watchedForFocus.removeAt( index ); - widget->removeEventFilter( this ); + } else if (index != -1) { + d->watchedForFocus.removeAt(index); + widget->removeEventFilter(this); } } +void Applet::watchForMouseMove( QGraphicsItem * watched, bool watch ) +{ + if (!watched) { + return; + } + + int index = d->watchedForMouseMove.indexOf(watched); + if (watch) { + if (index == -1) { + d->watchedForMouseMove.append(watched); + watched->installSceneEventFilter(this); + } + } else if (index != -1) { + d->watchedForMouseMove.removeAt(index); + watched->removeSceneEventFilter(this); + } +} + void Applet::needsFocus(bool focus) { if (focus == QGraphicsItem::hasFocus()) { @@ -1154,6 +1174,51 @@ return QObject::eventFilter(o, e); } +bool Applet::sceneEventFilter( QGraphicsItem * watched, QEvent * event ) +{ + switch (event->type()) { + case QEvent::GraphicsSceneMouseMove: { + if (d->watchedForMouseMove.contains( watched )) { + mouseMoveEvent(static_cast(event)); + return true; + } + break; + } + + default: + break; + } + + return QGraphicsItem::sceneEventFilter(watched, event); +} + +void Applet::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if (!isImmutable() && formFactor() == Plasma::Planar) { + QGraphicsItem *parent = parentItem(); + Plasma::Applet *applet = qgraphicsitem_cast(parent); + + if (applet && applet->isContainment()) { + // our direct parent is a containment. just move ourselves. + QPointF curPos = event->pos(); + QPointF lastPos = event->lastPos(); + QPointF delta = curPos-lastPos; + + moveBy(delta.x(),delta.y()); + } else if (parent) { + //don't move the icon as well because our parent (usually an appletHandle) will do it for us + //parent->moveBy(delta.x(),delta.y()); + QPointF curPos = parent->transform().map(event->pos()); + QPointF lastPos = parent->transform().map(event->lastPos()); + QPointF delta = curPos-lastPos; + + parent->setPos(parent->pos() + delta); + } + + } +} + + void Applet::showConfigurationInterface() { if (d->package && d->configXml) { --- trunk/KDE/kdebase/workspace/libs/plasma/applet.h #777704:777705 @@ -722,14 +722,26 @@ /** * Register widgets that can receive keyboard focus. * - * Calling this results in an eventFilter being places on the widget. + * Calling this results in an eventFilter being placed on the widget. * * @param widget the widget to watch for keyboard focus * @param watch whether to start watching the widget, or to stop doing so */ - void watchForFocus( QObject *widget, bool watch = true ); + void watchForFocus(QObject *widget, bool watch = true); /** + * Register the widgets that manages mouse clicks but you still want + * to be able to drag the applet around when holding the mouse pointer + * on that widgets. + * + * Calling this results in an eventFilter being places on the widget. + * + * @param widget the widget to watch for mouse move + * @param watch whether to start watching the widget, or to stop doing so + */ + void watchForMouseMove(QGraphicsItem * watched, bool watch); + + /** * Call this whenever focus is needed or not needed. * * You do not have to call this method for widgets that have @@ -746,6 +758,16 @@ bool eventFilter( QObject *o, QEvent *e ); /** + * @internal scene event filter; used to manage applet dragging + */ + bool sceneEventFilter ( QGraphicsItem * watched, QEvent * event ); + + /** + * @internal manage the mouse movement to drag the applet around + */ + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + + /** * Reimpmlemented from LayoutItem */ QPointF topLeft() const; --- trunk/KDE/kdebase/workspace/plasma/applets/icon/icon.cpp #777704:777705 @@ -64,7 +64,7 @@ setUrl(cg.readEntry("Url", m_url)); setDisplayLines(2); - m_icon->installSceneEventFilter(this); + watchForMouseMove(m_icon, true); m_icon->resize(contentSize()); // we do this right away since we may have our config @@ -299,50 +299,6 @@ return m_icon->shape(); } -bool IconApplet::sceneEventFilter( QGraphicsItem * watched, QEvent * event ) -{ - switch (event->type()) { - case QEvent::GraphicsSceneMouseMove: { - mouseMoveEvent(static_cast(event)); - break; - } - - default: - break; - } - - return QGraphicsItem::sceneEventFilter(watched, event); -} - -void IconApplet::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - if (!isImmutable() && formFactor() == Plasma::Planar) { - QGraphicsItem *parent = parentItem(); - Plasma::Applet *applet = qgraphicsitem_cast(parent); - - if (applet && applet->isContainment()) { - // our direct parent is a containment. just move ourselves. - QPointF curPos = event->pos(); - QPointF lastPos = event->lastPos(); - QPointF delta = curPos-lastPos; - - moveBy(delta.x(),delta.y()); - } else if (parent) { - //don't move the icon as well because our parent (usually an appletHandle) will do it for us - //parent->moveBy(delta.x(),delta.y()); - QPointF curPos = parent->transform().map(event->pos()); - QPointF lastPos = parent->transform().map(event->lastPos()); - QPointF delta = curPos-lastPos; - - parent->setPos(parent->pos() + delta); - } - - // We don't want any events on mouse release - m_icon->setUnpressed(); - } -} - - //dropUrls from DolphinDropController void IconApplet::dropUrls(const KUrl::List& urls, const KUrl& destination, --- trunk/KDE/kdebase/workspace/plasma/applets/icon/icon.h #777704:777705 @@ -59,8 +59,6 @@ protected: void dropEvent(QGraphicsSceneDragDropEvent *event); void saveState(KConfigGroup *cg) const; - bool sceneEventFilter ( QGraphicsItem * watched, QEvent * event ); - void mouseMoveEvent(QGraphicsSceneMouseEvent *event); protected slots: void acceptedPropertiesDialog();