2 * SomePlayer - An alternate music player for Maemo 5
3 * Copyright (C) 2010 Nikolay (somebody) Tischenko <niktischenko@gmail.com>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #include "libraryform.h"
21 #include "ui_libraryform.h"
23 #include <QStandardItemModel>
24 #include <QStandardItem>
25 #include <QModelIndex>
26 #include <QModelIndexList>
31 #include <QMessageBox>
34 using namespace SomePlayer::DataObjects;
35 using namespace SomePlayer::Storage;
37 inline QString __format_track_string(TrackMetadata meta) {
38 int minutes = meta.length() / 60;
39 int seconds = meta.length() % 60;
40 QTime time(0, minutes, seconds);
41 return QString("[%1] %2").arg(time.toString("mm:ss")).arg(meta.title());
45 inline void __fill_model(QStandardItemModel *model, QList<QString> data) {
47 int count = data.count();
48 model->setRowCount(count);
49 for (int i = 0; i < count; i++) {
50 model->setItem(i, 0, new QStandardItem(data.at(i)));
54 inline void __fill_model_tracks (QStandardItemModel *model, QList<Track> tracks) {
55 int count = tracks.count();
56 model->setRowCount(count);
58 bool show_lenght = (config.getValue("ui/showtracklenght").toString() != "no");
59 for (int i = 0; i < count; i++) {
60 TrackMetadata meta = tracks.at(i).metadata();
62 model->setItem(i, 0, new QStandardItem(__format_track_string(meta)));
64 model->setItem(i, 0, new QStandardItem(meta.title()));
68 LibraryForm::LibraryForm(Library *lib, QWidget *parent) :
70 ui(new Ui::LibraryForm)
73 _model = new QStandardItemModel(this);
76 connect(ui->playerButton, SIGNAL(clicked()), this, SLOT(_player()));
77 connect(ui->viewButton, SIGNAL(clicked()), this, SLOT(_view_button()));
78 connect(ui->playlistsButton, SIGNAL(clicked()), this, SLOT(_playlists_button()));
79 connect(ui->dynamicButton, SIGNAL(clicked()), this, SLOT(_dynamic_button()));
80 connect(ui->listView, SIGNAL(clicked(QModelIndex)), this, SLOT(_process_list_click(QModelIndex)));
81 connect(ui->addButton, SIGNAL(clicked()), this, SLOT(_add_button()));
82 connect(ui->selectAllButton, SIGNAL(clicked()), this, SLOT(_toggle_select_all_button()));
83 connect(ui->backButton, SIGNAL(clicked()), this, SLOT(_back_button()));
84 connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(_delete_button()));
85 connect(ui->useButton, SIGNAL(clicked()), this, SLOT(_use_button()));
88 _icons_theme = config.getValue("ui/iconstheme").toString();
89 _current_playlist_changed = true;
90 setAttribute(Qt::WA_Maemo5StackedWindow);
93 LibraryForm::~LibraryForm()
95 _lib->saveCurrentPlaylist(_lib->getCurrentPlaylist()); // wtf?
96 _current_playlist_changed = true;
100 void LibraryForm::_player() {
101 emit player(_current_playlist_changed);
102 _current_playlist_changed = false;
105 void LibraryForm::_view_button() {
106 QList<QString> artitst = _lib->getArtists();
107 __fill_model(_model, artitst);
108 ui->listView->setModel(_model);
109 _state = STATE_ARTIST;
110 ui->backButton->hide();
111 ui->listLabel->setText("Artists");
112 ui->addButton->show();
113 ui->deleteButton->hide();
114 ui->useButton->hide();
117 void LibraryForm::_dynamic_button() {
118 ui->useButton->hide();
119 ui->backButton->hide();
120 ui->addButton->show();
121 ui->deleteButton->hide();
123 _model->setRowCount(4);
124 _model->setItem(0, new QStandardItem("Favorites"));
125 _model->setItem(1, new QStandardItem("Most played"));
126 _model->setItem(2, new QStandardItem("Never played"));
127 _model->setItem(3, new QStandardItem("Recently added"));
128 ui->listLabel->setText("Dynamic playlists");
129 _state = STATE_DYNAMIC;
132 void LibraryForm::_process_list_click(QModelIndex index) {
133 if (_state == STATE_NONE) return;
134 QString data = index.data().toString();
137 __fill_model(_model, _lib->getAlbumsForArtist(data));
138 ui->listView->scrollToTop();
139 _current_artist = data;
140 _state = STATE_ALBUM;
141 ui->backButton->show();
142 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
145 _current_album = data;
146 _current_tracks = _lib->getTracksForAlbum(data, _current_artist);
147 __fill_model_tracks(_model, _current_tracks);
148 ui->listView->scrollToTop();
149 _state = STATE_TRACK;
150 ui->backButton->show();
151 ui->listLabel->setText(QString("Tracks from \"%1\" by \"%2\"").arg(_current_album).arg(_current_artist));
155 _current_playlist = _lib->getPlaylist(data);
156 _current_tracks = _current_playlist.tracks();
157 __fill_model_tracks(_model, _current_tracks);
158 ui->listView->scrollToTop();
159 _state = STATE_PLAYLIST_TRACK;
160 ui->backButton->show();
161 ui->deleteButton->show();
162 ui->useButton->show();
163 ui->listLabel->setText(QString("Tracks in playlist \"%1\"").arg(data));
168 switch(index.row()) {
170 _current_playlist = _lib->getFavorites();
172 case 1: //most played
173 _current_playlist = _lib->getMostPlayed();
175 case 2: //never played
176 _current_playlist = _lib->getNeverPlayed();
177 case 3: //recently added
178 _current_playlist = _lib->getRecentlyAdded();
183 _current_tracks = _current_playlist.tracks();
184 __fill_model_tracks(_model, _current_tracks);
185 ui->listView->scrollToTop();
186 _state = STATE_PLAYLIST_TRACK;
187 ui->backButton->show();
188 ui->useButton->show();
189 ui->addButton->show();
190 ui->listLabel->setText(_current_playlist.name());
197 void LibraryForm::_add_button() {
198 if (_state == STATE_NONE) return;
199 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
200 ui->listView->selectionModel()->clearSelection();
201 emit busy(QString("<H1>Adding... Please wait</H1>"));
204 foreach (QModelIndex id, selected) {
205 _add_artist(id.data().toString());
209 foreach (QModelIndex id, selected) {
210 _add_album(_current_artist, id.data().toString());
214 foreach (QModelIndex id, selected) {
215 _add_track(_current_tracks.at(id.row()));
219 foreach (QModelIndex id, selected) {
220 _add_playlist(id.data().toString());
223 case STATE_PLAYLIST_TRACK:
224 foreach (QModelIndex id, selected) {
225 _add_track(_current_tracks.at(id.row()));
236 void LibraryForm::_add_artist(QString artist) {
237 QList<QString> albums = _lib->getAlbumsForArtist(artist);
238 foreach(QString album, albums) {
239 _add_album(artist, album);
243 void LibraryForm::_add_album(QString artist, QString album) {
244 QList<Track> tracks = _lib->getTracksForAlbum(album, artist);
245 foreach(Track track, tracks) {
250 void LibraryForm::_add_track(Track track) {
251 Playlist current = _lib->getCurrentPlaylist();
252 current.addTrack(track);
253 _lib->saveCurrentPlaylist(current);
254 _current_playlist_changed = true;
257 void LibraryForm::_add_playlist(QString name) {
258 Playlist playlist = _lib->getPlaylist(name);
259 QList<Track> tracks = playlist.tracks();
260 foreach (Track track, tracks) {
265 void LibraryForm::_back_button() {
269 ui->listView->scrollToTop();
272 __fill_model(_model, _lib->getAlbumsForArtist(_current_artist));
273 ui->listView->scrollToTop();
274 _state = STATE_ALBUM;
275 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
277 case STATE_PLAYLIST_TRACK:
279 ui->listView->scrollToTop();
285 void LibraryForm::_playlists_button() {
286 QList<QString> playlists = _lib->getPlaylistsNames();
287 __fill_model(_model, playlists);
288 ui->listView->setModel(_model);
289 _state = STATE_PLAYLIST;
290 ui->backButton->hide();
291 ui->listLabel->setText("Playlists");
292 ui->addButton->hide();
293 ui->deleteButton->show();
294 ui->useButton->hide();
297 void LibraryForm::_delete_button() {
298 if (_state == STATE_PLAYLIST_TRACK) {
299 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
300 ui->listView->selectionModel()->clearSelection();
301 QQueue<int> to_delete;
302 foreach (QModelIndex id, selected) {
303 to_delete.append(id.row());
306 int count = to_delete.count();
307 for (int i = count-1; i >= 0; i--) {
308 _current_playlist.removeTrackAt(to_delete.at(i));
310 _current_tracks = _current_playlist.tracks();
311 _lib->savePlaylist(_current_playlist);
312 __fill_model_tracks(_model, _current_tracks);
313 } else if (_state == STATE_PLAYLIST) {
314 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
315 QQueue<int> to_delete;
316 foreach (QModelIndex id, selected) {
317 to_delete.append(id.row());
320 int count = to_delete.count();
321 for (int i = count-1; i >= 0; i--) {
322 QString name = _model->item(to_delete.at(i))->text();
323 if (name != _CURRENT_PLAYLIST_SUBST_) {
324 _lib->removePlaylist(name);
325 _model->removeRow(to_delete.at(i));
331 void LibraryForm::_delete_track(Track track) {
332 Playlist current = _lib->getCurrentPlaylist();
333 current.removeTrack(track);
334 _lib->saveCurrentPlaylist(current);
335 _current_playlist_changed = true;
338 void LibraryForm::_use_button() {
339 _lib->saveCurrentPlaylist(_current_playlist);
340 _current_playlist_changed = true;
341 _current_playlist = _lib->getCurrentPlaylist();
344 void LibraryForm::search(QString &pattern) {
345 _search_pattern = pattern;
346 _search_current_id = -1;
350 void LibraryForm::nextItem() {
351 QString data = _model->index(_search_current_id, 0).data().toString();
352 for (int i = _search_current_id+1; i < _model->rowCount(); i++) {
353 data = _model->index(i, 0).data().toString();
354 if (data.contains(_search_pattern, Qt::CaseInsensitive)) {
355 _search_current_id = i;
359 QModelIndex id = _model->index(_search_current_id, 0);
360 ui->listView->selectionModel()->clearSelection();
361 ui->listView->selectionModel()->select(id, QItemSelectionModel::Select);
362 ui->listView->scrollTo(id);
365 void LibraryForm::prevItem() {
366 QString data = _model->index(_search_current_id, 0).data().toString();
367 for (int i = _search_current_id-1; i >= 0; i--) {
368 data = _model->index(i, 0).data().toString();
369 if (data.contains(_search_pattern, Qt::CaseInsensitive)) {
370 _search_current_id = i;
374 QModelIndex id = _model->index(_search_current_id, 0);
375 ui->listView->selectionModel()->clearSelection();
376 ui->listView->selectionModel()->select(id, QItemSelectionModel::Select);
377 ui->listView->scrollTo(id);
380 void LibraryForm::cancelSearch() {
381 _search_pattern = "";
382 ui->listView->selectionModel()->clearSelection();
385 void LibraryForm::refresh() {
391 __fill_model(_model, _lib->getAlbumsForArtist(_current_artist));
399 case STATE_PLAYLIST_TRACK:
400 _current_playlist = _lib->getPlaylist(_current_playlist.name());
401 _current_tracks = _current_playlist.tracks();
402 __fill_model_tracks(_model, _current_tracks);
405 _current_tracks = _lib->getTracksForAlbum(_current_album, _current_artist);
406 __fill_model_tracks(_model, _current_tracks);
413 void LibraryForm::_toggle_select_all_button() {
414 if (ui->listView->selectionModel()->selectedIndexes().count() == ui->listView->model()->rowCount()) {
415 ui->listView->selectionModel()->clearSelection();
416 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
418 ui->listView->selectAll();
419 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
423 void LibraryForm::updateIcons() {
425 _icons_theme = config.getValue("ui/iconstheme").toString();
426 ui->backButton->setIcon(QIcon(":/icons/"+_icons_theme+"/back.png"));
427 if (ui->listView->selectionModel()->selectedIndexes().count() == ui->listView->model()->rowCount())
428 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
430 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
431 ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
432 ui->deleteButton->setIcon(QIcon(":/icons/"+_icons_theme+"/delete.png"));
433 ui->useButton->setIcon(QIcon(":/icons/"+_icons_theme+"/use.png"));
434 ui->playerButton->setIcon(QIcon(":/icons/"+_icons_theme+"/player.png"));
435 ui->viewButton->setIcon(QIcon(":/icons/"+_icons_theme+"/artists.png"));
436 ui->dynamicButton->setIcon(QIcon(":/icons/"+_icons_theme+"/dynamic.png"));
437 ui->playlistsButton->setIcon(QIcon(":/icons/"+_icons_theme+"/playlists.png"));