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