diff options
author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2007-08-15 21:54:15 +0000 |
---|---|---|
committer | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2007-08-15 21:54:15 +0000 |
commit | 653b996828428370d21ea5fad92ca5790f017019 (patch) | |
tree | d38d92cf9f682b034990bebb0f6a1be0cb3e64cf /rbutil/rbutilqt/installthemes.cpp | |
parent | 53fbd6d01dc921c203860523649df59033751ca9 (diff) | |
download | rockbox-653b996828428370d21ea5fad92ca5790f017019.tar.gz rockbox-653b996828428370d21ea5fad92ca5790f017019.zip |
Add theme installation. This relies on a modified server script so the themes site need to incorporate the changes.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14363 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'rbutil/rbutilqt/installthemes.cpp')
-rw-r--r-- | rbutil/rbutilqt/installthemes.cpp | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/rbutil/rbutilqt/installthemes.cpp b/rbutil/rbutilqt/installthemes.cpp new file mode 100644 index 0000000000..53cf41d496 --- /dev/null +++ b/rbutil/rbutilqt/installthemes.cpp | |||
@@ -0,0 +1,296 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * | ||
9 | * Copyright (C) 2007 by Dominik Riebeling | ||
10 | * $Id$ | ||
11 | * | ||
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. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #include <QtGui> | ||
21 | |||
22 | #include "ui_installthemesfrm.h" | ||
23 | #include "installthemes.h" | ||
24 | #include "installzip.h" | ||
25 | #include "progressloggergui.h" | ||
26 | |||
27 | |||
28 | ThemesInstallWindow::ThemesInstallWindow(QWidget *parent) : QDialog(parent) | ||
29 | { | ||
30 | ui.setupUi(this); | ||
31 | ui.listThemes->setAlternatingRowColors(true); | ||
32 | ui.listThemes->setSelectionMode(QAbstractItemView::ExtendedSelection); | ||
33 | ui.themePreview->clear(); | ||
34 | ui.themePreview->setText(tr("no theme selected")); | ||
35 | |||
36 | connect(ui.buttonCancel, SIGNAL(clicked()), this, SLOT(close())); | ||
37 | connect(ui.buttonOk, SIGNAL(clicked()), this, SLOT(accept())); | ||
38 | } | ||
39 | |||
40 | |||
41 | QString ThemesInstallWindow::resolution() | ||
42 | { | ||
43 | QString resolution; | ||
44 | devices->beginGroup(userSettings->value("defaults/platform").toString()); | ||
45 | resolution = devices->value("resolution").toString(); | ||
46 | devices->endGroup(); | ||
47 | return resolution; | ||
48 | } | ||
49 | |||
50 | |||
51 | void ThemesInstallWindow::setDeviceSettings(QSettings *dev) | ||
52 | { | ||
53 | devices = dev; | ||
54 | qDebug() << "setDeviceSettings()" << devices; | ||
55 | } | ||
56 | |||
57 | |||
58 | void ThemesInstallWindow::setUserSettings(QSettings *user) | ||
59 | { | ||
60 | userSettings = user; | ||
61 | } | ||
62 | |||
63 | |||
64 | void ThemesInstallWindow::downloadInfo() | ||
65 | { | ||
66 | // try to get the current build information | ||
67 | getter = new HttpGet(this); | ||
68 | connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool))); | ||
69 | |||
70 | qDebug() << "downloading themes info"; | ||
71 | themesInfo.open(); | ||
72 | qDebug() << "file:" << themesInfo.fileName(); | ||
73 | themesInfo.close(); | ||
74 | |||
75 | QUrl url; | ||
76 | url = QUrl(devices->value("themes_url").toString() + "/rbutilqt.php?res=" + resolution()); | ||
77 | qDebug() << "downloadInfo()" << url; | ||
78 | qDebug() << url.queryItems(); | ||
79 | getter->setProxy(proxy); | ||
80 | getter->setFile(&themesInfo); | ||
81 | getter->getFile(url); | ||
82 | } | ||
83 | |||
84 | |||
85 | void ThemesInstallWindow::downloadDone(int id, bool error) | ||
86 | { | ||
87 | downloadDone(error); | ||
88 | qDebug() << "downloadDone(bool) =" << id << error; | ||
89 | } | ||
90 | |||
91 | |||
92 | void ThemesInstallWindow::downloadDone(bool error) | ||
93 | { | ||
94 | qDebug() << "downloadDone(bool) =" << error; | ||
95 | |||
96 | disconnect(logger, SIGNAL(aborted()), getter, SLOT(abort())); | ||
97 | disconnect(logger, SIGNAL(aborted()), this, SLOT(close())); | ||
98 | themesInfo.open(); | ||
99 | |||
100 | QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this); | ||
101 | QStringList tl = iniDetails.childGroups(); | ||
102 | qDebug() << tl.size(); | ||
103 | qDebug() << iniDetails.value("error/code").toString() | ||
104 | << iniDetails.value("error/description").toString() | ||
105 | << iniDetails.value("error/query").toString(); | ||
106 | |||
107 | if(error) { | ||
108 | logger->addItem(tr("Network error: %1.\nPlease check your network and proxy settings.") | ||
109 | .arg(getter->errorString()), LOGERROR); | ||
110 | getter->abort(); | ||
111 | logger->abort(); | ||
112 | disconnect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool))); | ||
113 | connect(logger, SIGNAL(closed()), this, SLOT(close())); | ||
114 | return; | ||
115 | } | ||
116 | // handle possible error codes | ||
117 | if(iniDetails.value("error/code").toInt() != 0 || !iniDetails.contains("error/code")) { | ||
118 | qDebug() << "error!"; | ||
119 | logger->addItem(tr("the following error occured:\n%1") | ||
120 | .arg(iniDetails.value("error/description", "unknown error").toString()), LOGERROR); | ||
121 | logger->abort(); | ||
122 | connect(logger, SIGNAL(closed()), this, SLOT(close())); | ||
123 | return; | ||
124 | } | ||
125 | logger->addItem(tr("done."), LOGOK); | ||
126 | logger->abort(); | ||
127 | logger->close(); | ||
128 | |||
129 | // setup list | ||
130 | for(int i = 0; i < tl.size(); i++) { | ||
131 | iniDetails.beginGroup(tl.at(i)); | ||
132 | // skip all themes without name field set (i.e. error section) | ||
133 | if(iniDetails.value("name").toString().isEmpty()) continue; | ||
134 | QListWidgetItem *w = new QListWidgetItem; | ||
135 | w->setData(Qt::DisplayRole, iniDetails.value("name").toString()); | ||
136 | w->setData(Qt::UserRole, tl.at(i)); | ||
137 | ui.listThemes->addItem(w); | ||
138 | |||
139 | iniDetails.endGroup(); | ||
140 | } | ||
141 | connect(ui.listThemes, SIGNAL(currentRowChanged(int)), this, SLOT(updateDetails(int))); | ||
142 | } | ||
143 | |||
144 | |||
145 | void ThemesInstallWindow::updateDetails(int row) | ||
146 | { | ||
147 | if(row == currentItem) return; | ||
148 | |||
149 | currentItem = row; | ||
150 | qDebug() << "updateDetails(int) =" << row; | ||
151 | QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this); | ||
152 | ui.themeDescription->setText(tr("fetching details for %1") | ||
153 | .arg(ui.listThemes->item(row)->data(Qt::DisplayRole).toString())); | ||
154 | ui.themePreview->clear(); | ||
155 | ui.themePreview->setText(tr("fetching preview ...")); | ||
156 | |||
157 | int size = 0; | ||
158 | |||
159 | iniDetails.beginGroup(ui.listThemes->item(row)->data(Qt::UserRole).toString()); | ||
160 | size += iniDetails.value("size").toInt(); | ||
161 | qDebug() << ui.listThemes->item(row)->data(Qt::UserRole).toString() << size; | ||
162 | iniDetails.endGroup(); | ||
163 | ui.labelSize->setText(tr("Download size %1 kiB").arg(size)); | ||
164 | |||
165 | iniDetails.beginGroup(ui.listThemes->item(row)->data(Qt::UserRole).toString()); | ||
166 | |||
167 | QUrl img, txt; | ||
168 | txt = QUrl(QString(devices->value("themes_url").toString() + "/" | ||
169 | + iniDetails.value("descriptionfile").toString())); | ||
170 | img = QUrl(QString(devices->value("themes_url").toString() + "/" | ||
171 | + iniDetails.value("image").toString())); | ||
172 | qDebug() << "txt:" << txt; | ||
173 | qDebug() << "img:" << img; | ||
174 | |||
175 | QString text; | ||
176 | text = tr("<b>Author:</b> %1<hr/>").arg(iniDetails.value("author", tr("unknown")).toString()); | ||
177 | text += tr("<b>Version:</b> %1<hr/>").arg(iniDetails.value("version", tr("unknown")).toString()); | ||
178 | text += tr("<b>Description:</b> %1<br/>").arg(iniDetails.value("about", tr("no description")).toString()); | ||
179 | ui.themeDescription->setHtml(text); | ||
180 | iniDetails.endGroup(); | ||
181 | |||
182 | igetter.abort(); | ||
183 | igetter.setProxy(proxy); | ||
184 | igetter.getFile(img); | ||
185 | connect(&igetter, SIGNAL(done(bool)), this, SLOT(updateImage(bool))); | ||
186 | } | ||
187 | |||
188 | |||
189 | void ThemesInstallWindow::updateImage(bool error) | ||
190 | { | ||
191 | qDebug() << "updateImage(bool) =" << error; | ||
192 | if(error) return; | ||
193 | |||
194 | QPixmap p, q; | ||
195 | QSize img; | ||
196 | img.setHeight(ui.themePreview->height()); | ||
197 | img.setWidth(ui.themePreview->width()); | ||
198 | if(!error) { | ||
199 | imgData = igetter.readAll(); | ||
200 | if(imgData.isNull()) return; | ||
201 | p.loadFromData(imgData); | ||
202 | q = p.scaled(img, Qt::KeepAspectRatio, Qt::SmoothTransformation); | ||
203 | ui.themePreview->setScaledContents(false); | ||
204 | if(q.isNull()) { | ||
205 | ui.themePreview->clear(); | ||
206 | ui.themePreview->setText(tr("no theme preview")); | ||
207 | } | ||
208 | else ui.themePreview->setPixmap(q); | ||
209 | } | ||
210 | } | ||
211 | |||
212 | |||
213 | void ThemesInstallWindow::resizeEvent(QResizeEvent* e) | ||
214 | { | ||
215 | qDebug() << "resizeEvent(QResizeEvent*) =" << e; | ||
216 | |||
217 | QPixmap p, q; | ||
218 | QSize img; | ||
219 | img.setHeight(ui.themePreview->height()); | ||
220 | img.setWidth(ui.themePreview->width()); | ||
221 | |||
222 | p.loadFromData(imgData); | ||
223 | if(p.isNull()) return; | ||
224 | q = p.scaled(img, Qt::KeepAspectRatio, Qt::SmoothTransformation); | ||
225 | ui.themePreview->setScaledContents(false); | ||
226 | ui.themePreview->setPixmap(q); | ||
227 | } | ||
228 | |||
229 | |||
230 | |||
231 | void ThemesInstallWindow::show() | ||
232 | { | ||
233 | downloadInfo(); | ||
234 | QDialog::show(); | ||
235 | logger = new ProgressLoggerGui(this); | ||
236 | logger->show(); | ||
237 | logger->addItem(tr("getting themes information ..."), LOGINFO); | ||
238 | connect(logger, SIGNAL(aborted()), getter, SLOT(abort())); | ||
239 | connect(logger, SIGNAL(aborted()), this, SLOT(close())); | ||
240 | } | ||
241 | |||
242 | |||
243 | void ThemesInstallWindow::abort() | ||
244 | { | ||
245 | igetter.abort(); | ||
246 | logger->abort(); | ||
247 | this->close(); | ||
248 | } | ||
249 | |||
250 | |||
251 | void ThemesInstallWindow::setProxy(QUrl p) | ||
252 | { | ||
253 | proxy = p; | ||
254 | qDebug() << "setProxy()" << proxy; | ||
255 | } | ||
256 | |||
257 | |||
258 | void ThemesInstallWindow::accept() | ||
259 | { | ||
260 | if(ui.listThemes->selectedItems().size() == 0) { | ||
261 | this->close(); | ||
262 | return; | ||
263 | } | ||
264 | QStringList themes; | ||
265 | QStringList names; | ||
266 | QString zip; | ||
267 | QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this); | ||
268 | for(int i = 0; i < ui.listThemes->selectedItems().size(); i++) { | ||
269 | iniDetails.beginGroup(ui.listThemes->selectedItems().at(i)->data(Qt::UserRole).toString()); | ||
270 | zip = devices->value("themes_url").toString() + "/" + iniDetails.value("archive").toString(); | ||
271 | themes.append(zip); | ||
272 | names.append("Theme: " + ui.listThemes->selectedItems().at(i)->data(Qt::DisplayRole).toString()); | ||
273 | iniDetails.endGroup(); | ||
274 | } | ||
275 | qDebug() << "installing themes:" << themes; | ||
276 | |||
277 | logger = new ProgressLoggerGui(this); | ||
278 | logger->show(); | ||
279 | QString mountPoint = userSettings->value("defaults/mountpoint").toString(); | ||
280 | qDebug() << "mountpoint:" << userSettings->value("defaults/mountpoint").toString(); | ||
281 | // show dialog with error if mount point is wrong | ||
282 | if(!QFileInfo(mountPoint).isDir()) { | ||
283 | logger->addItem(tr("Mount point is wrong!"),LOGERROR); | ||
284 | logger->abort(); | ||
285 | return; | ||
286 | } | ||
287 | |||
288 | installer = new ZipInstaller(this); | ||
289 | installer->setUrl(themes); | ||
290 | installer->setProxy(proxy); | ||
291 | installer->setLogSection(names); | ||
292 | installer->setMountPoint(mountPoint); | ||
293 | installer->install(logger); | ||
294 | connect(logger, SIGNAL(closed()), this, SLOT(close())); | ||
295 | } | ||
296 | |||