summaryrefslogtreecommitdiffstats
path: root/collectionfavoritesview.cpp
blob: b948c4160f81ca453e89600765e911ec09db2363 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QStandardItem>
#include <QAction>
#include <QFileDialog>
#include <QDirIterator>
#include <QMessageBox>
#include <QSettings>

#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<QStandardItem*>() << 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);
         }
    }
}