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