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