#include #include #include #include #include #include #include #include #include "collectionfavoritesview.h" #include "helper.h" CollectionFavoritesView::CollectionFavoritesView(QWidget *parent) : CollectionWidget(parent) { QAction *removeFromFavoritesA = new QAction(QIcon(":/delete.png"), tr("Remove from Favorites"), this); connect(removeFromFavoritesA, &QAction::triggered, [this] { removeFromFavorites(view()->selectionModel()->selectedRows()); }); QAction *syncA = new QAction(QIcon(":/sissyd.png"), tr("Sync to dir..."), this); connect(syncA, &QAction::triggered, this, &CollectionFavoritesView::syncToDir); customActions()->addAction(Helper::createSeparator(this)); customActions()->addAction(syncA); customActions()->addAction(removeFromFavoritesA); } void CollectionFavoritesView::populate(){ disableSorting(); model()->clear(); model()->setHorizontalHeaderLabels(headers()); QSqlDatabase db = QSqlDatabase::database("beetplayerdb"); QStandardItem *root = model()->invisibleRootItem(); QIcon songIcon(":/song.png"); QSqlQuery favQ2(db); favQ2.prepare("SELECT sipos, tfullpath, igenres_id, artists.tartists_name, albums.talbum_name, ilength from songs, artists, albums WHERE songs.ttitle = :song AND albums.talbum_name = :album AND albums.ialbums_id = songs.ialbums_id AND artists.tartists_name = :artist AND artists.iartists_id = songs.iartists_id"); QSqlQuery favQ1("SELECT tartist_name, talbum_name, ttitle FROM persistent_favorites", db); while(favQ1.next()){ QStandardItem *curSong = new QStandardItem; curSong->setEditable(false); curSong->setFont(QFont("courier")); favQ2.bindValue(":song", favQ1.value(2)); favQ2.bindValue(":album", favQ1.value(1)); favQ2.bindValue(":artist", favQ1.value(0)); favQ2.exec(); favQ2.next(); QFontMetrics fm(QFont("courier")); QString songTitle = fm.elidedText(favQ1.value(2).toString(), Qt::ElideRight, fm.width('X') * 28); QString songText = QString("%1 - %2 - %3").arg(favQ1.value(0).toString(), -25).arg(songTitle, -30).arg(favQ1.value(1).toString()); curSong->setText(songText); curSong->setIcon(songIcon); curSong->setData(Song, TypeRole); curSong->setData(favQ2.value(0), IdRole); curSong->setData(favQ2.value(1), FullPathRole); curSong->setData(favQ2.value(2), GenreRole); curSong->setData(favQ1.value(0), ArtistRole); curSong->setData(favQ1.value(2), TitleRole); curSong->setData(favQ1.value(1), AlbumRole); curSong->setData(favQ2.value(5), LengthRole); root->appendRow(QList() << curSong); } enableSorting(); } void CollectionFavoritesView::removeFromFavorites(const QModelIndexList &idxs){ if(!idxs.isEmpty()){ QSqlDatabase db = QSqlDatabase::database("beetplayerdb"); QSqlQuery favRemoveQ(db); favRemoveQ.prepare("DELETE FROM persistent_favorites WHERE tartist_name = :artist AND talbum_name = :album AND ttitle = :title"); int removeCtr = 0; for(const QModelIndex &idx : idxs){ favRemoveQ.bindValue(":artist", idx.data(ArtistRole)); favRemoveQ.bindValue(":album", idx.data(AlbumRole)); favRemoveQ.bindValue(":title", idx.data(TitleRole)); if(favRemoveQ.exec()){ ++removeCtr; } } populate(); } } void CollectionFavoritesView::syncToDir(){ QSettings s; QString dir = s.value("syncdir", QDir::homePath()).toString(); QString destDir = QFileDialog::getExistingDirectory(this, tr("Sync to..."), dir); if(!destDir.isEmpty()){ s.setValue("syncdir", destDir); QStandardItemModel *m = model(); QStandardItem *root = m->invisibleRootItem(); QDirIterator it(destDir); if(it.hasNext()){ int retval = QMessageBox::warning(this, tr("Clear directory"), tr("Target directory is not empty. Delete all files?"), QMessageBox::Yes | QMessageBox::No); if(retval == QMessageBox::Yes){ while(it.hasNext()){ QFileInfo fi = it.fileInfo(); if(fi.isSymLink()){ QFile::remove(fi.filePath()); } it.next(); } } } for(int i = 0; i < root->rowCount(); ++i){ QStandardItem *child = root->child(i, 0); QString src = child->data(FullPathRole).toString(); QFileInfo fi(src); QString artist = child->data(ArtistRole).toString(); QString title = child->data(TitleRole).toString(); QString ext = fi.suffix(); QString linkTo = QString("%1/%2-%3.%4").arg(destDir).arg(artist).arg(title).arg(ext); QFile f(src); f.link(linkTo); } } }