use an eventfilter instead to have to manually forward each event,

should be less error prone and require less api

svn path=/trunk/KDE/kdelibs/; revision=1035740
This commit is contained in:
Marco Martin 2009-10-15 19:11:34 +00:00
parent 731474d470
commit c4b42df8e8
2 changed files with 61 additions and 3 deletions

View File

@ -21,6 +21,7 @@
/////////////////////////////////////////////////////////////////////////
#include <QtCore/qglobal.h>
#include <QtCore/qmetatype.h>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsSceneWheelEvent>
#include <QTime>
@ -60,7 +61,9 @@ public:
overshoot(20),
bounceFlag(0),
hasOvershoot(true),
friction(0.8)
parent(0),
friction(0.8),
forwardingEvent(false)
{
maximum = 100 + overshoot;
minimum = -overshoot;
@ -112,11 +115,12 @@ public:
QPointF cposition;
char bounceFlag;
bool hasOvershoot;
QObject *parent;
QGraphicsWidget *parent;
QRectF viewportGeometry;
QSizeF contentsSize;
int maximum, minimum;
qreal friction;
bool forwardingEvent;
QTime t;
};
@ -335,9 +339,57 @@ void KineticScrolling::doneOvershoot(void)
void KineticScrolling::setWidget(QGraphicsWidget *parent)
{
if (d->parent) {
d->parent->removeEventFilter(this);
}
d->parent = parent;
if (parent) {
d->parent->installEventFilter(this);
}
/* TODO: add a new property in plasma::ScrollWidget 'hasOvershoot' */
}
bool KineticScrolling::eventFilter(QObject *watched, QEvent *event)
{
if (d->forwardingEvent) {
return false;
}
bool notBlocked = true;
if (d->parent && d->parent->scene()) {
d->forwardingEvent = true;
notBlocked = d->parent->scene()->sendEvent(d->parent, event);
d->forwardingEvent = false;
}
if (!notBlocked || ((event->type() != QEvent::GraphicsSceneMousePress && event->isAccepted()) && (event->type() != QEvent::GraphicsSceneWheel && event->isAccepted()))) {
return true;
}
QGraphicsSceneMouseEvent *me = static_cast<QGraphicsSceneMouseEvent *>(event);
QGraphicsSceneWheelEvent *we = static_cast<QGraphicsSceneWheelEvent *>(event);
switch (event->type()) {
case QEvent::GraphicsSceneMousePress:
mousePressEvent(me);
break;
case QEvent::GraphicsSceneMouseRelease:
mouseReleaseEvent(me);
break;
case QEvent::GraphicsSceneMouseMove:
mouseMoveEvent(me);
break;
case QEvent::GraphicsSceneWheel:
wheelReleaseEvent(we);
break;
default:
break;
}
return true;
}
} // namespace Plasma

View File

@ -40,11 +40,14 @@ class KineticScrolling: public QObject
public:
KineticScrolling();
~KineticScrolling();
void setWidget(QGraphicsWidget *parent);
protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void wheelReleaseEvent(QGraphicsSceneWheelEvent *event);
void setWidget(QGraphicsWidget *parent);
private:
KineticScrollingPrivate *d;
void timerEvent(QTimerEvent *event);
@ -54,6 +57,9 @@ private:
void startAnimationTimer(int interval);
void doneOvershoot(void);
protected:
bool eventFilter(QObject *watched, QEvent *event);
public Q_SLOTS:
void setKineticScrollValue(QPointF value);