2 * SomePlayer - An alternate music player for Maemo 5
3 * Copyright (C) 2010 Nikolay (somebody) Tischenko <niktischenko@gmail.com>
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.
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.
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.
20 #include "directoryview.h"
21 #include "ui_directoryview.h"
24 #include "someplayer.h"
29 using namespace SomePlayer::Storage;
30 using namespace SomePlayer::DataObjects;
32 DirectoryView::DirectoryView(QWidget *parent) :
34 ui(new Ui::DirectoryView)
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);
49 ui->addButton->setEnabled(false);
50 ui->addButton->setIcon(QIcon());
52 ui->progressBar->hide();
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();
69 DirectoryView::~DirectoryView()
74 void DirectoryView::readDir(QString path) {
76 _current_dir = dir.absoluteFilePath(path);
79 QList<QString> dirnames;
80 QList<QString> filenames;
81 QFileInfoList items = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
82 foreach (QFileInfo info, items) {
84 _directories << info.absoluteFilePath();
85 dirnames << info.fileName();
87 if (REGISTERED_FILE_EXTENSIONS.contains(info.suffix().toLower())) {
88 _files << info.absoluteFilePath();
89 filenames << info.fileName();
93 _model->setRowCount(dirnames.count() + filenames.count());
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+"/"));
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));
105 ui->dirView->setColumnWidth(0, 70);
106 ui->addButton->setEnabled(false);
107 ui->addButton->setIcon(QIcon());
110 void DirectoryView::_back() {
111 readDir(_current_dir+"/..");
114 void DirectoryView::_process_click(QModelIndex index) {
115 if (index.column() == 0) {
117 QString data = index.data().toString();
118 if (data.endsWith("/")) {
119 _current_dir = _directories.at(index.row());
120 readDir(_current_dir);
126 void DirectoryView::_process_dblclick(QModelIndex index) {
127 if (index.column() == 0) {
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);
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"));
144 ui->dirView->selectionModel()->select(id, QItemSelectionModel::Select);
146 foreach (QModelIndex id, deselected.indexes()) {
147 if (id.column() == 0) {
148 _model->item(id.row())->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
150 ui->dirView->selectionModel()->select(id, QItemSelectionModel::Deselect);
152 if (ui->dirView->selectionModel()->selectedRows().count() > 0) {
153 ui->addButton->setEnabled(true);
154 ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png"));
156 ui->addButton->setEnabled(false);
157 ui->addButton->setIcon(QIcon());
161 void DirectoryView::_home() {
162 _current_dir = QDir::homePath();
163 readDir(_current_dir);
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"));
171 ui->dirView->selectAll();
172 ui->selectToggleButton->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png"));
176 void DirectoryView::_add() {
177 QModelIndexList selected = ui->dirView->selectionModel()->selectedRows(1);
179 QStringList directories;
180 foreach (QModelIndex index, selected) {
181 if (!index.data().toString().endsWith("/")) {
182 files << _files.at(index.row() - _directories.count());
184 directories << _directories.at(index.row());
187 foreach (QString dir, directories) {
188 files.append(_mediascanner->singleScan(dir));
191 ui->progressBar->setMinimum(0);
192 ui->progressBar->setMaximum(files.count());
193 ui->progressBar->show();
194 _tagresolver->decode(files);
195 ui->dirView->clearSelection();
198 void DirectoryView::_add_track(Track track) {
199 _tracks.append(track);
200 ui->progressBar->setValue(ui->progressBar->value()+1);
203 void DirectoryView::_done() {
204 emit addTracks(_tracks);
205 ui->progressBar->hide();
209 void DirectoryView::updateIcons() {
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"));
219 ui->selectToggleButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
221 ui->playerButton->setIcon(QIcon(":/icons/"+_icons_theme+"/player.png"));
222 readDir(_current_dir);
225 void DirectoryView::updateGradient() {
227 if (config.getValue("ui/gradient").toString() == "yes") {
228 ui->bottomWidget->setStyleSheet(_bottom_gradient);
229 ui->topWidget->setStyleSheet(_top_gradient);
231 ui->topWidget->setStyleSheet("");
232 ui->bottomWidget->setStyleSheet("");
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);
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();