Move device and mountpoint selection to configuration to eliminate the need of asking...
[Rockbox.git] / rbutil / rbutilqt / configure.cpp
blobcef996ec564977592b439db50ba165f657cb1ffb
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
9 * Copyright (C) 2007 by Dominik Riebeling
10 * $Id$
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include <QtGui>
22 #include "configure.h"
23 #include "ui_configurefrm.h"
25 #ifdef __linux
26 #include <stdio.h>
27 #endif
29 #define DEFAULT_LANG "English (builtin)"
31 Config::Config(QWidget *parent) : QDialog(parent)
33 programPath = QFileInfo(qApp->arguments().at(0)).absolutePath() + "/";
34 ui.setupUi(this);
35 ui.radioManualProxy->setChecked(true);
36 QRegExpValidator *proxyValidator = new QRegExpValidator(this);
37 QRegExp validate("[0-9]*");
38 proxyValidator->setRegExp(validate);
39 ui.proxyPort->setValidator(proxyValidator);
40 #ifndef __linux
41 ui.radioSystemProxy->setEnabled(false); // only on linux for now
42 #endif
43 // build language list and sort alphabetically
44 QStringList langs = findLanguageFiles();
45 for(int i = 0; i < langs.size(); ++i)
46 lang.insert(languageName(langs[i]), langs[i]);
47 lang.insert(DEFAULT_LANG, "");
48 QMap<QString, QString>::const_iterator i = lang.constBegin();
49 while (i != lang.constEnd()) {
50 ui.listLanguages->addItem(i.key());
51 i++;
53 ui.listLanguages->setSelectionMode(QAbstractItemView::SingleSelection);
54 connect(ui.listLanguages, SIGNAL(itemSelectionChanged()), this, SLOT(updateLanguage()));
55 ui.proxyPass->setEchoMode(QLineEdit::Password);
57 this->setModal(true);
59 connect(ui.buttonOk, SIGNAL(clicked()), this, SLOT(accept()));
60 connect(ui.buttonCancel, SIGNAL(clicked()), this, SLOT(abort()));
61 connect(ui.radioNoProxy, SIGNAL(toggled(bool)), this, SLOT(setNoProxy(bool)));
62 connect(ui.radioSystemProxy, SIGNAL(toggled(bool)), this, SLOT(setSystemProxy(bool)));
63 connect(ui.browseMountPoint, SIGNAL(clicked()), this, SLOT(browseFolder()));
65 // disable unimplemented stuff
66 ui.buttonCacheBrowse->setEnabled(false);
67 ui.cacheDisable->setEnabled(false);
68 ui.cacheOfflineMode->setEnabled(false);
69 ui.buttonCacheClear->setEnabled(false);
71 ui.buttonAutodetect->setEnabled(false);
75 void Config::accept()
77 qDebug() << "Config::accept()";
78 // proxy: save entered proxy values, not displayed.
79 if(ui.radioManualProxy->isChecked()) {
80 proxy.setScheme("http");
81 proxy.setUserName(ui.proxyUser->text());
82 proxy.setPassword(ui.proxyPass->text());
83 proxy.setHost(ui.proxyHost->text());
84 proxy.setPort(ui.proxyPort->text().toInt());
86 userSettings->setValue("defaults/proxy", proxy.toString());
87 qDebug() << "new proxy:" << proxy;
88 // proxy type
89 QString proxyType;
90 if(ui.radioNoProxy->isChecked()) proxyType = "none";
91 else if(ui.radioSystemProxy->isChecked()) proxyType = "system";
92 else proxyType = "manual";
93 userSettings->setValue("defaults/proxytype", proxyType);
95 // language
96 if(userSettings->value("defaults/lang").toString() != language)
97 QMessageBox::information(this, tr("Language changed"),
98 tr("You need to restart the application for the changed language to take effect."));
99 userSettings->setValue("defaults/lang", language);
101 // sync settings
102 userSettings->sync();
103 this->close();
104 emit settingsUpdated();
108 void Config::abort()
110 qDebug() << "Config::abort()";
111 this->close();
115 void Config::setUserSettings(QSettings *user)
117 userSettings = user;
118 // set proxy
119 QUrl proxy = userSettings->value("defaults/proxy").toString();
121 ui.proxyPort->setText(QString("%1").arg(proxy.port()));
122 ui.proxyHost->setText(proxy.host());
123 ui.proxyUser->setText(proxy.userName());
124 ui.proxyPass->setText(proxy.password());
126 QString proxyType = userSettings->value("defaults/proxytype").toString();
127 if(proxyType == "manual") ui.radioManualProxy->setChecked(true);
128 else if(proxyType == "system") ui.radioSystemProxy->setChecked(true);
129 else if(proxyType == "none") ui.radioNoProxy->setChecked(true);
131 // set language selection
132 QList<QListWidgetItem*> a;
133 QString b;
134 // find key for lang value
135 QMap<QString, QString>::const_iterator i = lang.constBegin();
136 while (i != lang.constEnd()) {
137 if(i.value() == userSettings->value("defaults/lang").toString() + ".qm") {
138 b = i.key();
139 break;
141 i++;
143 a = ui.listLanguages->findItems(b, Qt::MatchExactly);
144 if(a.size() <= 0)
145 a = ui.listLanguages->findItems(DEFAULT_LANG, Qt::MatchExactly);
146 if(a.size() > 0)
147 ui.listLanguages->setCurrentItem(a.at(0));
149 // devices tab
150 ui.mountPoint->setText(userSettings->value("defaults/mountpoint").toString());
155 void Config::setDevices(QSettings *dev)
157 devices = dev;
158 // setup devices table
159 qDebug() << "Config::setDevices()";
160 devices->beginGroup("platforms");
161 QStringList a = devices->childKeys();
162 devices->endGroup();
164 QMap <QString, QString> manuf;
165 QMap <QString, QString> devcs;
166 for(int it = 0; it < a.size(); it++) {
167 QString curdev;
168 devices->beginGroup("platforms");
169 curdev = devices->value(a.at(it), "null").toString();
170 devices->endGroup();
171 QString curname;
172 devices->beginGroup(curdev);
173 curname = devices->value("name", "null").toString();
174 QString curbrand = devices->value("brand", "").toString();
175 devices->endGroup();
176 manuf.insertMulti(curbrand, curdev);
177 devcs.insert(curdev, curname);
180 QString platform;
181 platform = devcs.value(userSettings->value("defaults/platform").toString());
183 // set up devices table
184 ui.treeDevices->header()->hide();
185 ui.treeDevices->expandAll();
186 ui.treeDevices->setColumnCount(1);
187 QList<QTreeWidgetItem *> items;
189 // get manufacturers
190 QStringList brands = manuf.uniqueKeys();
191 QTreeWidgetItem *w;
192 QTreeWidgetItem *w2;
193 QTreeWidgetItem *w3;
194 for(int c = 0; c < brands.size(); c++) {
195 qDebug() << brands.at(c);
196 w = new QTreeWidgetItem();
197 w->setFlags(Qt::ItemIsEnabled);
198 w->setText(0, brands.at(c));
199 // w->setData(0, Qt::DecorationRole, <icon>);
200 items.append(w);
202 // go through platforms again for sake of order
203 for(int it = 0; it < a.size(); it++) {
204 QString curdev;
205 devices->beginGroup("platforms");
206 curdev = devices->value(a.at(it), "null").toString();
207 devices->endGroup();
208 QString curname;
209 devices->beginGroup(curdev);
210 curname = devices->value("name", "null").toString();
211 QString curbrand = devices->value("brand", "").toString();
212 devices->endGroup();
213 if(curbrand != brands.at(c)) continue;
214 qDebug() << "adding:" << brands.at(c) << curname << curdev;
215 w2 = new QTreeWidgetItem(w, QStringList(curname));
216 w2->setData(0, Qt::UserRole, curdev);
217 if(platform.contains(curname)) {
218 w2->setSelected(true);
219 w->setExpanded(true);
220 w3 = w2; // save pointer to hilight old selection
222 items.append(w2);
225 ui.treeDevices->insertTopLevelItems(0, items);
226 ui.treeDevices->setCurrentItem(w3); // hilight old selection
227 connect(ui.treeDevices, SIGNAL(itemSelectionChanged()), this, SLOT(updatePlatform()));
231 void Config::updatePlatform()
233 qDebug() << "updatePlatform()";
234 QString nplat;
235 nplat = ui.treeDevices->selectedItems().at(0)->data(0, Qt::UserRole).toString();
236 userSettings->setValue("defaults/platform", nplat);
240 void Config::setNoProxy(bool checked)
242 bool i = !checked;
243 ui.proxyPort->setEnabled(i);
244 ui.proxyHost->setEnabled(i);
245 ui.proxyUser->setEnabled(i);
246 ui.proxyPass->setEnabled(i);
250 void Config::setSystemProxy(bool checked)
252 bool i = !checked;
253 ui.proxyPort->setEnabled(i);
254 ui.proxyHost->setEnabled(i);
255 ui.proxyUser->setEnabled(i);
256 ui.proxyPass->setEnabled(i);
257 if(checked) {
258 // save values in input box
259 proxy.setScheme("http");
260 proxy.setUserName(ui.proxyUser->text());
261 proxy.setPassword(ui.proxyPass->text());
262 proxy.setHost(ui.proxyHost->text());
263 proxy.setPort(ui.proxyPort->text().toInt());
264 // show system values in input box
265 #ifdef __linux
266 QUrl envproxy = QUrl(getenv("http_proxy"));
267 ui.proxyHost->setText(envproxy.host());
268 ui.proxyPort->setText(QString("%1").arg(envproxy.port()));
269 ui.proxyUser->setText(envproxy.userName());
270 ui.proxyPass->setText(envproxy.password());
271 #endif
273 else {
274 ui.proxyHost->setText(proxy.host());
275 ui.proxyPort->setText(QString("%1").arg(proxy.port()));
276 ui.proxyUser->setText(proxy.userName());
277 ui.proxyPass->setText(proxy.password());
283 QStringList Config::findLanguageFiles()
285 QDir dir(programPath + "/");
286 QStringList fileNames;
287 fileNames = dir.entryList(QStringList("*.qm"), QDir::Files, QDir::Name);
289 QDir resDir(":/lang");
290 fileNames += resDir.entryList(QStringList("*.qm"), QDir::Files, QDir::Name);
292 fileNames.sort();
293 qDebug() << "Config::findLanguageFiles()" << fileNames;
295 return fileNames;
299 QString Config::languageName(const QString &qmFile)
301 QTranslator translator;
303 if(!translator.load(qmFile, programPath))
304 translator.load(qmFile, ":/lang");
306 return translator.translate("Configure", "English");
310 void Config::updateLanguage()
312 qDebug() << "updateLanguage()";
313 QList<QListWidgetItem*> a = ui.listLanguages->selectedItems();
314 if(a.size() > 0)
315 language = QFileInfo(lang.value(a.at(0)->text())).baseName();
319 void Config::browseFolder()
321 QFileDialog browser(this);
322 if(QFileInfo(ui.mountPoint->text()).isDir())
323 browser.setDirectory(ui.mountPoint->text());
324 else
325 browser.setDirectory("/media");
326 browser.setReadOnly(true);
327 browser.setFileMode(QFileDialog::DirectoryOnly);
328 browser.setAcceptMode(QFileDialog::AcceptOpen);
329 if(browser.exec()) {
330 qDebug() << browser.directory();
331 QStringList files = browser.selectedFiles();
332 ui.mountPoint->setText(files.at(0));
333 userSettings->setValue("defaults/mountpoint", files.at(0));