lena_pi/LenaPi/controllers/NavigationController.cpp
Anika Raemer d251120275 don't show folders that do not contain subfolders or audio files
hopefuly this will fix crash on RasPi
2018-12-25 20:15:41 +01:00

100 lines
2.8 KiB
C++

#include "NavigationController.h"
#include <QDir>
#include <QDebug>
#include <models/NavigationItemModel.h>
#include <models/NavigationListModel.h>
#include <models/UiStateModel.h>
#include <controllers/MusicController.h>
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;
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<NavigationItemModel*>(QObject::sender());
if(!item) return;
if(item->hasChildren())
mNavList->setModelItems(item->getChildren());
else {
mMusicController->initPlayer(item);
mUiState->showMusicPlayer();
}
}