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
|
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QStandardItem>
#include <QDate>
#include "collectiondatesview.h"
#include "copydialog.h"
#include "collectionwidgetproxy.h"
CollectionDatesView::CollectionDatesView(QWidget *parent) : CollectionWidget(parent){
}
void CollectionDatesView::populate(){
disableSorting();
model()->clear();
model()->setHorizontalHeaderLabels(headers());
QSqlDatabase db = QSqlDatabase::database("beetplayerdb");
QStandardItem *root = model()->invisibleRootItem();
QIcon dateIcon(":/bizarre_amputee.png");
root->setIcon(dateIcon);
QIcon albumIcon(":/album.png");
QIcon songIcon(":/song.png");
QSqlQuery songQ(db);
songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id, artists.tartists_name, albums.talbum_name, ilength FROM songs, artists, albums WHERE albums.ialbums_id = :id AND songs.iartists_id = artists.iartists_id and songs.ialbums_id = albums.ialbums_id ORDER BY sipos");
QHash<int, QStandardItem*> years;
QHash<QString, QStandardItem*> yearMonths;
QSqlQuery q1("SELECT DISTINCT(albums.ialbums_id), talbum_name, dadded, tartists_name FROM albums, artists, songs WHERE albums.ialbums_id = songs.ialbums_id AND songs.iartists_id = artists.iartists_id ORDER BY dadded DESC", db);
while(q1.next()){
QDate added = q1.value(2).toDate();
int year = added.year();
QStandardItem *yearItem = nullptr;
QStandardItem *ymItem = nullptr;
if(years.contains(year)){
yearItem = years.value(year);
}else{
yearItem = new QStandardItem;
yearItem->setText(QString::number(year));
years.insert(year, yearItem);
yearItem->setIcon(dateIcon);
root->appendRow(yearItem);
}
QString yearMonth = QString("%1-%2").arg(QString::number(added.year())).arg(added.month(), 2, 10, QChar('0'));
if(yearMonths.contains(yearMonth)){
ymItem = yearMonths.value(yearMonth);
}else{
ymItem = new QStandardItem;
ymItem->setText(yearMonth);
ymItem->setIcon(dateIcon);
yearMonths.insert(yearMonth, ymItem);
yearItem->appendRow(ymItem);
}
QStandardItem *albumItem = new QStandardItem;
QString albumText = QString("%1 - %2").arg(q1.value(3).toString()).arg(q1.value(1).toString());
albumItem->setText(albumText);
albumItem->setIcon(albumIcon);
albumItem->setData(Album, TypeRole);
albumItem->setData(q1.value(3), ArtistRole);
albumItem->setData(q1.value(1), AlbumRole);
ymItem->appendRow(albumItem);
songQ.bindValue(":id", q1.value(0));
songQ.exec();
while(songQ.next()){
QStandardItem *curSong = new QStandardItem;
curSong->setEditable(false);
curSong->setFont(QFont("courier"));
QString songText = QString(tr("%1 - %2 - %3")).arg(songQ.value(0).toInt(), 3, 10, QChar('0')).arg(songQ.value(1).toString()).arg(songQ.value(4).toString());
curSong->setText(songText);
curSong->setIcon(songIcon);
curSong->setData(Song, TypeRole);
curSong->setData(songQ.value(0), IdRole);
curSong->setData(songQ.value(2), FullPathRole);
curSong->setData(songQ.value(3), GenreRole);
curSong->setData(songQ.value(4), ArtistRole);
curSong->setData(songQ.value(1), TitleRole);
curSong->setData(songQ.value(5), AlbumRole);
curSong->setData(songQ.value(6), LengthRole);
albumItem->appendRow(curSong);
}
}
enableSorting(Qt::DescendingOrder);
}
void CollectionDatesView::copyTo(){
QModelIndexList sel = view()->selectionModel()->selectedRows();
if(sel.isEmpty()){
return;
}
QModelIndex first = sel.first();
int type = first.data(TypeRole).toInt();
if(type != Album){
return;
}
CollectionWidgetProxy *proxy = static_cast<CollectionWidgetProxy*>(view()->model());
QModelIndex srcIdx = proxy->mapToSource(first);
QStandardItem *item = model()->itemFromIndex(srcIdx);
QString src = QString("%1 (%2 files)").arg(srcIdx.data().toString()).arg(QString::number(item->rowCount()));
CopyDialog *cdlg = new CopyDialog(this);
cdlg->setSource(src);
QString destDir = srcIdx.data().toString().toLower();
destDir = destDir.replace(" - ", "-");
destDir = destDir.replace(' ', '.');
cdlg->setDestFolder(destDir);
cdlg->show();
}
|