257e3b05cc1b4e3a8bdc1ba13bca787831bf5276
[someplayer] / src / libraryform.cpp
1 /*
2  * SomePlayer - An alternate music player for Maemo 5
3  * Copyright (C) 2010 Nikolay (somebody) Tischenko <niktischenko@gmail.com>
4  *
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.
9  *
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.
14  *
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.
18  */
19
20 #include "libraryform.h"
21 #include "ui_libraryform.h"
22 #include "library.h"
23 #include <QStandardItemModel>
24 #include <QStandardItem>
25 #include <QModelIndex>
26 #include <QModelIndexList>
27 #include "track.h"
28 #include "playlist.h"
29 #include <QTime>
30 #include <QTimer>
31 #include <QQueue>
32 #include <QMessageBox>
33 #include "config.h"
34 #include <QSpacerItem>
35 #include <QDebug>
36
37 using namespace SomePlayer::DataObjects;
38 using namespace SomePlayer::Storage;
39
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());
45
46 }
47
48 inline void __fill_model(QStandardItemModel *model, QList<QString> data, QString icons_theme) {
49         model->clear();
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)));
55         }
56 }
57
58 inline void __fill_model_album(QStandardItemModel *model, QMap<QString, int> data, QString icons_theme) {
59         model->clear();
60         int count = data.count();
61         model->setRowCount(count);
62         QMap<int, QList<QString> > years;
63         foreach (QString name, data.keys()) {
64                 years[data[name]].append(name);
65         }
66         QList<int> keys = years.keys();
67         qSort(keys);
68
69         int i = 0;
70         foreach (int year, keys) {
71                 foreach (QString name, years[year]) {
72                         model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), ""));
73                         model->setItem(i, 1, new QStandardItem(QString("[%1] %2").arg(year).arg(name)));
74                         i++;
75                 }
76         }
77 }
78
79 inline void __fill_model_tracks (QStandardItemModel *model, QList<Track> tracks, QString icons_theme) {
80         int count = tracks.count();
81         model->setRowCount(count);
82         Config config;
83         bool show_lenght = (config.getValue("ui/showtracklenght").toString() != "no");
84         for (int i = 0; i < count; i++) {
85                 TrackMetadata meta = tracks.at(i).metadata();
86                 if (show_lenght) {
87                         model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), ""));
88                         model->setItem(i, 1, new QStandardItem(__format_track_string(meta)));
89                 } else {
90                         model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), ""));
91                         model->setItem(i, 1, new QStandardItem(meta.title()));
92                 }
93         }
94 }
95
96 LibraryForm::LibraryForm(Library *lib, QWidget *parent) :
97     QWidget(parent),
98     ui(new Ui::LibraryForm)
99 {
100         _lib = lib;
101         Config config;
102         _icons_theme = config.getValue("ui/iconstheme").toString();
103         _model = new QStandardItemModel(this);
104         _model->setColumnCount(2);
105         _state = STATE_NONE;
106         _tools_widget = new ToolsWidget(this);
107         ui->setupUi(this);
108         ui->listView->setModel(_model);
109         ui->listView->setColumnWidth(0, 70);
110         ui->toolsLayout->addWidget(_tools_widget);
111         _tools_widget->hide();
112         connect(ui->playerButton, SIGNAL(clicked()), this, SLOT(_player()));
113         connect(ui->viewButton, SIGNAL(clicked()), this, SLOT(_view_button()));
114         connect(ui->playlistsButton, SIGNAL(clicked()), this, SLOT(_playlists_button()));
115         connect(ui->dynamicButton, SIGNAL(clicked()), this, SLOT(_dynamic_button()));
116         connect(ui->listView, SIGNAL(clicked(QModelIndex)), this, SLOT(_process_list_click(QModelIndex)));
117         connect(ui->listView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(_process_dblclick(QModelIndex)));
118         connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
119                 this, SLOT(_process_selection(QItemSelection,QItemSelection)));
120         connect(ui->addButton, SIGNAL(clicked()), this, SLOT(_add_button()));
121         connect(ui->selectAllButton, SIGNAL(clicked()), this, SLOT(_toggle_select_all_button()));
122         connect(ui->backButton, SIGNAL(clicked()), this, SLOT(_back_button()));
123         connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(_delete_button()));
124         connect(ui->useButton, SIGNAL(clicked()), this, SLOT(_use_button()));
125         connect(_tools_widget, SIGNAL(search(QString)), this, SLOT(search(QString)));
126         connect(_tools_widget, SIGNAL(nextSearch()), this, SLOT(nextItem()));
127         connect(_tools_widget, SIGNAL(prevSearch()), this, SLOT(prevItem()));
128         connect(_tools_widget, SIGNAL(toggleFullscreen(bool)), this, SIGNAL(fullscreen(bool)));
129         connect(ui->moreButton, SIGNAL(clicked()), this, SLOT(_more_button()));
130         _view_button();
131         _current_playlist_changed = true;
132         _top_gradient = ui->topWidget->styleSheet();
133         _bottom_gradient = ui->bottomWidget->styleSheet();
134 }
135
136 LibraryForm::~LibraryForm()
137 {
138         _lib->saveCurrentPlaylist(_lib->getCurrentPlaylist()); // wtf?
139         _current_playlist_changed = true;
140         delete ui;
141 }
142
143 void LibraryForm::_player() {
144         emit player(_current_playlist_changed);
145         _current_playlist_changed = false;
146 }
147
148 void LibraryForm::_view_button() {
149         QList<QString> artitst = _lib->getArtists();
150         __fill_model(_model, artitst, _icons_theme);
151         ui->listView->setColumnWidth(0, 70);
152         _state = STATE_ARTIST;
153         ui->backButton->setEnabled(false);
154         ui->listLabel->setText("Artists");
155         ui->addButton->setEnabled(true);
156         ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
157         ui->deleteButton->setEnabled(false);
158         ui->deleteButton->setIcon(QIcon());
159         ui->useButton->setEnabled(false);
160         ui->useButton->setIcon(QIcon());
161 }
162
163 void LibraryForm::_dynamic_button() {
164         ui->useButton->setEnabled(false);
165         ui->useButton->setIcon(QIcon());
166         ui->backButton->setEnabled(false);
167         ui->addButton->setEnabled(true);
168         ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
169         ui->deleteButton->setEnabled(false);
170         ui->deleteButton->setIcon(QIcon());
171         _model->clear();
172         _model->setRowCount(4);
173         _model->setItem(0, 0, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"), ""));
174         _model->setItem(0, 1, new QStandardItem("Favorites"));
175         _model->setItem(1, 0, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"), ""));
176         _model->setItem(1, 1, new QStandardItem("Most played"));
177         _model->setItem(2, 0, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"), ""));
178         _model->setItem(2, 1, new QStandardItem("Never played"));
179         _model->setItem(3, 0, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"), ""));
180         _model->setItem(3, 1, new QStandardItem("Recently added"));
181         ui->listView->setColumnWidth(0, 70);
182         ui->listLabel->setText("Dynamic playlists");
183         _state = STATE_DYNAMIC;
184 }
185
186 void LibraryForm::_process_list_click(QModelIndex index) {
187         if (index.column() == 0) {
188                 return;
189         }
190         if (_state == STATE_NONE) return;
191         QString data = index.data().toString();
192         QRegExp regexp("\\[\\d+\\]\\ (.*)");
193         switch (_state) {
194         case STATE_ARTIST:
195                 __fill_model_album(_model, _lib->getAlbumsForArtist(data), _icons_theme);
196                 ui->listView->setColumnWidth(0, 70);
197                 ui->listView->scrollToTop();
198                 _current_artist = data;
199                 _state = STATE_ALBUM;
200                 ui->backButton->setEnabled(true);
201                 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
202                 break;
203         case STATE_ALBUM:
204                 if (regexp.indexIn(data) != -1) {
205                         _current_album = regexp.cap(1).trimmed();
206                         _current_tracks = _lib->getTracksForAlbum(_current_album, _current_artist);
207                         __fill_model_tracks(_model, _current_tracks, _icons_theme);
208                         ui->listView->setColumnWidth(0, 70);
209                         ui->listView->scrollToTop();
210                         _state = STATE_TRACK;
211                         ui->backButton->setEnabled(true);
212                         ui->listLabel->setText(QString("Tracks from \"%1\" by \"%2\"").arg(_current_album).arg(_current_artist));
213                 }
214                 break;
215         case STATE_PLAYLIST:
216                 {
217                         _current_playlist = _lib->getPlaylist(data);
218                         _current_tracks = _current_playlist.tracks();
219                         __fill_model_tracks(_model, _current_tracks, _icons_theme);
220                         ui->listView->setColumnWidth(0, 70);
221                         ui->listView->scrollToTop();
222                         _state = STATE_PLAYLIST_TRACK;
223                         ui->backButton->setEnabled(true);
224                         ui->deleteButton->setEnabled(true);
225                         ui->deleteButton->setIcon(QIcon(":/icons/"+_icons_theme+"/delete.png"));
226                         ui->useButton->setEnabled(true);
227                         ui->useButton->setIcon(QIcon(":/icons/"+_icons_theme+"/use.png"));
228                         ui->listLabel->setText(QString("Tracks in playlist \"%1\"").arg(data));
229                 }
230                 break;
231         case STATE_DYNAMIC:
232                 {
233                         switch(index.row()) {
234                         case 0: //favorites
235                                 _current_playlist = _lib->getFavorites();
236                                 break;
237                         case 1: //most played
238                                 _current_playlist = _lib->getMostPlayed();
239                                 break;
240                         case 2: //never played
241                                 _current_playlist = _lib->getNeverPlayed();
242                         case 3: //recently added
243                                 _current_playlist = _lib->getRecentlyAdded();
244                                 break;
245                         default:
246                                 return;
247                         }
248                         _current_tracks = _current_playlist.tracks();
249                         __fill_model_tracks(_model, _current_tracks, _icons_theme);
250                         ui->listView->setColumnWidth(0, 70);
251                         ui->listView->scrollToTop();
252                         _state = STATE_PLAYLIST_TRACK;
253                         _is_dynamic = true;
254                         ui->backButton->setEnabled(true);
255                         ui->useButton->setEnabled(true);
256                         ui->useButton->setIcon(QIcon(":/icons/"+_icons_theme+"/use.png"));
257                         ui->addButton->setEnabled(true);
258                         ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
259                         ui->listLabel->setText(_current_playlist.name());
260                 }
261         default:
262                 return;
263         }
264         QTimer::singleShot(100, ui->listView, SLOT(clearSelection())); // workaround
265 }
266
267 void LibraryForm::_add_button() {
268         if (_state == STATE_NONE) return;
269         QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
270         ui->listView->selectionModel()->clearSelection();
271         emit busy(QString("<H1>Adding... Please wait</H1>"));
272         Playlist cur = _lib->getCurrentPlaylist();
273         switch (_state) {
274         case STATE_ARTIST:
275                 foreach (QModelIndex id, selected) {
276                         _add_artist(&cur, id.data().toString());
277                 }
278                 _lib->saveCurrentPlaylist(cur);
279                 _current_playlist_changed = true;
280                 break;
281         case STATE_ALBUM:
282                 foreach (QModelIndex id, selected) {
283                         _add_album(&cur, _current_artist, id.data().toString());
284                 }
285                 _lib->saveCurrentPlaylist(cur);
286                 _current_playlist_changed = true;
287                 break;
288         case STATE_TRACK:
289                 foreach (QModelIndex id, selected) {
290                         _add_track(&cur, _current_tracks.at(id.row()));
291                 }
292                 _lib->saveCurrentPlaylist(cur);
293                 _current_playlist_changed = true;
294                 break;
295         case STATE_PLAYLIST:
296                 foreach (QModelIndex id, selected) {
297                         _add_playlist(&cur, id.data().toString());
298                 }
299                 _lib->saveCurrentPlaylist(cur);
300                 _current_playlist_changed = true;
301                 break;
302         case STATE_PLAYLIST_TRACK:
303                 foreach (QModelIndex id, selected) {
304                         _add_track(&cur, _current_tracks.at(id.row()));
305                 }
306                 _lib->saveCurrentPlaylist(cur);
307                 _current_playlist_changed = true;
308                 break;
309         default:
310                 emit done();
311                 return;
312         }
313         emit done();
314 }
315
316
317 void LibraryForm::_add_artist(Playlist *cur, QString artist) {
318         QMap<QString, int> albums = _lib->getAlbumsForArtist(artist);
319         foreach(QString album, albums.keys()) {
320                 _add_album(cur, artist, album);
321         }
322 }
323
324 void LibraryForm::_add_album(Playlist *cur, QString artist, QString album) {
325         QList<Track> tracks = _lib->getTracksForAlbum(album, artist);
326         foreach(Track track, tracks) {
327                 _add_track(cur, track);
328         }
329 }
330
331 void LibraryForm::_add_track(Playlist *cur, Track track) {
332         cur->addTrack(track);
333 }
334
335 void LibraryForm::_add_playlist(Playlist *cur, QString name) {
336         Playlist playlist = _lib->getPlaylist(name);
337         QList<Track> tracks = playlist.tracks();
338         foreach (Track track, tracks) {
339                 _add_track(cur, track);
340         }
341 }
342
343 void LibraryForm::_back_button() {
344         switch (_state) {
345         case STATE_ALBUM:
346                 _view_button();
347                 ui->listView->scrollToTop();
348                 break;
349         case STATE_TRACK:
350                 __fill_model_album(_model, _lib->getAlbumsForArtist(_current_artist), _icons_theme);
351                 ui->listView->setColumnWidth(0, 70);
352                 ui->listView->scrollToTop();
353                 _state = STATE_ALBUM;
354                 ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
355                 break;
356         case STATE_PLAYLIST_TRACK:
357                 if (_is_dynamic) {
358                         _dynamic_button();
359                         _is_dynamic = false;
360                 } else {
361                         _playlists_button();
362                 }
363                 ui->listView->scrollToTop();
364         default:
365                 return;
366         }
367 }
368
369 void LibraryForm::_playlists_button() {
370         QList<QString> playlists = _lib->getPlaylistsNames();
371         __fill_model(_model, playlists, _icons_theme);
372         ui->listView->setColumnWidth(0, 70);
373         _state = STATE_PLAYLIST;
374         ui->backButton->setEnabled(false);
375         ui->listLabel->setText("Playlists");
376         ui->addButton->setEnabled(true);
377         ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
378         ui->deleteButton->setEnabled(true);
379         ui->deleteButton->setIcon(QIcon(":/icons/"+_icons_theme+"/delete.png"));
380         ui->useButton->setEnabled(false);
381         ui->useButton->setIcon(QIcon());
382 }
383
384 void LibraryForm::_delete_button() {
385         if (_state == STATE_PLAYLIST_TRACK) {
386                 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
387                 ui->listView->selectionModel()->clearSelection();
388                 QQueue<int> to_delete;
389                 foreach (QModelIndex id, selected) {
390                         to_delete.append(id.row());
391                 }
392                 qSort(to_delete);
393                 int count = to_delete.count();
394                 for (int i = count-1; i >= 0; i--) {
395                         _current_playlist.removeTrackAt(to_delete.at(i));
396                 }
397                 _current_tracks = _current_playlist.tracks();
398                 _lib->savePlaylist(_current_playlist);
399                 _current_playlist_changed = true;
400                 __fill_model_tracks(_model, _current_tracks, _icons_theme);
401                 ui->listView->setColumnWidth(0, 70);
402         } else if (_state == STATE_PLAYLIST) {
403                 QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
404                 QQueue<int> to_delete;
405                 foreach (QModelIndex id, selected) {
406                         to_delete.append(id.row());
407                 }
408                 qSort(to_delete);
409                 int count = to_delete.count();
410                 for (int i = count-1; i >= 0; i--) {
411                         QString name = _model->item(to_delete.at(i))->text();
412                         if (name != _CURRENT_PLAYLIST_SUBST_) {
413                                 _lib->removePlaylist(name);
414                                 _model->removeRow(to_delete.at(i));
415                         }
416                 }
417         }
418 }
419
420 void LibraryForm::_delete_track(Track track) {
421         Playlist current = _lib->getCurrentPlaylist();
422         current.removeTrack(track);
423         _lib->saveCurrentPlaylist(current);
424         _current_playlist_changed = true;
425 }
426
427 void LibraryForm::_use_button() {
428         _lib->saveCurrentPlaylist(_current_playlist);
429         _current_playlist_changed = true;
430         _current_playlist = _lib->getCurrentPlaylist();
431 }
432
433 void LibraryForm::search(QString pattern) {
434         _search_pattern = pattern;
435         _search_current_id = -1;
436         nextItem();
437 }
438
439 void LibraryForm::nextItem() {
440         QString data = _model->index(_search_current_id, 0).data().toString();
441         for (int i = _search_current_id+1; i < _model->rowCount(); i++) {
442                 data = _model->index(i, 1).data().toString();
443                 if (data.contains(_search_pattern, Qt::CaseInsensitive)) {
444                         _search_current_id = i;
445                         break;
446                 }
447         }
448         QModelIndex id = _model->index(_search_current_id, 1);
449         ui->listView->selectionModel()->clearSelection();
450         ui->listView->selectRow(id.row());
451         ui->listView->scrollTo(id);
452 }
453
454 void LibraryForm::prevItem() {
455         QString data = _model->index(_search_current_id, 0).data().toString();
456         for (int i = _search_current_id-1; i >= 0; i--) {
457                 data = _model->index(i, 1).data().toString();
458                 if (data.contains(_search_pattern, Qt::CaseInsensitive)) {
459                         _search_current_id = i;
460                         break;
461                 }
462         }
463         QModelIndex id = _model->index(_search_current_id, 1);
464         ui->listView->selectionModel()->clearSelection();
465         ui->listView->selectRow(id.row());
466         ui->listView->scrollTo(id);
467 }
468
469 void LibraryForm::cancelSearch() {
470         _search_pattern = "";
471         ui->listView->selectionModel()->clearSelection();
472 }
473
474 void LibraryForm::refresh() {
475         switch (_state) {
476         case STATE_ARTIST:
477                 _view_button();
478                 break;
479         case STATE_ALBUM:
480                 __fill_model_album(_model, _lib->getAlbumsForArtist(_current_artist), _icons_theme);
481                 ui->listView->setColumnWidth(0, 70);
482                 break;
483         case STATE_PLAYLIST:
484                 _playlists_button();
485                 break;
486         case STATE_DYNAMIC:
487                 _dynamic_button();
488                 break;
489         case STATE_PLAYLIST_TRACK:
490                 _current_playlist = _lib->getPlaylist(_current_playlist.name());
491                 _current_tracks = _current_playlist.tracks();
492                 __fill_model_tracks(_model, _current_tracks, _icons_theme);
493                 ui->listView->setColumnWidth(0, 70);
494                 break;
495         case STATE_TRACK:
496                 _current_tracks = _lib->getTracksForAlbum(_current_album, _current_artist);
497                 __fill_model_tracks(_model, _current_tracks, _icons_theme);
498                 break;
499         default:
500                 return;
501         }
502 }
503
504 void LibraryForm::_toggle_select_all_button() {
505         if (ui->listView->selectionModel()->selectedIndexes().count() == _model->rowCount() * _model->columnCount()) {
506                 ui->listView->selectionModel()->clearSelection();
507                 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
508         } else {
509                 ui->listView->selectAll();
510                 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
511         }
512 }
513
514 void LibraryForm::landscapeMode() {
515         landscape = true;
516         ui->topWidget->hide();
517         ui->bottomWidget->hide();
518
519         ui->lverticalLayout->removeItem(ui->lverticalSpacer_0);
520         ui->lverticalLayout->removeItem(ui->lverticalSpacer_1);
521         ui->lverticalLayout->removeItem(ui->lverticalSpacer_2);
522         ui->lverticalLayout->removeItem(ui->lverticalSpacer_3);
523         ui->lverticalLayout->addWidget(ui->backButton);
524         ui->lverticalLayout->addItem(ui->lverticalSpacer_0);
525         ui->lverticalLayout->addWidget(ui->addButton);
526         ui->lverticalLayout->addItem(ui->lverticalSpacer_1);
527         ui->lverticalLayout->addWidget(ui->deleteButton);
528         ui->lverticalLayout->addItem(ui->lverticalSpacer_2);
529         ui->lverticalLayout->addWidget(ui->useButton);
530         ui->lverticalLayout->addItem(ui->lverticalSpacer_3);
531         ui->lverticalLayout->addWidget(ui->playerButton);
532
533         ui->rverticalLayout->removeItem(ui->rverticalSpacer_0);
534         ui->rverticalLayout->removeItem(ui->rverticalSpacer_1);
535         ui->rverticalLayout->removeItem(ui->rverticalSpacer_2);
536         ui->rverticalLayout->removeItem(ui->rverticalSpacer_3);
537         ui->rverticalLayout->addWidget(ui->moreButton);
538         ui->rverticalLayout->addItem(ui->rverticalSpacer_0);
539         ui->rverticalLayout->addWidget(ui->selectAllButton);
540         ui->rverticalLayout->addItem(ui->rverticalSpacer_1);
541         ui->rverticalLayout->addWidget(ui->viewButton);
542         ui->rverticalLayout->addItem(ui->rverticalSpacer_2);
543         ui->rverticalLayout->addWidget(ui->dynamicButton);
544         ui->rverticalLayout->addItem(ui->rverticalSpacer_3);
545         ui->rverticalLayout->addWidget(ui->playlistsButton);
546
547         if (_tools_widget->isVisible()) {
548                 ui->moreButton->setIcon(QIcon(":/icons/"+_icons_theme+"/more_l.png"));
549         } else {
550                 ui->moreButton->setIcon(QIcon(":/icons/"+_icons_theme+"/unmore_l.png"));
551         }
552 }
553
554 void LibraryForm::portraitMode() {
555         landscape = false;
556
557         ui->topWidget->show();
558         ui->bottomWidget->show();
559
560         ui->lverticalLayout->removeItem(ui->lverticalSpacer_0);
561         ui->lverticalLayout->removeItem(ui->lverticalSpacer_1);
562         ui->lverticalLayout->removeItem(ui->lverticalSpacer_2);
563         ui->lverticalLayout->removeItem(ui->lverticalSpacer_3);
564
565         ui->rverticalLayout->removeItem(ui->rverticalSpacer_0);
566         ui->rverticalLayout->removeItem(ui->rverticalSpacer_1);
567         ui->rverticalLayout->removeItem(ui->rverticalSpacer_2);
568         ui->rverticalLayout->removeItem(ui->rverticalSpacer_3);
569
570         ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_0);
571         ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_1);
572         ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_2);
573         ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_3);
574         ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_4);
575         ui->topWidget->layout()->addWidget(ui->backButton);
576         ui->topWidget->layout()->addItem(ui->thorizontalSpacer_0);
577         ui->topWidget->layout()->addWidget(ui->deleteButton);
578         ui->topWidget->layout()->addItem(ui->thorizontalSpacer_1);
579         ui->topWidget->layout()->addWidget(ui->addButton);
580         ui->topWidget->layout()->addItem(ui->thorizontalSpacer_2);
581         ui->topWidget->layout()->addWidget(ui->useButton);
582         ui->topWidget->layout()->addItem(ui->thorizontalSpacer_3);
583         ui->topWidget->layout()->addWidget(ui->selectAllButton);
584         ui->topWidget->layout()->addItem(ui->thorizontalSpacer_4);
585         ui->topWidget->layout()->addWidget(ui->moreButton);
586
587         ui->bottomWidget->layout()->removeItem(ui->bhorizontalSpacer_0);
588         ui->bottomWidget->layout()->removeItem(ui->bhorizontalSpacer_1);
589         ui->bottomWidget->layout()->removeItem(ui->bhorizontalSpacer_2);
590         ui->bottomWidget->layout()->addWidget(ui->playerButton);
591         ui->bottomWidget->layout()->addItem(ui->bhorizontalSpacer_0);
592         ui->bottomWidget->layout()->addWidget(ui->viewButton);
593         ui->bottomWidget->layout()->addItem(ui->bhorizontalSpacer_1);
594         ui->bottomWidget->layout()->addWidget(ui->dynamicButton);
595         ui->bottomWidget->layout()->addItem(ui->bhorizontalSpacer_2);
596         ui->bottomWidget->layout()->addWidget(ui->playlistsButton);
597
598         if (_tools_widget->isVisible()) {
599                 ui->moreButton->setIcon(QIcon(":/icons/"+_icons_theme+"/unmore.png"));
600         } else {
601                 ui->moreButton->setIcon(QIcon(":/icons/"+_icons_theme+"/more.png"));
602         }
603 }
604
605 void LibraryForm::_more_button() {
606         if (_tools_widget->isVisible()) {
607                 ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/unmore_l.png" : ":/icons/"+_icons_theme+"/more.png"));
608                 _tools_widget->hide();
609                 _tools_widget->reset();
610                 cancelSearch();
611         } else {
612                 ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/more_l.png" : ":/icons/"+_icons_theme+"/unmore.png"));
613                 _tools_widget->show();
614                 _tools_widget->setFocus();
615         }
616 }
617
618
619 void LibraryForm::updateIcons() {
620         Config config;
621         _icons_theme = config.getValue("ui/iconstheme").toString();
622         _tools_widget->updateIcons();
623         if (!ui->addButton->icon().isNull()) {
624                 ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
625         }
626         if (!ui->deleteButton->icon().isNull()) {
627                 ui->deleteButton->setIcon(QIcon(":/icons/"+_icons_theme+"/delete.png"));
628         }
629         if (!ui->useButton->icon().isNull()) {
630                 ui->useButton->setIcon(QIcon(":/icons/"+_icons_theme+"/use.png"));
631         }
632         ui->backButton->setIcon(QIcon(":/icons/"+_icons_theme+"/back.png"));
633         ui->dynamicButton->setIcon(QIcon(":/icons/"+_icons_theme+"/dynamic.png"));
634         if (_tools_widget->isVisible()) {
635                 ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/more_l.png" : ":/icons/"+_icons_theme+"/unmore.png"));
636         } else {
637                 ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/unmore_l.png" : ":/icons/"+_icons_theme+"/more.png"));
638         }
639         ui->playerButton->setIcon(QIcon(":/icons/"+_icons_theme+"/player.png"));
640         ui->playlistsButton->setIcon(QIcon(":/icons/"+_icons_theme+"/playlists.png"));
641         ui->viewButton->setIcon(QIcon(":/icons/"+_icons_theme+"/artists.png"));
642         if (ui->listView->selectionModel()->selectedRows().count() == _model->rowCount()) {
643                 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/unselect_all.png"));
644         } else {
645                 ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
646         }
647         refresh();
648 }
649
650 void LibraryForm::checkGradient() {
651         Config config;
652         if (config.getValue("ui/gradient").toString() == "yes") {
653                 ui->bottomWidget->setStyleSheet(_bottom_gradient);
654                 ui->topWidget->setStyleSheet(_top_gradient);
655         } else {
656                 ui->topWidget->setStyleSheet("");
657                 ui->bottomWidget->setStyleSheet("");
658         }
659 }
660
661 void LibraryForm::_process_selection(QItemSelection selected, QItemSelection deselected) {
662         foreach (QModelIndex id, selected.indexes()) {
663                 if (id.column() == 0) {
664                         _model->item(id.row())->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
665                 }
666                 ui->listView->selectionModel()->select(id, QItemSelectionModel::Select);
667         }
668         foreach (QModelIndex id, deselected.indexes()) {
669                 if (id.column() == 0) {
670                         _model->item(id.row())->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
671                 }
672                 ui->listView->selectionModel()->select(id, QItemSelectionModel::Deselect);
673         }
674 }
675
676 void LibraryForm::_process_dblclick(QModelIndex id) {
677         if (id.column() == 0)
678                 return;
679         if (_state == STATE_TRACK || _state == STATE_PLAYLIST_TRACK) {
680                 Playlist cur = _lib->getCurrentPlaylist();
681                 Track track = _current_tracks.at(id.row());
682                 cur.addTrack(track);
683                 _lib->saveCurrentPlaylist(cur);
684                 _current_playlist_changed = true;
685                 emit addAndPlay(track);
686                 ui->listView->clearSelection();
687         }
688 }
689