diff --git a/LenaPi/MouseEventSpy.cpp b/LenaPi/MouseEventSpy.cpp index 332a6ba..caa5913 100644 --- a/LenaPi/MouseEventSpy.cpp +++ b/LenaPi/MouseEventSpy.cpp @@ -1,25 +1,29 @@ #include "MouseEventSpy.h" -#include #include #include +/** + * @brief Initialize timer. + * @param parent Parent object + */ MouseEventSpy::MouseEventSpy(QObject *parent) : QObject(parent) { - qDebug() << "created Instance"; + initTimer(10000); + mTimer.start(); } /** - * Implements the SINGLETON PATTERN + * @brief Implements the singleton pattern + * + * If no instance has been created yet, create new instance and install it as event filter + * in QGuiApplication. */ MouseEventSpy* MouseEventSpy::instance() { static MouseEventSpy* inst; if (inst == nullptr) { - // If no instance has been created yet, create a new and install it as event filter. - // Uppon first use of the instance, it will automatically - // install itself in the QGuiApplication inst = new MouseEventSpy(); QGuiApplication* app = qGuiApp; app->installEventFilter(inst); @@ -28,18 +32,57 @@ MouseEventSpy* MouseEventSpy::instance() } /** - * This is the method is necessary for 'installEventFilter' + * @brief Expand QObject::eventFilter to react to MouseEvents. + * + * Restart timer each time a mouse event is detected. */ bool MouseEventSpy::eventFilter(QObject* watched, QEvent* event) { QEvent::Type t = event->type(); - if ((t == QEvent::MouseButtonDblClick - || t == QEvent::MouseButtonPress - || t == QEvent::MouseButtonRelease - || t == QEvent::MouseMove) + if (isMouseEvent(t) && event->spontaneous() // Take only mouse events from outside of Qt ) + { emit mouseEventDetected(); - qDebug("MouseEvent detected."); - return QObject::eventFilter(watched, event); + } + + if(mTimer.isActive()){ + mTimer.stop(); + } + mTimer.start(); + + return QObject::eventFilter(watched, event); +} + +/** + * @brief Initialize and connect timer. + * @param interval Timeout interval in millisecond. + */ +void MouseEventSpy::initTimer(int interval) +{ + connect(&mTimer, &QTimer::timeout, this, &MouseEventSpy::onTimeout); + mTimer.setInterval(interval); + mTimer.setSingleShot(true); +} + +/** + * @brief Checks whether the event type is a mouse event. + * @param t Event type + * @return Returns whether the event type is a mouse event. + */ +bool MouseEventSpy::isMouseEvent(QEvent::Type t) +{ + return (t == QEvent::MouseButtonDblClick + || t == QEvent::MouseButtonPress + || t == QEvent::MouseButtonRelease + || t == QEvent::MouseMove); +} + +/** + * @brief Behavior on timeout: shut down RaspberryPi. + * @todo Call shutdown script. + */ +void MouseEventSpy::onTimeout() +{ + qDebug() << "shutting down."; } diff --git a/LenaPi/MouseEventSpy.h b/LenaPi/MouseEventSpy.h index 67012fc..34e9a3f 100644 --- a/LenaPi/MouseEventSpy.h +++ b/LenaPi/MouseEventSpy.h @@ -2,6 +2,8 @@ #define MOUSEEVENTSPY_H #include +#include +#include /** * Catches all mouse event and starts timer -- basically behaves like a screensaver. @@ -20,6 +22,14 @@ public: protected: bool eventFilter(QObject* watched, QEvent* event); +private: + void initTimer(int interval); + bool isMouseEvent(QEvent::Type t); + QTimer mTimer; + +private slots: + void onTimeout(); + signals: void mouseEventDetected(); };