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 QList<QString> albums = _lib->getAlbumsForArtist(artist);
157 foreach(QString album, albums) {
158 _add_album(artist, album);
162 void LibraryForm::_add_album(QString artist, QString album) {
163 QList<Track> tracks = _lib->getTracksForAlbum(album, artist);
164 foreach(Track track, tracks) {
169 void LibraryForm::_add_track(Track track) {
170 Playlist current = _lib->getCurrentPlaylist();
171 current.addTrack(track);
172 _lib->saveCurrentPlaylist(current);
175 void LibraryForm::_add_playlist(QString name) {
176 Playlist playlist = _lib->getPlaylist(name);
177 QList<Track> tracks = playlist.tracks();
178 foreach (Track track, tracks) {
183 void LibraryForm::_back_button() {
189 __fill_model(_model, _lib->getAlbumsForArtist(_current_artist));
190 _state = STATE_ALBUM;
191 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
193 case STATE_PLAYLIST_TRACK:
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);
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());
220 int count = to_delete.count();
221 for (int i = count-1; i >= 0; i--) {
222 _current_tracks.removeAt(to_delete.at(i));
224 __fill_model_tracks(_model, _current_tracks);
228 void LibraryForm::_delete_track(Track track) {
229 Playlist current = _lib->getCurrentPlaylist();
230 current.removeTrack(track);
231 _lib->saveCurrentPlaylist(current);