#include #include #include #include #include #include #include #include "collectionfoldersview.h" #include "collectionwidgetproxy.h" CollectionFoldersView::CollectionFoldersView(QWidget *parent) : CollectionWidget(parent){ readSettings(); connect(view(), &BeetView::doubleClicked, this, &CollectionFoldersView::itemDoubleCliced); } void CollectionFoldersView::populate(){ disableSorting(); model()->clear(); model()->setHorizontalHeaderLabels(headers()); QStandardItem *root = model()->invisibleRootItem(); QDir d(mCurrentFolder); if(!d.exists()){ QString msg = QString("%1 vanished from under us!").arg(mCurrentFolder); emit message(msg); readSettings(); d.setPath(mCurrentFolder); } QMimeDatabase db; QIcon songIcon(":/song.png"); QIcon otherIcon(":/belly_right_and_clear.png"); QIcon dirIcon(":/folder.png"); QFileInfoList fl = d.entryInfoList(QStringList() << "*", QDir::Files | QDir::Dirs | QDir::NoDot, QDir::Name | QDir::DirsFirst); for(const QFileInfo &fi : fl){ QStandardItem *cur = new QStandardItem; cur->setEditable(false); cur->setText(fi.fileName()); if(fi.isDir()){ cur->setIcon(dirIcon); }else if(fi.isFile()){ QMimeType mt = db.mimeTypeForFile(fi); if(mt.name().startsWith("audio")){ cur->setIcon(songIcon); cur->setData(Song, TypeRole); cur->setData(-1, IdRole); TagLib::FileRef file(fi.absoluteFilePath().toUtf8()); if(!file.isNull()){ QString artist = QString::fromStdWString(file.tag()->artist().toWString()); cur->setData(artist.toLower(), ArtistRole); QString album = QString::fromStdWString(file.tag()->album().toWString()); cur->setData(album.toLower(), AlbumRole); QString genre = QString::fromStdWString(file.tag()->genre().toWString()); cur->setData(genre.toLower(), GenreRole); QString title = QString::fromStdWString(file.tag()->title().toWString()); cur->setData(title.toLower(), TitleRole); } }else{ cur->setIcon(otherIcon); } } cur->setData(fi.absoluteFilePath(), FullPathRole); root->appendRow(cur); } enableSorting(); } void CollectionFoldersView::readSettings(){ QSettings s; mCurrentFolder = s.value("folderdir", QDir::homePath()).toString(); } void CollectionFoldersView::itemDoubleCliced(const QModelIndex &idx){ QDir d(mCurrentFolder); if(idx.data().toString() == ".."){ d.cdUp(); }else{ d.cd(idx.data().toString()); } mCurrentFolder = d.absolutePath(); populate(); } void CollectionFoldersView::deleteCurrent(){ QString toDel = QDir::toNativeSeparators(mCurrentFolder); toDel.append(QDir::separator()); toDel.append(view()->currentIndex().data().toString()); QString msg = QString(tr("Really delete %1?")).arg(toDel); CollectionWidgetProxy *proxy = static_cast(view()->model()); int retval = QMessageBox::question(this, tr("Delete"), msg); if(retval == QMessageBox::Yes){ QFileInfo fi(toDel); bool success = false; if(fi.isDir()){ QDir d(toDel); success = d.removeRecursively(); }else if(fi.isFile()){ success = QFile::remove(toDel); } if(success){ proxy->removeRow(view()->currentIndex().row()); }else{ QString msg = QString(tr("Deleting %1 failed!")).arg(toDel); QMessageBox::critical(this, tr("Error"), msg); } } }