Removed debug info
[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         QList<QString> albums = _lib->getAlbumsForArtist(artist);
157         foreach(QString album, albums) {
158                 _add_album(artist, album);
159         }
160 }
161
162 void LibraryForm::_add_album(QString artist, QString album) {
163         QList<Track> tracks = _lib->getTracksForAlbum(album, artist);
164         foreach(Track track, tracks) {
165                 _add_track(track);
166         }
167 }
168
169 void LibraryForm::_add_track(Track track) {
170         Playlist current = _lib->getCurrentPlaylist();
171         current.addTrack(track);
172         _lib->saveCurrentPlaylist(current);
173 }
174
175 void LibraryForm::_add_playlist(QString name) {
176         Playlist playlist = _lib->getPlaylist(name);
177         QList<Track> tracks = playlist.tracks();
178         foreach (Track track, tracks) {
179                 _add_track(track);
180         }
181 }
182
183 void LibraryForm::_back_button() {
184         switch (_state) {
185         case STATE_ALBUM:
186                 _view_button();
187                 break;
188         case STATE_TRACK:
189                 __fill_model(_model, _lib->getAlbumsForArtist(_current_artist));
190                 _state = STATE_ALBUM;
191                 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
192                 break;
193         case STATE_PLAYLIST_TRACK:
194                 _playlists_button();
195         default:
196                 return;
197         }
198 }
199
200 void LibraryForm::_playlists_button() {
201         QList<QString> playlists = _lib->getPlaylistsNames();
202         __fill_model(_model, playlists);
203         ui->listView->setModel(_model);
204         _state = STATE_PLAYLIST;
205         ui->backButton->setEnabled(false);
206         ui->listLabel->setText("Playlists");
207         ui->addButton->setEnabled(false);
208 }
209
210 void LibraryForm::_delete_button() {
211         if (_state == STATE_PLAYLIST_TRACK) {
212                 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
213                 ui->listView->selectionModel()->clearSelection();
214                 QQueue<int> to_delete;
215                 foreach (QModelIndex id, selected) {
216                         _delete_track(_current_tracks.at(id.row()));
217                         to_delete.append(id.row());
218                 }
219                 qSort(to_delete);
220                 int count = to_delete.count();
221                 for (int i = count-1; i >= 0; i--) {
222                         _current_tracks.removeAt(to_delete.at(i));
223                 }
224                 __fill_model_tracks(_model, _current_tracks);
225         }
226 }
227
228 void LibraryForm::_delete_track(Track track) {
229         Playlist current = _lib->getCurrentPlaylist();
230         current.removeTrack(track);
231         _lib->saveCurrentPlaylist(current);
232 }