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->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()));
60 LibraryForm::~LibraryForm()
62 _lib->saveCurrentPlaylist(_lib->getCurrentPlaylist());
66 void LibraryForm::_player() {
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);
81 void LibraryForm::_dynamic_button() {
84 void LibraryForm::_process_list_click(QModelIndex index) {
85 if (_state == STATE_NONE) return;
86 QString data = index.data().toString();
89 __fill_model(_model, _lib->getAlbumsForArtist(data));
90 _current_artist = data;
92 ui->backButton->setEnabled(true);
93 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
96 _current_album = data;
97 _current_tracks = _lib->getTracksForAlbum(data, _current_artist);
98 __fill_model_tracks(_model, _current_tracks);
100 ui->backButton->setEnabled(true);
101 ui->listLabel->setText(QString("Tracks from \"%1\" by \"%2\"").arg(_current_album).arg(_current_artist));
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));
119 void LibraryForm::_add_button() {
120 if (_state == STATE_NONE) return;
121 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
122 ui->listView->selectionModel()->clearSelection();
125 foreach (QModelIndex id, selected) {
126 _add_artist(id.data().toString());
130 foreach (QModelIndex id, selected) {
131 _add_album(_current_artist, id.data().toString());
135 foreach (QModelIndex id, selected) {
136 _add_track(_current_tracks.at(id.row()));
140 foreach (QModelIndex id, selected) {
141 _add_playlist(id.data().toString());
144 case STATE_PLAYLIST_TRACK:
145 foreach (QModelIndex id, selected) {
146 _add_track(_current_tracks.at(id.row()));
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);
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) {
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);
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) {
187 void LibraryForm::_back_button() {
193 __fill_model(_model, _lib->getAlbumsForArtist(_current_artist));
194 _state = STATE_ALBUM;
195 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
197 case STATE_PLAYLIST_TRACK:
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);
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());
224 int count = to_delete.count();
225 for (int i = count-1; i >= 0; i--) {
226 _current_tracks.removeAt(to_delete.at(i));
228 __fill_model_tracks(_model, _current_tracks);
232 void LibraryForm::_delete_track(Track track) {
233 Playlist current = _lib->getCurrentPlaylist();
234 current.removeTrack(track);
235 _lib->saveCurrentPlaylist(current);