diff --git a/LenaPi/EnergySaver.cpp b/LenaPi/EnergySaver.cpp index bedfaf7..d5a508b 100644 --- a/LenaPi/EnergySaver.cpp +++ b/LenaPi/EnergySaver.cpp @@ -4,16 +4,6 @@ #include #include -EnergySaver::EnergySaver(QObject *parent) : QObject(parent) -{ - -} - -/** - * @brief Create instance if necessary and set timeout interval. - * @param interval Timer interval in seconds - * @see EnergySaver::instance - */ void EnergySaver::init(int interval) { EnergySaver* saver = instance(); @@ -22,12 +12,7 @@ void EnergySaver::init(int interval) } -/** - * @brief Implements the singleton pattern. - * @return Instance - * - * If no instance has been created yet, create new instance. - */ + EnergySaver *EnergySaver::instance() { static EnergySaver* inst; @@ -46,10 +31,7 @@ void EnergySaver::restartTimer() mTimer.start(); } -/** - * @brief Initialize and connect timer. - * @param interval Timeout interval in millisecond. - */ + void EnergySaver::initTimer(int interval) { connect(&mTimer, &QTimer::timeout, this, &EnergySaver::onTimeout); @@ -57,9 +39,7 @@ void EnergySaver::initTimer(int interval) mTimer.setSingleShot(true); } -/** - * @brief Behavior on timeout: shut down RaspberryPi. - */ + void EnergySaver::onTimeout() { std::cout << "Shutting down."; diff --git a/LenaPi/EnergySaver.h b/LenaPi/EnergySaver.h index 1e2aa0d..9d05521 100644 --- a/LenaPi/EnergySaver.h +++ b/LenaPi/EnergySaver.h @@ -7,29 +7,54 @@ /** * @brief Class handling energy saving options. * - * Shut down RaspberryPi if no mouse input is detected and music player + * Shut down device if no mouse input is detected and music player * has not been active or a certain time interval. + * + * @todo For now this does only work for Lena's RasPi, where the + * shutdown script is positioned in a ceratin hardcoded path. + * Enable/disable energy saving option, timeout and path of + * shutdown script via config */ class EnergySaver : public QObject { Q_OBJECT protected: - EnergySaver(QObject *parent = 0); + explicit EnergySaver(QObject *parent = nullptr) : QObject(parent) {}; public: - + /** + * @brief Create instance if necessary and set timeout interval. + * @param interval Timer interval in seconds + * @see EnergySaver::instance + */ static void init(int interval); + /** + * @brief Implements the singleton pattern. + * @return Instance + * + * If no instance has been created yet, create new instance. + */ static EnergySaver *instance(); public slots: + /** + * @brief Restart shutdown timer, e.g. because of music player activiti + */ void restartTimer(); private: + /** + * @brief Initialize and connect timer. + * @param interval Timeout interval in millisecond. + */ void initTimer(int interval); QTimer mTimer; private slots: + /** + * @brief Behavior on timeout: shut down RaspberryPi. + */ void onTimeout(); }; diff --git a/LenaPi/LenaPi.pro.user b/LenaPi/LenaPi.pro.user index f9708ee..a4007fe 100644 --- a/LenaPi/LenaPi.pro.user +++ b/LenaPi/LenaPi.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/LenaPi/MouseEventSpy.cpp b/LenaPi/MouseEventSpy.cpp index f6ca02a..26eb916 100644 --- a/LenaPi/MouseEventSpy.cpp +++ b/LenaPi/MouseEventSpy.cpp @@ -3,30 +3,12 @@ #include #include -MouseEventSpy::MouseEventSpy(QObject *parent) : QObject(parent) -{ -} - -/** - * @brief Create instance if necessary. - * - * If no instance has been created yet, create new instance and install it as event filter - * in QGuiApplication. - * - * @see MouseEventSpy::instance() - */ void MouseEventSpy::init() { instance(); } -/** - * @brief Implements the singleton pattern. - * @return Instance - * - * If no instance has been created yet, create new instance and install it as event filter - * in QGuiApplication. - */ + MouseEventSpy* MouseEventSpy::instance() { static MouseEventSpy* inst; @@ -39,28 +21,20 @@ MouseEventSpy* MouseEventSpy::instance() return inst; } -/** - * @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 (isMouseEvent(t) - && event->spontaneous() // Take only mouse events from outside of Qt - ) + && event->spontaneous() // Take only mouse events from outside of Qt + ) { emit mouseEventDetected(); } return QObject::eventFilter(watched, event); } -/** - * @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 diff --git a/LenaPi/MouseEventSpy.h b/LenaPi/MouseEventSpy.h index c5ca319..de02846 100644 --- a/LenaPi/MouseEventSpy.h +++ b/LenaPi/MouseEventSpy.h @@ -15,19 +15,44 @@ class MouseEventSpy : public QObject Q_OBJECT protected: - explicit MouseEventSpy(QObject *parent = 0); + explicit MouseEventSpy(QObject *parent = nullptr) : QObject(parent) { /* nothing */ } signals: void mouseEventDetected(); public: + /** + * @brief Create instance if necessary. + * + * If no instance has been created yet, create new instance and install it as event filter + * in QGuiApplication. + * + * @see MouseEventSpy::instance() + */ static void init(); + /** + * @brief Implements the singleton pattern. + * @return Instance of MouseEventSpy + * + * If no instance has been created yet, create new instance and install it as event filter + * in QGuiApplication. + */ static MouseEventSpy* instance(); protected: + /** + * @brief Expand QObject::eventFilter to react to MouseEvents. + * + * Restart timer each time a mouse event is detected. + */ bool eventFilter(QObject* watched, QEvent* event); private: + /** + * @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 isMouseEvent(QEvent::Type t); }; diff --git a/LenaPi/models/NavigationItemModel.cpp b/LenaPi/models/NavigationItemModel.cpp index a62e238..d540425 100644 --- a/LenaPi/models/NavigationItemModel.cpp +++ b/LenaPi/models/NavigationItemModel.cpp @@ -69,7 +69,7 @@ QList NavigationItemModel::getChildren() QList NavigationItemModel::getSiblings() { if(isRoot()){ - return QList(); + return QList(); } else{ return mParentItem->getChildren(); } diff --git a/LenaPi/models/NavigationItemModel.h b/LenaPi/models/NavigationItemModel.h index 99df83b..afb17b2 100644 --- a/LenaPi/models/NavigationItemModel.h +++ b/LenaPi/models/NavigationItemModel.h @@ -3,6 +3,16 @@ #include +/** + * @brief Model for navigation item. + * + * Each item represents a directory that is specified by path. + * It contains a reference to its parent item as well as to its children. + * Each directory contains an image named image.jpg that is displayed on + * on the list delegate. + * A delegate is circular if it has children and rectangular if it is + * a leaf, i.e., if it represents a music folder. + */ class NavigationItemModel : public QObject { Q_OBJECT @@ -16,34 +26,89 @@ signals: void clicked(); public: - NavigationItemModel(QObject *parent = Q_NULLPTR); + explicit NavigationItemModel(QObject *parent = nullptr); + /** + * @brief Get source of image displayed on delegate. + * @return Source of image + * + * The image must be named image.jpg and must be postioned in the directory + * represented by this item. If no such image is found, a default image is displayed + * on the delegate. + */ QString getImageSource() const; + /** + * @brief Get path to folder represented by this navigation item. + * @return Path to folder + */ QString getPath() const; + /** + * @brief Set folder path and set image source displayed on delegate. + * @param path Path to directory that is represented by this navigation item. + * @return returns false if directory specified by path does not exist + */ bool setPath(const QString & path); + /** + * @brief Indicates whether this item is displayed as a circular or default delegate in navigation list. + * @return true if the current item is displayed as a circular delegate. + * + * An item is displayed as a circular delegate if it has children. + */ bool isCircleDelegate() const; - void setCircleDelegate(bool value); + /** + * @brief Indicates whether the current item is the root item of the navigation. + * @return true if the current item is the root item. + */ bool isRoot() const; + /** + * @brief Get pointer to parent item. + * @return Pointer to parent item. + */ NavigationItemModel* getParentItem(); + /** + * @brief Indicates whether the current item has children. + * @return false if children list is empty, true otherwise. + */ bool hasChildren() const; + /** + * @brief Get all child items + * @return List of child items + */ QList getChildren(); + /** + * @brief Get all siblings, i.e., all children of parent item. + * @return List of all siblings + */ QList getSiblings(); + /** + * @brief Append a child + * @param item Child item. + */ void appendChild(NavigationItemModel* item); + /** + * @brief Remove all child items. + * + * Will delete children via deleteLater + */ void clearChildren(); - Q_INVOKABLE void onClicked(); +public slots: + /** + * @brief Defines behavior on clicking the current navigation item. Emits the clicked-signal. + */ + void onClicked(); private: QString mPath = QString(""); QString mImageSource; - QList mChildren = QList(); + QList mChildren; NavigationItemModel* mParentItem; }; diff --git a/LenaPi/models/NavigationListModel.cpp b/LenaPi/models/NavigationListModel.cpp index e14ac07..4703adc 100644 --- a/LenaPi/models/NavigationListModel.cpp +++ b/LenaPi/models/NavigationListModel.cpp @@ -1,18 +1,13 @@ #include "NavigationListModel.h" - #include "NavigationItemModel.h" -NavigationListModel::NavigationListModel(QObject* parent) : QObject(parent) -{ - /*nothing*/ -} -QList NavigationListModel::getModelItems() + QList NavigationListModel::getModelItems() { return mItems; } -void NavigationListModel::setModelItems(QList list) +void NavigationListModel::setModelItems(const QList& list) { mItems.clear(); for(const auto& item : list){ diff --git a/LenaPi/models/NavigationListModel.h b/LenaPi/models/NavigationListModel.h index 3b6eaa1..6819f73 100644 --- a/LenaPi/models/NavigationListModel.h +++ b/LenaPi/models/NavigationListModel.h @@ -5,20 +5,24 @@ class NavigationItemModel; +/** + * @brief Model containing navigation items and handling navigation. + * @todo Check whether we can use QAbstractListModel here! + */ class NavigationListModel : public QObject { Q_OBJECT - Q_PROPERTY(QList pModelItems READ getModelItems NOTIFY modelItemsChanged) + Q_PROPERTY( QList pModelItems READ getModelItems NOTIFY modelItemsChanged) Q_PROPERTY(bool pIsBackVisible READ isBackVisible NOTIFY modelItemsChanged) signals: void modelItemsChanged(); public: - NavigationListModel(QObject* parent = Q_NULLPTR); + explicit NavigationListModel(QObject* parent = nullptr) : QObject(parent) { /* nothing */ } QList getModelItems(); - void setModelItems(QList list); + void setModelItems(const QList& list); bool isBackVisible(); diff --git a/LenaPi/models/UiStateModel.h b/LenaPi/models/UiStateModel.h index 22d631d..0617e32 100644 --- a/LenaPi/models/UiStateModel.h +++ b/LenaPi/models/UiStateModel.h @@ -4,6 +4,12 @@ #include #include +/** + * @brief Handles state of UI by providing the qml source. + * + * Provides the possibility to switch between different + * ui states such as music player or navigation. + */ class UiStateModel : public QObject { Q_OBJECT @@ -14,7 +20,7 @@ signals: void sourceChanged(); public: - UiStateModel(QObject *parent = Q_NULLPTR); + explicit UiStateModel(QObject *parent = nullptr); QUrl getSource() const;