#include "NavigationController.h" #include #include #include #include #include #include NavigationController::NavigationController(QObject *parent) : QObject(parent), mRootItem(new NavigationItemModel(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) { auto rootDir = QDir(rootPath); if(!rootDir.exists()) return; mRootPath = rootPath; add(mRootPath, mRootItem); mNavList->setModelItems(mRootItem->getChildren()); } 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) { auto dir = QDir(path); if(!dir.exists()) return; auto subDirsNames = dir.entryList(QDir::AllDirs); for(const auto& name : subDirsNames){ if(name == "." || name == "..") continue; auto item = new NavigationItemModel(parentItem); if(!item->setPath(path + "/" + name)) { item->deleteLater(); continue; } connect(item, &NavigationItemModel::clicked, this, &NavigationController::onNavigationRequest); parentItem->appendChild(item); add(item->getPath(), item); } } void NavigationController::onNavigationRequest() { auto item = qobject_cast(QObject::sender()); if(!item) return; if(item->hasChildren()) mNavList->setModelItems(item->getChildren()); else { mMusicController->initPlayer(item); mUiState->showMusicPlayer(); } }