diff --git a/LenaPi/LenaPi.pro b/LenaPi/LenaPi.pro index ab0a5a5..a043211 100644 --- a/LenaPi/LenaPi.pro +++ b/LenaPi/LenaPi.pro @@ -6,7 +6,10 @@ CONFIG += c++11 SOURCES += main.cpp \ models/NavigationListModel.cpp \ models/NavigationItemModel.cpp \ - controllers/NavigationController.cpp + controllers/NavigationController.cpp \ + models/UiStateModel.cpp \ + controllers/MusicController.cpp \ + models/MusicModel.cpp RESOURCES += qml.qrc \ lenapi.qrc @@ -36,4 +39,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin HEADERS += \ models/NavigationListModel.h \ models/NavigationItemModel.h \ - controllers/NavigationController.h + controllers/NavigationController.h \ + models/UiStateModel.h \ + controllers/MusicController.h \ + models/MusicModel.h diff --git a/LenaPi/MusicPlayer.qml b/LenaPi/MusicPlayer.qml index 04c4a72..c6c5ddb 100644 --- a/LenaPi/MusicPlayer.qml +++ b/LenaPi/MusicPlayer.qml @@ -7,7 +7,7 @@ Item{ id: backgroundImage anchors.fill: parent - source: "file:///home/ar/source/testLenaPi/benjamin/image.jpg" + source: musicModel.pCurrentItem.pImageSource fillMode: Image.PreserveAspectCrop verticalAlignment: Image.AlignTop } @@ -16,6 +16,9 @@ Item{ anchors.left: parent.left anchors.top: parent.top anchors.margins: 20 + onClicked: { + musicModel.navigateBack(); + } } Rectangle { @@ -34,6 +37,7 @@ Item{ imageSource: "qrc:/icon_play" onClicked:{ + musicModel.playPause(); if(imageSource == "qrc:/icon_play") imageSource = "qrc:/icon_pause" else diff --git a/LenaPi/controllers/MusicController.cpp b/LenaPi/controllers/MusicController.cpp new file mode 100644 index 0000000..1a545b6 --- /dev/null +++ b/LenaPi/controllers/MusicController.cpp @@ -0,0 +1,26 @@ +#include "MusicController.h" + +#include + +MusicController::MusicController(QObject *parent) : QObject(parent), + mModel(new MusicModel(this)) +{ + connect(mModel, &MusicModel::navigateTo, this, &MusicController::navigateTo); +} + +void MusicController::initPlayer(NavigationItemModel *item) +{ + mModel->init(item); +} + +void MusicController::setContext(QQmlContext *context) +{ + mContext = context; + setContextProperties(); +} + +void MusicController::setContextProperties() +{ + if(!mContext) return; + mContext->setContextProperty("musicModel", mModel); +} diff --git a/LenaPi/controllers/MusicController.h b/LenaPi/controllers/MusicController.h new file mode 100644 index 0000000..7e456b0 --- /dev/null +++ b/LenaPi/controllers/MusicController.h @@ -0,0 +1,32 @@ +#ifndef MUSICCONTROLLER_H +#define MUSICCONTROLLER_H + +#include +#include +#include + +class MusicModel; + +class MusicController : public QObject +{ + Q_OBJECT + +signals: + void navigateTo(NavigationItemModel* item); + +public: + MusicController(QObject *parent = Q_NULLPTR); + + void initPlayer(NavigationItemModel* item); + + void setContext(QQmlContext* context); + +private: + void setContextProperties(); + + QQmlContext* mContext; + + MusicModel* mModel; +}; + +#endif // MUSICCONTROLLER_H diff --git a/LenaPi/controllers/NavigationController.cpp b/LenaPi/controllers/NavigationController.cpp index 0a4b875..66064f2 100644 --- a/LenaPi/controllers/NavigationController.cpp +++ b/LenaPi/controllers/NavigationController.cpp @@ -3,15 +3,21 @@ #include #include -#include "../models/NavigationItemModel.h" -#include "../models/NavigationListModel.h" +#include +#include +#include +#include -///@todo impelement reaction to item's clicked signal; implement back navigation NavigationController::NavigationController(QObject *parent) : QObject(parent), mRootItem(new NavigationItemModel(this)), - mNavList(new NavigationListModel(this)) + mNavList(new NavigationListModel(this)), + mUiState(new UiStateModel(this)), + mMusicController(new MusicController(this)) { - + connect(mMusicController, &MusicController::navigateTo, [this](NavigationItemModel* item) { + mUiState->showNavigation(); + mNavList->navigateTo(item); + }); } void NavigationController::init(const QString &rootPath) @@ -29,11 +35,14 @@ void NavigationController::setContext(QQmlContext *context) { mContext = context; setContextProperties(); + mMusicController->setContext(mContext); } void NavigationController::setContextProperties() { + if(!mContext) return; mContext->setContextProperty("navigationList", mNavList); + mContext->setContextProperty("uiStateModel", mUiState); } void NavigationController::add(const QString &path, NavigationItemModel *parentItem) @@ -63,5 +72,8 @@ void NavigationController::onNavigationRequest() if(item->hasChildren()) mNavList->setModelItems(item->getChildren()); - ///@todo else {mMusicController->initPlayer(item); mUiStateModel->showMusicPlayer();} + else { + mMusicController->initPlayer(item); + mUiState->showMusicPlayer(); + } } diff --git a/LenaPi/controllers/NavigationController.h b/LenaPi/controllers/NavigationController.h index 2576ba1..eb7ead0 100644 --- a/LenaPi/controllers/NavigationController.h +++ b/LenaPi/controllers/NavigationController.h @@ -6,6 +6,8 @@ class NavigationItemModel; class NavigationListModel; +class UiStateModel; +class MusicController; class NavigationController : public QObject { @@ -23,6 +25,10 @@ private: NavigationItemModel* mRootItem; NavigationListModel* mNavList; + + UiStateModel* mUiState; + MusicController* mMusicController; + QString mRootPath = "."; QQmlContext* mContext = Q_NULLPTR; diff --git a/LenaPi/main.qml b/LenaPi/main.qml index 938dae7..e541dd9 100644 --- a/LenaPi/main.qml +++ b/LenaPi/main.qml @@ -18,8 +18,7 @@ Window { Loader{ anchors.fill: parent - //source: "MusicPlayer.qml" - source: "Navigation.qml" + source: uiStateModel.pSource } } diff --git a/LenaPi/models/MusicModel.cpp b/LenaPi/models/MusicModel.cpp new file mode 100644 index 0000000..8dc6652 --- /dev/null +++ b/LenaPi/models/MusicModel.cpp @@ -0,0 +1,32 @@ +#include "MusicModel.h" + +MusicModel::MusicModel(QObject *parent) : QObject(parent) +{ + +} + +void MusicModel::init(NavigationItemModel *item) +{ + mCurrentItem = item; + emit currentItemChanged(); +} + +void MusicModel::navigateBack() +{ + emit navigateTo(mCurrentItem); +} + +void MusicModel::playPause() +{ + mIsPlaying = !mIsPlaying; +} + +NavigationItemModel *MusicModel::getCurrentItem() +{ + return mCurrentItem; +} + +bool MusicModel::isPlaying() +{ + return mIsPlaying; +} diff --git a/LenaPi/models/MusicModel.h b/LenaPi/models/MusicModel.h new file mode 100644 index 0000000..9017625 --- /dev/null +++ b/LenaPi/models/MusicModel.h @@ -0,0 +1,35 @@ +#ifndef MUSICMODEL_H +#define MUSICMODEL_H + +#include + +#include + +class MusicModel : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QObject* pCurrentItem READ getCurrentItem NOTIFY currentItemChanged) + +signals: + void navigateTo(NavigationItemModel *item); + void currentItemChanged(); + +public: + MusicModel(QObject *parent = Q_NULLPTR); + + void init(NavigationItemModel* item); + + Q_INVOKABLE void navigateBack(); + Q_INVOKABLE void playPause(); + + NavigationItemModel *getCurrentItem(); + + bool isPlaying(); + +private: + bool mIsPlaying = false; + NavigationItemModel* mCurrentItem = Q_NULLPTR; +}; + +#endif // MUSICMODEL_H diff --git a/LenaPi/models/NavigationItemModel.cpp b/LenaPi/models/NavigationItemModel.cpp index 298c546..e442515 100644 --- a/LenaPi/models/NavigationItemModel.cpp +++ b/LenaPi/models/NavigationItemModel.cpp @@ -7,6 +7,7 @@ NavigationItemModel::NavigationItemModel(QObject *parent) : QObject(parent), mImageSource("qrc:/default_image"), mParentItem(qobject_cast(parent)) { + qRegisterMetaType("NavigationItemModel*"); } QString NavigationItemModel::getImageSource() const diff --git a/LenaPi/models/UiStateModel.cpp b/LenaPi/models/UiStateModel.cpp new file mode 100644 index 0000000..ec44a07 --- /dev/null +++ b/LenaPi/models/UiStateModel.cpp @@ -0,0 +1,21 @@ +#include "UiStateModel.h" + +UiStateModel::UiStateModel(QObject *parent) : QObject(parent) +{ + showNavigation(); +} + +QUrl UiStateModel::getSource() const +{ + return mSource; +} + +void UiStateModel::showMusicPlayer(){ + mSource = QUrl("MusicPlayer.qml"); + emit sourceChanged(); +} + +void UiStateModel::showNavigation(){ + mSource = QUrl("Navigation.qml"); + emit sourceChanged(); +} diff --git a/LenaPi/models/UiStateModel.h b/LenaPi/models/UiStateModel.h new file mode 100644 index 0000000..22d631d --- /dev/null +++ b/LenaPi/models/UiStateModel.h @@ -0,0 +1,28 @@ +#ifndef UISTATEMODEL_H +#define UISTATEMODEL_H + +#include +#include + +class UiStateModel : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QUrl pSource READ getSource NOTIFY sourceChanged) + +signals: + void sourceChanged(); + +public: + UiStateModel(QObject *parent = Q_NULLPTR); + + QUrl getSource() const; + + void showMusicPlayer(); + void showNavigation(); + +private: + QUrl mSource; +}; + +#endif // UISTATEMODEL_H