#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::setUiProfile(const QString &profileString) { mUiState->setProfile(profileString); } 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; if(!checkContent(path + "/" + 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); } } bool NavigationController::checkContent(const QString &path) { bool valid = false; auto dir =QDir(path); auto subDirsNames = dir.entryList(QDir::AllDirs); if(subDirsNames.length() > 0) { valid = true; } else { auto fileNames = dir.entryList(QDir::Files); int numAudio = 0; for(auto file:fileNames){ if(file.endsWith(".flac") || file.endsWith(".mp3")){ numAudio++; } } if(numAudio > 0) valid = true; } return valid; } 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(); } }