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>
32 #include <QMessageBox>
34 #include <QSpacerItem>
37 using namespace SomePlayer::DataObjects;
38 using namespace SomePlayer::Storage;
40 inline QString __format_track_string(TrackMetadata meta) {
41 int minutes = meta.length() / 60;
42 int seconds = meta.length() % 60;
43 QTime time(0, minutes, seconds);
44 return QString("[%1] %2").arg(time.toString("mm:ss")).arg(meta.title());
48 inline void __fill_model(QStandardItemModel *model, QList<QString> data, QString icons_theme) {
50 int count = data.count();
51 model->setRowCount(count);
52 for (int i = 0; i < count; i++) {
53 model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), ""));
54 model->setItem(i, 1, new QStandardItem(data.at(i)));
58 inline void __fill_model_album(QStandardItemModel *model, QMap<QString, int> data, QString icons_theme) {
60 int count = data.count();
61 model->setRowCount(count);
64 if (config.getValue("ui/albumsorting").toString() == "date") {
65 QMap<int, QList<QString> > years;
66 foreach (QString name, data.keys()) {
67 years[data[name]].append(name);
69 QList<int> keys = years.keys();
72 foreach (int year, keys) {
73 foreach (QString name, years[year]) {
74 model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), ""));
75 model->setItem(i, 1, new QStandardItem(QString("[%1] %2").arg(year).arg(name)));
80 QList<QString> names = data.keys();
81 foreach (QString name, names) {
82 model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), ""));
83 model->setItem(i, 1, new QStandardItem(QString("[%1] %2").arg(data[name]).arg(name)));
89 inline void __fill_model_tracks (QStandardItemModel *model, QList<Track> tracks, QString icons_theme) {
90 int count = tracks.count();
91 model->setRowCount(count);
93 bool show_lenght = (config.getValue("ui/showtracklenght").toString() != "no");
94 for (int i = 0; i < count; i++) {
95 TrackMetadata meta = tracks.at(i).metadata();
97 model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), ""));
98 model->setItem(i, 1, new QStandardItem(__format_track_string(meta)));
100 model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), ""));
101 model->setItem(i, 1, new QStandardItem(meta.title()));
106 LibraryForm::LibraryForm(Library *lib, QWidget *parent) :
108 ui(new Ui::LibraryForm)
112 _icons_theme = config.getValue("ui/iconstheme").toString();
113 _model = new QStandardItemModel(this);
114 _model->setColumnCount(2);
116 _tools_widget = new ToolsWidget(this);
117 _search_in_library_button = new QPushButton(QIcon(":/icons/"+_icons_theme+"/search.png"), "", _tools_widget);
118 _search_in_library_button->setFlat(true);
119 _search_in_library_button->setCheckable(true);
120 _tools_widget->layout()->addItem(new QSpacerItem(20, 20));
121 _tools_widget->layout()->addWidget(_search_in_library_button);
123 ui->listView->setModel(_model);
124 ui->listView->setColumnWidth(0, 70);
125 ui->toolsLayout->addWidget(_tools_widget);
126 _tools_widget->hideFSButton();
127 _tools_widget->hide();
128 connect(ui->viewButton, SIGNAL(clicked()), this, SLOT(_view_button()));
129 connect(ui->playlistsButton, SIGNAL(clicked()), this, SLOT(_playlists_button()));
130 connect(ui->dynamicButton, SIGNAL(clicked()), this, SLOT(_dynamic_button()));
131 connect(ui->listView, SIGNAL(clicked(QModelIndex)), this, SLOT(_process_list_click(QModelIndex)));
132 connect(ui->listView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(_process_dblclick(QModelIndex)));
133 connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
134 this, SLOT(_process_selection(QItemSelection,QItemSelection)));
135 connect(ui->addButton, SIGNAL(clicked()), this, SLOT(_add_button()));
136 connect(ui->selectAllButton, SIGNAL(clicked()), this, SLOT(_toggle_select_all_button()));
137 connect(ui->backButton, SIGNAL(clicked()), this, SLOT(_back_button()));
138 connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(_delete_button()));
139 connect(ui->useButton, SIGNAL(clicked()), this, SLOT(_use_button()));
140 connect(_tools_widget, SIGNAL(search(QString)), this, SLOT(search(QString)));
141 connect(_tools_widget, SIGNAL(nextSearch()), this, SLOT(nextItem()));
142 connect(_tools_widget, SIGNAL(prevSearch()), this, SLOT(prevItem()));
143 connect(ui->moreButton, SIGNAL(clicked()), this, SLOT(_more_button()));
144 connect(_search_in_library_button, SIGNAL(toggled(bool)), this, SLOT(_search_button(bool)));
145 connect(ui->playerButton, SIGNAL(clicked()), this, SLOT(hide()));
147 _top_gradient = ui->topWidget->styleSheet();
148 _bottom_gradient = ui->bottomWidget->styleSheet();
150 setAttribute(Qt::WA_Maemo5StackedWindow);
151 setWindowFlags(Qt::Window | windowFlags());
152 ui->addButton->setEnabled(false);
153 ui->addButton->setIcon(QIcon());
154 ui->deleteButton->setEnabled(false);
155 ui->deleteButton->setIcon(QIcon());
158 LibraryForm::~LibraryForm()
163 void LibraryForm::_view_button() {
164 QList<QString> artitst = _lib->getArtists();
165 __fill_model(_model, artitst, _icons_theme);
166 ui->listView->setColumnWidth(0, 70);
167 _state = STATE_ARTIST;
168 ui->backButton->setEnabled(false);
169 ui->backButton->setIcon(QIcon());
170 ui->listLabel->setText("Artists");
171 ui->useButton->setEnabled(false);
172 ui->useButton->setIcon(QIcon());
173 ui->addButton->setEnabled(false);
174 ui->addButton->setIcon(QIcon());
175 ui->deleteButton->setEnabled(false);
176 ui->deleteButton->setIcon(QIcon());
179 void LibraryForm::_dynamic_button() {
180 ui->useButton->setEnabled(false);
181 ui->useButton->setIcon(QIcon());
182 ui->backButton->setEnabled(false);
183 ui->backButton->setIcon(QIcon());
184 ui->deleteButton->setEnabled(false);
185 ui->deleteButton->setIcon(QIcon());
187 _model->setRowCount(4);
188 _model->setItem(0, 0, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"), ""));
189 _model->setItem(0, 1, new QStandardItem("Favorites"));
190 _model->setItem(1, 0, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"), ""));
191 _model->setItem(1, 1, new QStandardItem("Most played"));
192 _model->setItem(2, 0, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"), ""));
193 _model->setItem(2, 1, new QStandardItem("Never played"));
194 _model->setItem(3, 0, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"), ""));
195 _model->setItem(3, 1, new QStandardItem("Recently added"));
196 ui->listView->setColumnWidth(0, 70);
197 ui->listLabel->setText("Dynamic playlists");
198 _state = STATE_DYNAMIC;
199 ui->addButton->setEnabled(false);
200 ui->addButton->setIcon(QIcon());
201 ui->deleteButton->setEnabled(false);
202 ui->deleteButton->setIcon(QIcon());
205 void LibraryForm::_process_list_click(QModelIndex index) {
206 if (index.column() == 0) {
209 if (_state == STATE_NONE) return;
210 QString data = index.data().toString();
211 QRegExp regexp("\\[\\d+\\]\\ (.*)");
214 __fill_model_album(_model, _lib->getAlbumsForArtist(data), _icons_theme);
215 ui->listView->setColumnWidth(0, 70);
216 ui->listView->scrollToTop();
217 _current_artist = data;
218 _state = STATE_ALBUM;
219 ui->backButton->setEnabled(true);
220 ui->backButton->setIcon(QIcon(":/icons/"+_icons_theme+"/back.png"));
221 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
224 if (regexp.indexIn(data) != -1) {
225 _current_album = regexp.cap(1).trimmed();
226 _current_tracks = _lib->getTracksForAlbum(_current_album, _current_artist);
227 __fill_model_tracks(_model, _current_tracks, _icons_theme);
228 ui->listView->setColumnWidth(0, 70);
229 ui->listView->scrollToTop();
230 _state = STATE_TRACK;
231 ui->backButton->setEnabled(true);
232 ui->backButton->setIcon(QIcon(":/icons/"+_icons_theme+"/back.png"));
233 ui->listLabel->setText(QString("Tracks from \"%1\" by \"%2\"").arg(_current_album).arg(_current_artist));
238 _current_playlist = _lib->getPlaylist(data);
239 _current_tracks = _current_playlist.tracks();
240 __fill_model_tracks(_model, _current_tracks, _icons_theme);
241 ui->listView->setColumnWidth(0, 70);
242 ui->listView->scrollToTop();
243 _state = STATE_PLAYLIST_TRACK;
245 ui->backButton->setEnabled(true);
246 ui->backButton->setIcon(QIcon(":/icons/"+_icons_theme+"/back.png"));
247 ui->useButton->setEnabled(true);
248 ui->useButton->setIcon(QIcon(":/icons/"+_icons_theme+"/use.png"));
249 ui->listLabel->setText(QString("Tracks in playlist \"%1\"").arg(data));
254 switch(index.row()) {
256 _current_playlist = _lib->getFavorites();
258 case 1: //most played
259 _current_playlist = _lib->getMostPlayed();
261 case 2: //never played
262 _current_playlist = _lib->getNeverPlayed();
263 case 3: //recently added
264 _current_playlist = _lib->getRecentlyAdded();
269 _current_tracks = _current_playlist.tracks();
270 __fill_model_tracks(_model, _current_tracks, _icons_theme);
271 ui->listView->setColumnWidth(0, 70);
272 ui->listView->scrollToTop();
273 _state = STATE_PLAYLIST_TRACK;
275 ui->backButton->setEnabled(true);
276 ui->backButton->setIcon(QIcon(":/icons/"+_icons_theme+"/back.png"));
277 ui->useButton->setEnabled(true);
278 ui->useButton->setIcon(QIcon(":/icons/"+_icons_theme+"/use.png"));
279 ui->listLabel->setText(_current_playlist.name());
284 ui->addButton->setEnabled(false);
285 ui->addButton->setIcon(QIcon());
286 ui->deleteButton->setEnabled(false);
287 ui->deleteButton->setIcon(QIcon());
288 QTimer::singleShot(100, ui->listView, SLOT(clearSelection())); // workaround
291 void LibraryForm::_add_button() {
292 if (_state == STATE_NONE) return;
293 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
294 ui->listView->selectionModel()->clearSelection();
295 Playlist cur = _lib->getCurrentPlaylist();
296 QRegExp regexp("\\[\\d+\\]\\ (.*)");
299 foreach (QModelIndex id, selected) {
300 _add_artist(&cur, id.data().toString());
302 _lib->saveCurrentPlaylist(cur);
303 emit refreshPlayer();
306 foreach (QModelIndex id, selected) {
307 if (regexp.indexIn(id.data().toString()) != -1) {
308 _add_album(&cur, _current_artist, regexp.cap(1).trimmed());
311 _lib->saveCurrentPlaylist(cur);
312 emit refreshPlayer();
315 foreach (QModelIndex id, selected) {
316 _add_track(&cur, _current_tracks.at(id.row()));
318 _lib->saveCurrentPlaylist(cur);
319 emit refreshPlayer();
322 foreach (QModelIndex id, selected) {
323 _add_playlist(&cur, id.data().toString());
325 _lib->saveCurrentPlaylist(cur);
326 emit refreshPlayer();
328 case STATE_PLAYLIST_TRACK:
329 foreach (QModelIndex id, selected) {
330 _add_track(&cur, _current_tracks.at(id.row()));
332 _lib->saveCurrentPlaylist(cur);
333 emit refreshPlayer();
336 foreach (QModelIndex id, selected) {
337 _add_track(&cur, _current_tracks.at(id.row()));
339 _lib->saveCurrentPlaylist(cur);
340 emit refreshPlayer();
348 void LibraryForm::_add_artist(Playlist *cur, QString artist) {
349 QMap<QString, int> albums = _lib->getAlbumsForArtist(artist);
350 foreach(QString album, albums.keys()) {
351 _add_album(cur, artist, album);
355 void LibraryForm::_add_album(Playlist *cur, QString artist, QString album) {
356 QList<Track> tracks = _lib->getTracksForAlbum(album, artist);
357 foreach(Track track, tracks) {
358 _add_track(cur, track);
362 void LibraryForm::_add_track(Playlist *cur, Track track) {
363 cur->addTrack(track);
366 void LibraryForm::_add_playlist(Playlist *cur, QString name) {
367 Playlist playlist = _lib->getPlaylist(name);
368 QList<Track> tracks = playlist.tracks();
369 foreach (Track track, tracks) {
370 _add_track(cur, track);
374 void LibraryForm::_back_button() {
378 ui->listView->scrollToTop();
381 __fill_model_album(_model, _lib->getAlbumsForArtist(_current_artist), _icons_theme);
382 ui->listView->setColumnWidth(0, 70);
383 ui->listView->scrollToTop();
384 _state = STATE_ALBUM;
385 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
387 case STATE_PLAYLIST_TRACK:
394 ui->listView->scrollToTop();
400 void LibraryForm::_playlists_button() {
401 QList<QString> playlists = _lib->getPlaylistsNames();
402 __fill_model(_model, playlists, _icons_theme);
403 ui->listView->setColumnWidth(0, 70);
404 _state = STATE_PLAYLIST;
405 ui->backButton->setEnabled(false);
406 ui->backButton->setIcon(QIcon());
407 ui->listLabel->setText("Playlists");
408 ui->useButton->setEnabled(false);
409 ui->useButton->setIcon(QIcon());
410 ui->addButton->setEnabled(false);
411 ui->addButton->setIcon(QIcon());
412 ui->deleteButton->setEnabled(false);
413 ui->deleteButton->setIcon(QIcon());
416 void LibraryForm::_delete_button() {
417 if (_state == STATE_PLAYLIST_TRACK) {
418 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
419 ui->listView->selectionModel()->clearSelection();
420 QQueue<int> to_delete;
421 foreach (QModelIndex id, selected) {
422 if (!to_delete.contains(id.row()))
423 to_delete.append(id.row());
426 int count = to_delete.count();
427 for (int i = count-1; i >= 0; i--) {
428 _current_playlist.removeTrackAt(to_delete.at(i));
430 _current_tracks = _current_playlist.tracks();
431 _lib->savePlaylist(_current_playlist);
432 emit refreshPlayer();
433 __fill_model_tracks(_model, _current_tracks, _icons_theme);
434 ui->listView->setColumnWidth(0, 70);
435 } else if (_state == STATE_PLAYLIST) {
436 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
437 QQueue<int> to_delete;
438 foreach (QModelIndex id, selected) {
439 if (!to_delete.contains(id.row()))
440 to_delete.append(id.row());
443 int count = to_delete.count();
444 for (int i = count-1; i >= 0; i--) {
445 QString name = _model->item(to_delete.at(i), 1)->text();
446 if (name != _CURRENT_PLAYLIST_SUBST_) {
447 _lib->removePlaylist(name);
448 _model->removeRow(to_delete.at(i));
454 void LibraryForm::_delete_track(Track track) {
455 Playlist current = _lib->getCurrentPlaylist();
456 current.removeTrack(track);
457 _lib->saveCurrentPlaylist(current);
458 emit refreshPlayer();
461 void LibraryForm::_use_button() {
462 _lib->saveCurrentPlaylist(_current_playlist);
463 emit refreshPlayer();
464 _current_playlist = _lib->getCurrentPlaylist();
467 void LibraryForm::search(QString pattern) {
468 _search_pattern = pattern;
469 _search_current_id = -1;
473 void LibraryForm::nextItem() {
474 QString data = _model->index(_search_current_id, 0).data().toString();
475 for (int i = _search_current_id+1; i < _model->rowCount(); i++) {
476 data = _model->index(i, 1).data().toString();
477 if (data.contains(_search_pattern, Qt::CaseInsensitive)) {
478 _search_current_id = i;
482 QModelIndex id = _model->index(_search_current_id, 1);
483 ui->listView->selectionModel()->clearSelection();
484 ui->listView->selectRow(id.row());
485 ui->listView->scrollTo(id);
488 void LibraryForm::prevItem() {
489 QString data = _model->index(_search_current_id, 0).data().toString();
490 for (int i = _search_current_id-1; i >= 0; i--) {
491 data = _model->index(i, 1).data().toString();
492 if (data.contains(_search_pattern, Qt::CaseInsensitive)) {
493 _search_current_id = i;
497 QModelIndex id = _model->index(_search_current_id, 1);
498 ui->listView->selectionModel()->clearSelection();
499 ui->listView->selectRow(id.row());
500 ui->listView->scrollTo(id);
503 void LibraryForm::cancelSearch() {
504 _search_pattern = "";
505 ui->listView->selectionModel()->clearSelection();
508 void LibraryForm::refresh() {
514 __fill_model_album(_model, _lib->getAlbumsForArtist(_current_artist), _icons_theme);
515 ui->listView->setColumnWidth(0, 70);
523 case STATE_PLAYLIST_TRACK:
524 _current_playlist = _lib->getPlaylist(_current_playlist.name());
525 _current_tracks = _current_playlist.tracks();
526 __fill_model_tracks(_model, _current_tracks, _icons_theme);
527 ui->listView->setColumnWidth(0, 70);
530 _current_tracks = _lib->getTracksForAlbum(_current_album, _current_artist);
531 __fill_model_tracks(_model, _current_tracks, _icons_theme);
538 void LibraryForm::_toggle_select_all_button() {
539 if (ui->listView->selectionModel()->selectedIndexes().count() == _model->rowCount() * _model->columnCount()) {
540 ui->listView->selectionModel()->clearSelection();
541 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
543 disconnect(ui->listView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
544 this, SLOT(_process_selection(QItemSelection,QItemSelection)));
545 ui->listView->selectAll();
546 int cnt = _model->rowCount();
547 for (int i = 0; i < cnt; i++) {
548 _model->item(i)->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
550 connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
551 this, SLOT(_process_selection(QItemSelection,QItemSelection)));
552 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
553 ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
554 ui->addButton->setEnabled(true);
558 void LibraryForm::landscapeMode() {
560 ui->topWidget->hide();
561 ui->bottomWidget->hide();
563 ui->lverticalLayout->removeItem(ui->lverticalSpacer_0);
564 ui->lverticalLayout->removeItem(ui->lverticalSpacer_1);
565 ui->lverticalLayout->removeItem(ui->lverticalSpacer_2);
566 ui->lverticalLayout->removeItem(ui->lverticalSpacer_3);
567 ui->lverticalLayout->addWidget(ui->backButton);
568 ui->lverticalLayout->addItem(ui->lverticalSpacer_0);
569 ui->lverticalLayout->addWidget(ui->addButton);
570 ui->lverticalLayout->addItem(ui->lverticalSpacer_1);
571 ui->lverticalLayout->addWidget(ui->deleteButton);
572 ui->lverticalLayout->addItem(ui->lverticalSpacer_2);
573 ui->lverticalLayout->addWidget(ui->useButton);
574 ui->lverticalLayout->addItem(ui->lverticalSpacer_3);
575 ui->lverticalLayout->addWidget(ui->playerButton);
577 ui->rverticalLayout->removeItem(ui->rverticalSpacer_0);
578 ui->rverticalLayout->removeItem(ui->rverticalSpacer_1);
579 ui->rverticalLayout->removeItem(ui->rverticalSpacer_2);
580 ui->rverticalLayout->removeItem(ui->rverticalSpacer_3);
581 ui->rverticalLayout->addWidget(ui->moreButton);
582 ui->rverticalLayout->addItem(ui->rverticalSpacer_0);
583 ui->rverticalLayout->addWidget(ui->selectAllButton);
584 ui->rverticalLayout->addItem(ui->rverticalSpacer_1);
585 ui->rverticalLayout->addWidget(ui->viewButton);
586 ui->rverticalLayout->addItem(ui->rverticalSpacer_2);
587 ui->rverticalLayout->addWidget(ui->dynamicButton);
588 ui->rverticalLayout->addItem(ui->rverticalSpacer_3);
589 ui->rverticalLayout->addWidget(ui->playlistsButton);
591 if (_tools_widget->isVisible()) {
592 ui->moreButton->setIcon(QIcon(":/icons/"+_icons_theme+"/more_l.png"));
594 ui->moreButton->setIcon(QIcon(":/icons/"+_icons_theme+"/unmore_l.png"));
598 void LibraryForm::portraitMode() {
601 ui->topWidget->show();
602 ui->bottomWidget->show();
604 ui->lverticalLayout->removeItem(ui->lverticalSpacer_0);
605 ui->lverticalLayout->removeItem(ui->lverticalSpacer_1);
606 ui->lverticalLayout->removeItem(ui->lverticalSpacer_2);
607 ui->lverticalLayout->removeItem(ui->lverticalSpacer_3);
609 ui->rverticalLayout->removeItem(ui->rverticalSpacer_0);
610 ui->rverticalLayout->removeItem(ui->rverticalSpacer_1);
611 ui->rverticalLayout->removeItem(ui->rverticalSpacer_2);
612 ui->rverticalLayout->removeItem(ui->rverticalSpacer_3);
614 ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_0);
615 ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_1);
616 ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_2);
617 ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_3);
618 ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_4);
619 ui->topWidget->layout()->addWidget(ui->backButton);
620 ui->topWidget->layout()->addItem(ui->thorizontalSpacer_0);
621 ui->topWidget->layout()->addWidget(ui->deleteButton);
622 ui->topWidget->layout()->addItem(ui->thorizontalSpacer_1);
623 ui->topWidget->layout()->addWidget(ui->addButton);
624 ui->topWidget->layout()->addItem(ui->thorizontalSpacer_2);
625 ui->topWidget->layout()->addWidget(ui->useButton);
626 ui->topWidget->layout()->addItem(ui->thorizontalSpacer_3);
627 ui->topWidget->layout()->addWidget(ui->selectAllButton);
628 ui->topWidget->layout()->addItem(ui->thorizontalSpacer_4);
629 ui->topWidget->layout()->addWidget(ui->moreButton);
631 ui->bottomWidget->layout()->removeItem(ui->bhorizontalSpacer_0);
632 ui->bottomWidget->layout()->removeItem(ui->bhorizontalSpacer_1);
633 ui->bottomWidget->layout()->removeItem(ui->bhorizontalSpacer_2);
634 ui->bottomWidget->layout()->addWidget(ui->playerButton);
635 ui->bottomWidget->layout()->addItem(ui->bhorizontalSpacer_0);
636 ui->bottomWidget->layout()->addWidget(ui->viewButton);
637 ui->bottomWidget->layout()->addItem(ui->bhorizontalSpacer_1);
638 ui->bottomWidget->layout()->addWidget(ui->dynamicButton);
639 ui->bottomWidget->layout()->addItem(ui->bhorizontalSpacer_2);
640 ui->bottomWidget->layout()->addWidget(ui->playlistsButton);
642 if (_tools_widget->isVisible()) {
643 ui->moreButton->setIcon(QIcon(":/icons/"+_icons_theme+"/unmore.png"));
645 ui->moreButton->setIcon(QIcon(":/icons/"+_icons_theme+"/more.png"));
649 void LibraryForm::_more_button() {
650 if (_tools_widget->isVisible()) {
651 ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/unmore_l.png" : ":/icons/"+_icons_theme+"/more.png"));
652 _tools_widget->hide();
653 _tools_widget->reset();
656 ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/more_l.png" : ":/icons/"+_icons_theme+"/unmore.png"));
657 _tools_widget->show();
658 _tools_widget->setFocus();
663 void LibraryForm::updateIcons() {
665 _icons_theme = config.getValue("ui/iconstheme").toString();
666 _tools_widget->updateIcons();
667 if (!ui->addButton->icon().isNull()) {
668 ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
670 if (!ui->deleteButton->icon().isNull()) {
671 ui->deleteButton->setIcon(QIcon(":/icons/"+_icons_theme+"/delete.png"));
673 if (!ui->useButton->icon().isNull()) {
674 ui->useButton->setIcon(QIcon(":/icons/"+_icons_theme+"/use.png"));
676 if (!ui->backButton->icon().isNull()) {
677 ui->backButton->setIcon(QIcon(":/icons/"+_icons_theme+"/back.png"));
679 if (!ui->dynamicButton->icon().isNull()) {
680 ui->dynamicButton->setIcon(QIcon(":/icons/"+_icons_theme+"/dynamic.png"));
682 if (_tools_widget->isVisible()) {
683 ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/more_l.png" : ":/icons/"+_icons_theme+"/unmore.png"));
685 ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/unmore_l.png" : ":/icons/"+_icons_theme+"/more.png"));
687 if (!ui->playlistsButton->icon().isNull()) {
688 ui->playlistsButton->setIcon(QIcon(":/icons/"+_icons_theme+"/playlists.png"));
690 ui->playerButton->setIcon(QIcon(":/icons/"+_icons_theme+"/player.png"));
691 if (!ui->viewButton->icon().isNull()) {
692 ui->viewButton->setIcon(QIcon(":/icons/"+_icons_theme+"/artists.png"));
694 if (ui->listView->selectionModel()->selectedRows().count() == _model->rowCount()) {
695 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
697 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
699 _search_in_library_button->setIcon(QIcon(":/icons/"+_icons_theme+"/search.png"));
703 void LibraryForm::checkGradient() {
705 if (config.getValue("ui/gradient").toString() == "yes") {
706 ui->bottomWidget->setStyleSheet(_bottom_gradient);
707 ui->topWidget->setStyleSheet(_top_gradient);
709 ui->topWidget->setStyleSheet("");
710 ui->bottomWidget->setStyleSheet("");
714 void LibraryForm::_process_selection(QItemSelection selected, QItemSelection deselected) {
715 foreach (QModelIndex id, selected.indexes()) {
716 if (id.column() == 0) {
717 _model->item(id.row())->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
719 ui->listView->selectionModel()->select(id, QItemSelectionModel::Select);
721 foreach (QModelIndex id, deselected.indexes()) {
722 if (id.column() == 0) {
723 _model->item(id.row())->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
725 ui->listView->selectionModel()->select(id, QItemSelectionModel::Deselect);
727 if (ui->listView->selectionModel()->selectedRows().count() > 0) {
728 ui->addButton->setEnabled(true);
729 ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
730 if (_state == STATE_PLAYLIST || (_state == STATE_PLAYLIST_TRACK && !_is_dynamic)) {
731 ui->deleteButton->setEnabled(true);
732 ui->deleteButton->setIcon(QIcon(":/icons/"+_icons_theme+"/delete.png"));
735 ui->addButton->setEnabled(false);
736 ui->addButton->setIcon(QIcon());
737 ui->deleteButton->setEnabled(false);
738 ui->deleteButton->setIcon(QIcon());
742 void LibraryForm::_process_dblclick(QModelIndex id) {
743 if (id.column() == 0)
745 if (_state == STATE_TRACK || _state == STATE_PLAYLIST_TRACK || _state == STATE_SEARCH) {
746 Playlist cur = _lib->getCurrentPlaylist();
747 Track track = _current_tracks.at(id.row());
749 _lib->saveCurrentPlaylist(cur);
750 emit refreshPlayer();
751 emit addAndPlay(track);
752 ui->listView->clearSelection();
756 void LibraryForm::_search_button(bool state) {
757 ui->moreButton->setEnabled(!state);
758 _tools_widget->toggleArrows(!state);
759 ui->backButton->setEnabled(!state);
760 ui->backButton->setIcon(state ? QIcon() : QIcon(":/icons/"+_icons_theme+"/back.png"));
761 _tools_widget->setFocus();
762 _tools_widget->reset();
764 ui->listLabel->setText("Search in library");
765 ui->deleteButton->setIcon(QIcon());
766 ui->deleteButton->setEnabled(false);
767 ui->useButton->setIcon(QIcon());
768 ui->useButton->setEnabled(false);
769 ui->viewButton->setIcon(QIcon());
770 ui->viewButton->setEnabled(false);
771 ui->dynamicButton->setIcon(QIcon());
772 ui->dynamicButton->setEnabled(false);
773 ui->playlistsButton->setIcon(QIcon());
774 ui->playlistsButton->setEnabled(false);
775 disconnect(_tools_widget, SIGNAL(search(QString)), this, SLOT(search(QString)));
776 connect(_tools_widget, SIGNAL(search(QString)), this, SLOT(_search_in_library(QString)));
778 _state = STATE_SEARCH;
780 ui->viewButton->setIcon(QIcon(":/icons/"+_icons_theme+"/artists.png"));
781 ui->viewButton->setEnabled(true);
782 ui->dynamicButton->setIcon(QIcon(":/icons/"+_icons_theme+"/dynamic.png"));
783 ui->dynamicButton->setEnabled(true);
784 ui->playlistsButton->setIcon(QIcon(":/icons/"+_icons_theme+"/playlists.png"));
785 ui->playlistsButton->setEnabled(true);
787 connect(_tools_widget, SIGNAL(search(QString)), this, SLOT(search(QString)));
788 disconnect(_tools_widget, SIGNAL(search(QString)), this, SLOT(_search_in_library(QString)));
792 void LibraryForm::_search_in_library(QString pattern) {
793 pattern = pattern.trimmed();
794 if (pattern.isEmpty()) {
798 _current_tracks = _lib->search(pattern);
799 __fill_model_tracks(_model, _current_tracks, _icons_theme);
800 ui->listView->setColumnWidth(0, 70);
801 ui->listView->scrollToTop();