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