1 #include "libraryform.h"
2 #include "ui_libraryform.h"
4 #include <QStandardItemModel>
5 #include <QStandardItem>
7 #include <QModelIndexList>
14 using namespace SomePlayer::DataObjects;
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());
24 inline void __fill_model(QStandardItemModel *model, QList<QString> data) {
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)));
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)));
42 LibraryForm::LibraryForm(Library *lib, QWidget *parent) :
44 ui(new Ui::LibraryForm)
47 _model = new QStandardItemModel(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->dynamicButton, SIGNAL(clicked()), this, SLOT(_dynamic_button()));
54 connect(ui->listView, SIGNAL(clicked(QModelIndex)), this, SLOT(_process_list_click(QModelIndex)));
55 connect(ui->addButton, SIGNAL(clicked()), this, SLOT(_add_button()));
56 connect(ui->backButton, SIGNAL(clicked()), this, SLOT(_back_button()));
57 connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(_delete_button()));
58 connect(ui->useButton, SIGNAL(clicked()), this, SLOT(_use_button()));
62 LibraryForm::~LibraryForm()
64 _lib->saveCurrentPlaylist(_lib->getCurrentPlaylist());
68 void LibraryForm::_player() {
72 void LibraryForm::_view_button() {
73 QList<QString> artitst = _lib->getArtists();
74 __fill_model(_model, artitst);
75 ui->listView->setModel(_model);
76 _state = STATE_ARTIST;
77 ui->backButton->hide();
78 ui->listLabel->setText("Artists");
79 ui->addButton->show();
80 ui->deleteButton->hide();
81 ui->useButton->hide();
84 void LibraryForm::_dynamic_button() {
85 ui->useButton->hide();
86 ui->backButton->hide();
87 ui->addButton->show();
88 ui->deleteButton->hide();
90 _model->setRowCount(4);
91 _model->setItem(0, new QStandardItem("Favorites"));
92 _model->setItem(1, new QStandardItem("Most played"));
93 _model->setItem(2, new QStandardItem("Never played"));
94 _model->setItem(3, new QStandardItem("Recently added"));
95 _state = STATE_DYNAMIC;
98 void LibraryForm::_process_list_click(QModelIndex index) {
99 if (_state == STATE_NONE) return;
100 QString data = index.data().toString();
103 __fill_model(_model, _lib->getAlbumsForArtist(data));
104 _current_artist = data;
105 _state = STATE_ALBUM;
106 ui->backButton->show();
107 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
110 _current_album = data;
111 _current_tracks = _lib->getTracksForAlbum(data, _current_artist);
112 __fill_model_tracks(_model, _current_tracks);
113 _state = STATE_TRACK;
114 ui->backButton->show();
115 ui->listLabel->setText(QString("Tracks from \"%1\" by \"%2\"").arg(_current_album).arg(_current_artist));
119 _current_playlist = _lib->getPlaylist(data);
120 _current_tracks = _current_playlist.tracks();
121 __fill_model_tracks(_model, _current_tracks);
122 _state = STATE_PLAYLIST_TRACK;
123 ui->backButton->show();
124 ui->deleteButton->show();
125 ui->useButton->show();
126 ui->listLabel->setText(QString("Tracks in playlist \"%1\"").arg(data));
131 switch(index.row()) {
133 _current_playlist = _lib->getFavorites();
135 case 1: //most played
136 _current_playlist = _lib->getMostPlayed();
138 case 2: //never played
139 _current_playlist = _lib->getNeverPlayed();
140 case 3: //recently added
141 _current_playlist = _lib->getRecentlyAdded();
146 _current_tracks = _current_playlist.tracks();
147 __fill_model_tracks(_model, _current_tracks);
148 _state = STATE_PLAYLIST_TRACK;
149 ui->backButton->show();
150 ui->useButton->show();
151 ui->addButton->show();
152 ui->listLabel->setText(_current_playlist.name());
159 void LibraryForm::_add_button() {
160 if (_state == STATE_NONE) return;
161 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
162 ui->listView->selectionModel()->clearSelection();
163 emit busy(QString("<H1>Adding... Please wait</H1>"));
166 foreach (QModelIndex id, selected) {
167 _add_artist(id.data().toString());
171 foreach (QModelIndex id, selected) {
172 _add_album(_current_artist, id.data().toString());
176 foreach (QModelIndex id, selected) {
177 _add_track(_current_tracks.at(id.row()));
181 foreach (QModelIndex id, selected) {
182 _add_playlist(id.data().toString());
185 case STATE_PLAYLIST_TRACK:
186 foreach (QModelIndex id, selected) {
187 _add_track(_current_tracks.at(id.row()));
198 void LibraryForm::_add_artist(QString artist) {
199 QList<QString> albums = _lib->getAlbumsForArtist(artist);
200 foreach(QString album, albums) {
201 _add_album(artist, album);
205 void LibraryForm::_add_album(QString artist, QString album) {
206 QList<Track> tracks = _lib->getTracksForAlbum(album, artist);
207 foreach(Track track, tracks) {
212 void LibraryForm::_add_track(Track track) {
213 Playlist current = _lib->getCurrentPlaylist();
214 current.addTrack(track);
215 _lib->saveCurrentPlaylist(current);
218 void LibraryForm::_add_playlist(QString name) {
219 Playlist playlist = _lib->getPlaylist(name);
220 QList<Track> tracks = playlist.tracks();
221 foreach (Track track, tracks) {
226 void LibraryForm::_back_button() {
232 __fill_model(_model, _lib->getAlbumsForArtist(_current_artist));
233 _state = STATE_ALBUM;
234 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
236 case STATE_PLAYLIST_TRACK:
243 void LibraryForm::_playlists_button() {
244 QList<QString> playlists = _lib->getPlaylistsNames();
245 __fill_model(_model, playlists);
246 ui->listView->setModel(_model);
247 _state = STATE_PLAYLIST;
248 ui->backButton->hide();
249 ui->listLabel->setText("Playlists");
250 ui->addButton->hide();
251 ui->deleteButton->show();
252 ui->useButton->hide();
255 void LibraryForm::_delete_button() {
256 if (_state == STATE_PLAYLIST_TRACK) {
257 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
258 ui->listView->selectionModel()->clearSelection();
259 QQueue<int> to_delete;
260 foreach (QModelIndex id, selected) {
261 _delete_track(_current_tracks.at(id.row()));
262 to_delete.append(id.row());
265 int count = to_delete.count();
266 for (int i = count-1; i >= 0; i--) {
267 _current_tracks.removeAt(to_delete.at(i));
269 __fill_model_tracks(_model, _current_tracks);
270 } else if (_state == STATE_PLAYLIST) {
271 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
272 QQueue<int> to_delete;
273 foreach (QModelIndex id, selected) {
274 _delete_track(_current_tracks.at(id.row()));
275 to_delete.append(id.row());
278 int count = to_delete.count();
279 for (int i = count-1; i >= 0; i--) {
280 _lib->removePlaylist(_model->item(to_delete.at(i))->data().toString());
281 _model->removeRow(to_delete.at(i));
286 void LibraryForm::_delete_track(Track track) {
287 Playlist current = _lib->getCurrentPlaylist();
288 current.removeTrack(track);
289 _lib->saveCurrentPlaylist(current);
292 void LibraryForm::_use_button() {
293 _lib->saveCurrentPlaylist(_current_playlist);