463b9390af5574c23ff4a285e58f1c47fcbd0107
[someplayer] / src / libraryform.cpp
1 #include "libraryform.h"
2 #include "ui_libraryform.h"
3 #include "library.h"
4 #include <QStandardItemModel>
5 #include <QStandardItem>
6 #include <QModelIndex>
7 #include <QModelIndexList>
8 #include "track.h"
9 #include "playlist.h"
10 #include <QDebug>
11 #include <QTime>
12 #include <QQueue>
13
14 using namespace SomePlayer::DataObjects;
15
16 inline QString __format_track_string(TrackMetadata meta) {
17         int minutes = meta.length() / 60;
18         int seconds = meta.length() % 60;
19         QTime time(0, minutes, seconds);
20         return QString("[%1] %2").arg(time.toString("mm:ss")).arg(meta.title());
21
22 }
23
24 inline void __fill_model(QStandardItemModel *model, QList<QString> data) {
25         model->clear();
26         int count = data.count();
27         model->setRowCount(count);
28         for (int i = 0; i < count; i++) {
29                 model->setItem(i, 0, new QStandardItem(data.at(i)));
30         }
31 }
32
33 inline void __fill_model_tracks (QStandardItemModel *model, QList<Track> tracks) {
34         int count = tracks.count();
35         model->setRowCount(count);
36         for (int i = 0; i < count; i++) {
37                 TrackMetadata meta = tracks.at(i).metadata();
38                 model->setItem(i, 0, new QStandardItem(__format_track_string(meta)));
39         }
40 }
41
42 LibraryForm::LibraryForm(Library *lib, QWidget *parent) :
43     QWidget(parent),
44     ui(new Ui::LibraryForm)
45 {
46         _lib = lib;
47         _model = new QStandardItemModel(this);
48         _state = STATE_NONE;
49     ui->setupUi(this);
50         connect(ui->playerButton, SIGNAL(clicked()), this, SLOT(_player()));
51         connect(ui->viewButton, SIGNAL(clicked()), this, SLOT(_view_button()));
52         connect(ui->playlistsButton, SIGNAL(clicked()), this, SLOT(_playlists_button()));
53         connect(ui->listView, SIGNAL(clicked(QModelIndex)), this, SLOT(_process_list_click(QModelIndex)));
54         connect(ui->addButton, SIGNAL(clicked()), this, SLOT(_add_button()));
55         connect(ui->backButton, SIGNAL(clicked()), this, SLOT(_back_button()));
56         connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(_delete_button()));
57         _view_button();
58 }
59
60 LibraryForm::~LibraryForm()
61 {
62         _lib->saveCurrentPlaylist(_lib->getCurrentPlaylist());
63     delete ui;
64 }
65
66 void LibraryForm::_player() {
67         emit player();
68 }
69
70 void LibraryForm::_view_button() {
71         QList<QString> artitst = _lib->getArtists();
72         __fill_model(_model, artitst);
73         ui->listView->setModel(_model);
74         _state = STATE_ARTIST;
75         ui->backButton->setEnabled(false);
76         ui->listLabel->setText("Artists");
77         ui->addButton->setEnabled(true);
78         ui->deleteButton->setEnabled(false);
79 }
80
81 void LibraryForm::_dynamic_button() {
82 }
83
84 void LibraryForm::_process_list_click(QModelIndex index) {
85         if (_state == STATE_NONE) return;
86         QString data = index.data().toString();
87         switch (_state) {
88         case STATE_ARTIST:
89                 __fill_model(_model, _lib->getAlbumsForArtist(data));
90                 _current_artist = data;
91                 _state = STATE_ALBUM;
92                 ui->backButton->setEnabled(true);
93                 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
94                 break;
95         case STATE_ALBUM:
96                 _current_album = data;
97                 _current_tracks = _lib->getTracksForAlbum(data, _current_artist);
98                 __fill_model_tracks(_model, _current_tracks);
99                 _state = STATE_TRACK;
100                 ui->backButton->setEnabled(true);
101                 ui->listLabel->setText(QString("Tracks from \"%1\" by \"%2\"").arg(_current_album).arg(_current_artist));
102                 break;
103         case STATE_PLAYLIST:
104                 {
105                         Playlist playlist = _lib->getPlaylist(data);
106                         _current_tracks = playlist.tracks();
107                         __fill_model_tracks(_model, _current_tracks);
108                         _state = STATE_PLAYLIST_TRACK;
109                         ui->backButton->setEnabled(true);
110                         ui->deleteButton->setEnabled(true);
111                         ui->listLabel->setText(QString("Tracks in playlist \"%1\"").arg(data));
112                 }
113                 break;
114         default:
115                 return;
116         }
117 }
118
119 void LibraryForm::_add_button() {
120         if (_state == STATE_NONE) return;
121         QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
122         ui->listView->selectionModel()->clearSelection();
123         switch (_state) {
124         case STATE_ARTIST:
125                 foreach (QModelIndex id, selected) {
126                         _add_artist(id.data().toString());
127                 }
128                 break;
129         case STATE_ALBUM:
130                 foreach (QModelIndex id, selected) {
131                         _add_album(_current_artist, id.data().toString());
132                 }
133                 break;
134         case STATE_TRACK:
135                 foreach (QModelIndex id, selected) {
136                         _add_track(_current_tracks.at(id.row()));
137                 }
138                 break;
139         case STATE_PLAYLIST:
140                 foreach (QModelIndex id, selected) {
141                         _add_playlist(id.data().toString());
142                 }
143                 break;
144         case STATE_PLAYLIST_TRACK:
145                 foreach (QModelIndex id, selected) {
146                         _add_track(_current_tracks.at(id.row()));
147                 }
148                 break;
149         default:
150                 return;
151         }
152 }
153
154
155 void LibraryForm::_add_artist(QString artist) {
156         qDebug() << "adding ARTIST " << artist;
157         QList<QString> albums = _lib->getAlbumsForArtist(artist);
158         foreach(QString album, albums) {
159                 _add_album(artist, album);
160         }
161 }
162
163 void LibraryForm::_add_album(QString artist, QString album) {
164         qDebug() << "adding ALBUM " << album << " by " << artist;
165         QList<Track> tracks = _lib->getTracksForAlbum(album, artist);
166         foreach(Track track, tracks) {
167                 _add_track(track);
168         }
169 }
170
171 void LibraryForm::_add_track(Track track) {
172         qDebug() << "adding TRACK " << track.metadata().title() << " from " << track.metadata().album() << " by " << track.metadata().artist();
173         Playlist current = _lib->getCurrentPlaylist();
174         current.addTrack(track);
175         _lib->saveCurrentPlaylist(current);
176 }
177
178 void LibraryForm::_add_playlist(QString name) {
179         qDebug() << "adding playlist \"" << name << "\"";
180         Playlist playlist = _lib->getPlaylist(name);
181         QList<Track> tracks = playlist.tracks();
182         foreach (Track track, tracks) {
183                 _add_track(track);
184         }
185 }
186
187 void LibraryForm::_back_button() {
188         switch (_state) {
189         case STATE_ALBUM:
190                 _view_button();
191                 break;
192         case STATE_TRACK:
193                 __fill_model(_model, _lib->getAlbumsForArtist(_current_artist));
194                 _state = STATE_ALBUM;
195                 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
196                 break;
197         case STATE_PLAYLIST_TRACK:
198                 _playlists_button();
199         default:
200                 return;
201         }
202 }
203
204 void LibraryForm::_playlists_button() {
205         QList<QString> playlists = _lib->getPlaylistsNames();
206         __fill_model(_model, playlists);
207         ui->listView->setModel(_model);
208         _state = STATE_PLAYLIST;
209         ui->backButton->setEnabled(false);
210         ui->listLabel->setText("Playlists");
211         ui->addButton->setEnabled(false);
212 }
213
214 void LibraryForm::_delete_button() {
215         if (_state == STATE_PLAYLIST_TRACK) {
216                 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
217                 ui->listView->selectionModel()->clearSelection();
218                 QQueue<int> to_delete;
219                 foreach (QModelIndex id, selected) {
220                         _delete_track(_current_tracks.at(id.row()));
221                         to_delete.append(id.row());
222                 }
223                 qSort(to_delete);
224                 int count = to_delete.count();
225                 for (int i = count-1; i >= 0; i--) {
226                         _current_tracks.removeAt(to_delete.at(i));
227                 }
228                 __fill_model_tracks(_model, _current_tracks);
229         }
230 }
231
232 void LibraryForm::_delete_track(Track track) {
233         Playlist current = _lib->getCurrentPlaylist();
234         current.removeTrack(track);
235         _lib->saveCurrentPlaylist(current);
236 }