Fixed broken image issue in taglib
[someplayer] / src / directoryview.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 "directoryview.h"
21 #include "ui_directoryview.h"
22 #include <QDir>
23 #include <QFileInfo>
24 #include "someplayer.h"
25 #include <QDebug>
26 #include <QRegExp>
27 #include "config.h"
28
29 using namespace SomePlayer::Storage;
30 using namespace SomePlayer::DataObjects;
31
32 DirectoryView::DirectoryView(QWidget *parent) :
33                 QWidget(parent),
34                 ui(new Ui::DirectoryView)
35 {
36         ui->setupUi(this);
37         Config config;
38         _icons_theme = config.getValue("ui/iconstheme").toString();
39         REGISTERED_FILE_EXTENSIONS << "mp3" << "flac" << "wma" << "aac" << "ogg";
40         setWindowFlags(windowFlags() | Qt::Window);
41         setAttribute(Qt::WA_Maemo5StackedWindow);
42         _model = new QStandardItemModel(0, 2, this);
43         ui->dirView->setModel(_model);
44         ui->dirView->setColumnHidden(2, true);
45         _current_dir = QDir::homePath();
46         _tagresolver = new TagResolver(this);
47         _mediascanner = new MediaScanner(this);
48
49         ui->addButton->setEnabled(false);
50         ui->addButton->setIcon(QIcon());
51
52         ui->progressBar->hide();
53
54         readDir(_current_dir);
55         connect(ui->backButton, SIGNAL(clicked()), this, SLOT(_back()));
56         connect(ui->dirView, SIGNAL(clicked(QModelIndex)), this, SLOT(_process_click(QModelIndex)));
57         connect(ui->dirView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(_process_dblclick(QModelIndex)));
58         connect(ui->dirView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this,
59                 SLOT(_process_selection(QItemSelection,QItemSelection)));
60         connect(ui->homeButton, SIGNAL(clicked()), this, SLOT(_home()));
61         connect(ui->selectToggleButton, SIGNAL(clicked()), this, SLOT(_toggle_selection()));
62         connect(ui->addButton, SIGNAL(clicked()), this, SLOT(_add()));
63         connect(_tagresolver, SIGNAL(decoded(Track)), this, SLOT(_add_track(Track)));
64         connect(_tagresolver, SIGNAL(done()), this, SLOT(_done()));
65         _top_gradient = ui->topWidget->styleSheet();
66         _bottom_gradient = ui->bottomWidget->styleSheet();
67 }
68
69 DirectoryView::~DirectoryView()
70 {
71         delete ui;
72 }
73
74 void DirectoryView::readDir(QString path) {
75         QDir dir(path);
76         _current_dir = dir.absoluteFilePath(path);
77         _directories.clear();
78         _files.clear();
79         QList<QString> dirnames;
80         QList<QString> filenames;
81         QFileInfoList items = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
82         foreach (QFileInfo info, items) {
83                 if (info.isDir()) {
84                         _directories << info.absoluteFilePath();
85                         dirnames << info.fileName();
86                 } else {
87                         if (REGISTERED_FILE_EXTENSIONS.contains(info.suffix().toLower())) {
88                                 _files << info.absoluteFilePath();
89                                 filenames << info.fileName();
90                         }
91                 }
92         }
93         _model->setRowCount(dirnames.count() + filenames.count());
94         int i = 0;
95         foreach (QString str, dirnames) {
96                 _model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"), ""));
97                 _model->setItem(i, 1, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/folder.png"), str+"/"));
98                 i++;
99         }
100         foreach (QString str, filenames) {
101                 _model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"), ""));
102                 _model->setItem(i, 1, new QStandardItem(str));
103                 i++;
104         }
105         ui->dirView->setColumnWidth(0, 70);
106         ui->addButton->setEnabled(false);
107         ui->addButton->setIcon(QIcon());
108 }
109
110 void DirectoryView::_back() {
111         readDir(_current_dir+"/..");
112 }
113
114 void DirectoryView::_process_click(QModelIndex index) {
115         if (index.column() == 0) {
116         } else {
117                 QString data = index.data().toString();
118                 if (data.endsWith("/")) {
119                         _current_dir = _directories.at(index.row());
120                         readDir(_current_dir);
121                         return;
122                 }
123         }
124 }
125
126 void DirectoryView::_process_dblclick(QModelIndex index) {
127         if (index.column() == 0) {
128         } else {
129                 QString data = index.data().toString();
130                 if (!data.endsWith("/")) {
131                         QString filename = _files.at(index.row() - _directories.count());
132                         Track track = _tagresolver->decodeOne(filename);
133                         emit addAndPlay(track);
134                         return;
135                 }
136         }
137 }
138
139 void DirectoryView::_process_selection(QItemSelection selected, QItemSelection deselected) {
140         foreach (QModelIndex id, selected.indexes()) {
141                 if (id.column() == 0) {
142                         _model->item(id.row())->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
143                 }
144                 ui->dirView->selectionModel()->select(id, QItemSelectionModel::Select);
145         }
146         foreach (QModelIndex id, deselected.indexes()) {
147                 if (id.column() == 0) {
148                         _model->item(id.row())->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
149                 }
150                 ui->dirView->selectionModel()->select(id, QItemSelectionModel::Deselect);
151         }
152         if (ui->dirView->selectionModel()->selectedRows().count() > 0) {
153                 ui->addButton->setEnabled(true);
154                 ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
155         } else {
156                 ui->addButton->setEnabled(false);
157                 ui->addButton->setIcon(QIcon());
158         }
159 }
160
161 void DirectoryView::_home() {
162         _current_dir = QDir::homePath();
163         readDir(_current_dir);
164 }
165
166 void DirectoryView::_toggle_selection() {
167         if (ui->dirView->selectionModel()->selectedRows().count() == _model->rowCount()) {
168                 ui->dirView->clearSelection();
169                 ui->selectToggleButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
170         } else {
171                 ui->dirView->selectAll();
172                 ui->selectToggleButton->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
173         }
174 }
175
176 void DirectoryView::_add() {
177         QModelIndexList selected = ui->dirView->selectionModel()->selectedRows(1);
178         QStringList files;
179         QStringList directories;
180         foreach (QModelIndex index, selected) {
181                 if (!index.data().toString().endsWith("/")) {
182                         files << _files.at(index.row() - _directories.count());
183                 } else {
184                         directories << _directories.at(index.row());
185                 }
186         }
187         foreach (QString dir, directories) {
188                 files.append(_mediascanner->singleScan(dir));
189         }
190         _tracks.clear();
191         ui->progressBar->setMinimum(0);
192         ui->progressBar->setMaximum(files.count());
193         ui->progressBar->show();
194         _tagresolver->decode(files);
195         ui->dirView->clearSelection();
196 }
197
198 void DirectoryView::_add_track(Track track) {
199         _tracks.append(track);
200         ui->progressBar->setValue(ui->progressBar->value()+1);
201 }
202
203 void DirectoryView::_done() {
204         emit addTracks(_tracks);
205         ui->progressBar->hide();
206         _tracks.clear();
207 }
208
209 void DirectoryView::updateIcons() {
210         Config config;
211         _icons_theme = config.getValue("ui/iconstheme").toString();
212         if (!ui->addButton->icon().isNull())
213                 ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
214         ui->homeButton->setIcon(QIcon(":/icons/"+_icons_theme+"/home.png"));
215         ui->backButton->setIcon(QIcon(":/icons/"+_icons_theme+"/back.png"));
216         if (ui->dirView->selectionModel()->selectedRows().count() == _model->rowCount()) {
217                 ui->selectToggleButton->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
218         } else {
219                 ui->selectToggleButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
220         }
221         ui->playerButton->setIcon(QIcon(":/icons/"+_icons_theme+"/player.png"));
222         readDir(_current_dir);
223 }
224
225 void DirectoryView::updateGradient() {
226         Config config;
227         if (config.getValue("ui/gradient").toString() == "yes") {
228                 ui->bottomWidget->setStyleSheet(_bottom_gradient);
229                 ui->topWidget->setStyleSheet(_top_gradient);
230         } else {
231                 ui->topWidget->setStyleSheet("");
232                 ui->bottomWidget->setStyleSheet("");
233         }
234 }
235
236 void DirectoryView::lanscapeMode() {
237         ui->topWidget->hide();
238         ui->bottomWidget->hide();
239         ui->lverticalLayout->removeItem(ui->lverticalSpacer_0);
240         ui->lverticalLayout->removeItem(ui->lverticalSpacer_1);
241         ui->lverticalLayout->addWidget(ui->backButton);
242         ui->lverticalLayout->addItem(ui->lverticalSpacer_0);
243         ui->lverticalLayout->addWidget(ui->homeButton);
244         ui->lverticalLayout->addItem(ui->lverticalSpacer_1);
245         ui->lverticalLayout->addWidget(ui->playerButton);
246         ui->rverticalLayout->removeItem(ui->rverticalSpacer);
247         ui->rverticalLayout->addWidget(ui->addButton);
248         ui->rverticalLayout->addItem(ui->rverticalSpacer);
249         ui->rverticalLayout->addWidget(ui->selectToggleButton);
250 }
251
252 void DirectoryView::portraitMode() {
253         ui->lverticalLayout->removeItem(ui->lverticalSpacer_0);
254         ui->lverticalLayout->removeItem(ui->lverticalSpacer_1);
255         ui->rverticalLayout->removeItem(ui->rverticalSpacer);
256         ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_0);
257         ui->topWidget->layout()->removeItem(ui->thorizontalSpacer_1);
258         ui->topWidget->layout()->addWidget(ui->backButton);
259         ui->topWidget->layout()->addItem(ui->thorizontalSpacer_0);
260         ui->topWidget->layout()->addWidget(ui->homeButton);
261         ui->topWidget->layout()->addItem(ui->thorizontalSpacer_1);
262         ui->topWidget->layout()->addWidget(ui->addButton);
263         ui->bottomWidget->layout()->removeItem(ui->bhorizontalSpacer);
264         ui->bottomWidget->layout()->addWidget(ui->playerButton);
265         ui->bottomWidget->layout()->addItem(ui->bhorizontalSpacer);
266         ui->bottomWidget->layout()->addWidget(ui->selectToggleButton);
267         ui->topWidget->show();
268         ui->bottomWidget->show();
269 }