[vlc-commits] Qt: add events extender
Francois Cartegnie
git at videolan.org
Fri Apr 5 00:29:54 CEST 2013
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Apr 4 23:20:42 2013 +0200| [c38081e5680bb6c35c65ea8de3dfbd7c4e484586] | committer: Francois Cartegnie
Qt: add events extender
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c38081e5680bb6c35c65ea8de3dfbd7c4e484586
---
modules/gui/qt4/Modules.am | 3 +
modules/gui/qt4/util/events_extender.cpp | 144 ++++++++++++++++++++++++++++++
modules/gui/qt4/util/events_extender.hpp | 94 +++++++++++++++++++
3 files changed, 241 insertions(+)
diff --git a/modules/gui/qt4/Modules.am b/modules/gui/qt4/Modules.am
index 30f1f59..3916b28 100644
--- a/modules/gui/qt4/Modules.am
+++ b/modules/gui/qt4/Modules.am
@@ -70,6 +70,7 @@ nodist_SOURCES_qt4 = \
util/input_slider.moc.cpp \
util/timetooltip.moc.cpp \
util/customwidgets.moc.cpp \
+ util/events_extender.moc.cpp \
util/searchlineedit.moc.cpp \
util/qmenuview.moc.cpp \
util/qvlcapp.moc.cpp \
@@ -333,6 +334,7 @@ SOURCES_qt4 = qt4.cpp \
util/input_slider.cpp \
util/timetooltip.cpp \
util/customwidgets.cpp \
+ util/events_extender.cpp \
util/searchlineedit.cpp \
util/registry.cpp \
util/qmenuview.cpp \
@@ -411,6 +413,7 @@ noinst_HEADERS = \
util/input_slider.hpp \
util/timetooltip.hpp \
util/customwidgets.hpp \
+ util/events_extender.hpp \
util/searchlineedit.hpp \
util/qvlcframe.hpp \
util/qvlcapp.hpp \
diff --git a/modules/gui/qt4/util/events_extender.cpp b/modules/gui/qt4/util/events_extender.cpp
new file mode 100644
index 0000000..b184941
--- /dev/null
+++ b/modules/gui/qt4/util/events_extender.cpp
@@ -0,0 +1,144 @@
+/*****************************************************************************
+ * events_extender.cpp: Events Extenders / Modifiers
+ ****************************************************************************
+ * Copyright (C) 2013 the VideoLAN team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "events_extender.hpp"
+
+#include <QTimer>
+#include <QApplication>
+#include <QMouseEvent>
+
+const QEvent::Type MouseEventExtenderFilter::MouseButtonLongPress =
+ (QEvent::Type)QEvent::registerEventType();
+const QEvent::Type MouseEventExtenderFilter::MouseButtonShortClick =
+ (QEvent::Type)QEvent::registerEventType();
+const QEvent::Type MouseEventExtenderFilter::MouseButtonLongClick =
+ (QEvent::Type)QEvent::registerEventType();
+
+MouseEventExtenderFilter::ButtonState::ButtonState( QObject *parent, Qt::MouseButton b )
+{
+ state = RELEASED;
+ button = b;
+ timer = new QTimer( parent );
+ timer->setInterval( 2 * QApplication::doubleClickInterval() );
+ timer->setSingleShot( true );
+ timer->installEventFilter( parent );
+}
+
+MouseEventExtenderFilter::ButtonState::~ButtonState()
+{
+ delete timer;
+}
+
+//! MouseEventExtenderFilter constructor
+/*!
+\param The QObject we're extending events.
+*/
+MouseEventExtenderFilter::MouseEventExtenderFilter( QObject *parent ) : QObject( parent )
+{}
+
+MouseEventExtenderFilter::~MouseEventExtenderFilter()
+{
+ qDeleteAll( buttonsStates.begin(), buttonsStates.end() );
+}
+
+MouseEventExtenderFilter::ButtonState * MouseEventExtenderFilter::getState( Qt::MouseButton button )
+{
+ foreach( ButtonState *bs, buttonsStates )
+ if ( bs->button == button )
+ return bs;
+
+ ButtonState *bs = new ButtonState( this, button );
+ buttonsStates << bs;
+ return bs;
+}
+
+MouseEventExtenderFilter::ButtonState * MouseEventExtenderFilter::getStateByTimer( int id )
+{
+ foreach( ButtonState *bs, buttonsStates )
+ if ( bs->timer->timerId() == id )
+ return bs;
+ return NULL;
+}
+
+void MouseEventExtenderFilter::postEvent( QObject *obj, QEvent::Type type, ButtonState *bs ) const
+{
+ QApplication::postEvent( obj,
+ new QMouseEvent( type, bs->localPos, bs->button, bs->buttons, bs->modifiers ) );
+}
+
+bool MouseEventExtenderFilter::eventFilter( QObject *obj, QEvent *e )
+{
+ ButtonState *bs;
+ QMouseEvent *mouseevent;
+ QTimerEvent *timerevent;
+
+ switch ( e->type() )
+ {
+ case QEvent::Timer:
+ timerevent = static_cast<QTimerEvent *>(e);
+ bs = getStateByTimer( timerevent->timerId() );
+ if ( bs )
+ {
+ killTimer( timerevent->timerId() );
+ bs->state = ButtonState::LONGPRESSED;
+ postEvent( obj, MouseButtonLongPress, bs );
+ }
+ break;
+
+ case QEvent::MouseButtonPress:
+ mouseevent = static_cast<QMouseEvent *>(e);
+ bs = getState( mouseevent->button() );
+ bs->state = ButtonState::PRESSED;
+ bs->localPos = mouseevent->pos();
+ bs->buttons = mouseevent->buttons();
+ bs->modifiers = mouseevent->modifiers();
+ bs->timer->start();
+ break;
+
+ case QEvent::MouseButtonRelease:
+ mouseevent = static_cast<QMouseEvent *>(e);
+ bs = getState( mouseevent->button() );
+ if ( bs->state == ButtonState::LONGPRESSED )
+ postEvent( obj, MouseButtonLongClick, bs );
+ else if ( bs->state == ButtonState::PRESSED )
+ postEvent( obj, MouseButtonShortClick, bs );
+ bs->state = ButtonState::RELEASED;
+ bs->timer->stop();
+ break;
+
+ case QEvent::Leave:
+ case QEvent::MouseButtonDblClick:
+ mouseevent = static_cast<QMouseEvent *>(e);
+ bs = getState( mouseevent->button() );
+ bs->state = ButtonState::RELEASED;
+ bs->timer->stop();
+ // ff
+
+ default:
+ break;
+ }
+
+ /* Pass requests to original handler */
+ return parent()->eventFilter( obj, e );
+}
diff --git a/modules/gui/qt4/util/events_extender.hpp b/modules/gui/qt4/util/events_extender.hpp
new file mode 100644
index 0000000..3bae638
--- /dev/null
+++ b/modules/gui/qt4/util/events_extender.hpp
@@ -0,0 +1,94 @@
+/*****************************************************************************
+ * events_extender.hpp: Events Extenders / Modifiers
+ ****************************************************************************
+ * Copyright (C) 2013 the VideoLAN team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef EVENTS_EXTENDER_HPP
+#define EVENTS_EXTENDER_HPP
+
+#include <QObject>
+#include <QEvent>
+#include <QList>
+#include <QPoint>
+
+class QMouseEvent;
+class QTimer;
+
+//! MouseEventExtenderFilter
+/*!
+Adds special QObject mouse events per button: LongPress, ShortClick
+and LongClick.
+Use by registering the extender as Object's event Filter. Will pass
+back every original event to Object's filter.
+*/
+
+/* Note: The Extender being a QObject too, you can chain multiple extenders */
+
+class MouseEventExtenderFilter : public QObject
+{
+ Q_OBJECT
+
+public:
+ //! MouseButtonLongPress Event.
+ /*!
+ Fired when the mouse has been pressed for longer than a single
+ click time.
+ */
+ static const QEvent::Type MouseButtonLongPress;
+ //! MouseButtonShortClick Event.
+ /*!
+ Single mouse click event. Sent by extender to differenciate
+ from the Object's unmodified clicked() signal.
+ */
+ static const QEvent::Type MouseButtonShortClick;
+ //! MouseButtonLongClick Event.
+ /*!
+ Single mouse long click event. Preceded by a LongPress Event.
+ */
+ static const QEvent::Type MouseButtonLongClick;
+ MouseEventExtenderFilter( QObject *parent );
+ ~MouseEventExtenderFilter();
+
+protected:
+ bool eventFilter( QObject *, QEvent * );
+
+private:
+ class ButtonState
+ {
+ public:
+ ButtonState( QObject *, Qt::MouseButton );
+ ~ButtonState();
+ enum
+ {
+ RELEASED,
+ PRESSED,
+ LONGPRESSED
+ } state;
+ QPoint localPos;
+ Qt::MouseButton button;
+ Qt::MouseButtons buttons;
+ Qt::KeyboardModifiers modifiers;
+ QTimer *timer;
+ };
+ ButtonState * getState( Qt::MouseButton );
+ ButtonState * getStateByTimer( int );
+ void postEvent( QObject *, QEvent::Type, ButtonState * ) const;
+ QList<ButtonState *> buttonsStates;
+};
+
+#endif // EVENTS_EXTENDER_HPP
More information about the vlc-commits
mailing list