Handle language change events in widgets.
[maemo-rb.git] / rbutil / rbutilqt / themesinstallwindow.cpp
blob9218a085d076929a414dd730aafb1101758094b6
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
9 * Copyright (C) 2007 by Dominik Riebeling
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
17 ****************************************************************************/
19 #include <QtGui>
21 #include "ui_themesinstallfrm.h"
22 #include "themesinstallwindow.h"
23 #include "zipinstaller.h"
24 #include "progressloggergui.h"
25 #include "utils.h"
26 #include "rbsettings.h"
27 #include "systeminfo.h"
28 #include "rockboxinfo.h"
29 #include "version.h"
31 ThemesInstallWindow::ThemesInstallWindow(QWidget *parent) : QDialog(parent)
33 ui.setupUi(this);
34 ui.listThemes->setAlternatingRowColors(true);
35 ui.listThemes->setSelectionMode(QAbstractItemView::ExtendedSelection);
36 ui.listThemes->setSortingEnabled(true);
37 ui.themePreview->clear();
38 ui.themePreview->setText(tr("no theme selected"));
39 ui.labelSize->setText(tr("no selection"));
40 ui.listThemes->setLayoutDirection(Qt::LeftToRight);
41 ui.themeDescription->setLayoutDirection(Qt::LeftToRight);
43 connect(ui.buttonCancel, SIGNAL(clicked()), this, SLOT(close()));
44 connect(ui.buttonOk, SIGNAL(clicked()), this, SLOT(accept()));
45 connect(ui.listThemes, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
46 this, SLOT(updateDetails(QListWidgetItem*, QListWidgetItem*)));
47 connect(ui.listThemes, SIGNAL(itemSelectionChanged()), this, SLOT(updateSize()));
48 connect(&igetter, SIGNAL(done(bool)), this, SLOT(updateImage(bool)));
50 logger = NULL;
53 ThemesInstallWindow::~ThemesInstallWindow()
55 if(infocachedir!="")
56 Utils::recursiveRmdir(infocachedir);
60 void ThemesInstallWindow::downloadInfo()
62 // try to get the current build information
63 getter = new HttpGet(this);
64 RockboxInfo installInfo
65 = RockboxInfo(RbSettings::value(RbSettings::Mountpoint).toString());
67 themesInfo.open();
68 qDebug() << "[Themes] downloading info to" << themesInfo.fileName();
69 themesInfo.close();
71 QString infoUrl = SystemInfo::value(SystemInfo::ThemesInfoUrl).toString();
72 infoUrl.replace("%TARGET%",
73 SystemInfo::value(SystemInfo::CurConfigureModel).toString());
74 infoUrl.replace("%REVISION%", installInfo.revision());
75 infoUrl.replace("%RELEASE%", installInfo.release());
76 infoUrl.replace("%RBUTILVER%", VERSION);
77 QUrl url = QUrl(infoUrl);
78 qDebug() << "[Themes] Info URL:" << url << "Query:" << url.queryItems();
79 if(RbSettings::value(RbSettings::CacheOffline).toBool())
80 getter->setCache(true);
81 getter->setFile(&themesInfo);
83 connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
84 connect(logger, SIGNAL(aborted()), getter, SLOT(abort()));
85 getter->getFile(url);
89 void ThemesInstallWindow::downloadDone(int id, bool error)
91 downloadDone(error);
92 qDebug() << "[Themes] Download" << id << "done, error:" << error;
96 void ThemesInstallWindow::downloadDone(bool error)
98 qDebug() << "[Themes] Download done, error:" << error;
100 disconnect(logger, SIGNAL(aborted()), getter, SLOT(abort()));
101 disconnect(logger, SIGNAL(aborted()), this, SLOT(close()));
102 themesInfo.open();
104 QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this);
105 QStringList tl = iniDetails.childGroups();
106 qDebug() << "[Themes] Theme site result:"
107 << iniDetails.value("error/code").toString()
108 << iniDetails.value("error/description").toString()
109 << iniDetails.value("error/query").toString();
111 if(error) {
112 logger->addItem(tr("Network error: %1.\n"
113 "Please check your network and proxy settings.")
114 .arg(getter->errorString()), LOGERROR);
115 getter->abort();
116 logger->setFinished();
117 disconnect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
118 connect(logger, SIGNAL(closed()), this, SLOT(close()));
119 return;
121 // handle possible error codes
122 if(iniDetails.value("error/code").toInt() != 0 || !iniDetails.contains("error/code")) {
123 qDebug() << "[Themes] Theme site returned an error:"
124 << iniDetails.value("error/code");
125 logger->addItem(tr("the following error occured:\n%1")
126 .arg(iniDetails.value("error/description", "unknown error").toString()), LOGERROR);
127 logger->setFinished();
128 connect(logger, SIGNAL(closed()), this, SLOT(close()));
129 return;
131 logger->addItem(tr("done."), LOGOK);
132 logger->setFinished();
133 logger->close();
135 // setup list
136 for(int i = 0; i < tl.size(); i++) {
137 iniDetails.beginGroup(tl.at(i));
138 // skip all themes without name field set (i.e. error section)
139 if(iniDetails.value("name").toString().isEmpty()) {
140 iniDetails.endGroup();
141 continue;
143 qDebug() << "[Themes] adding to list:" << tl.at(i);
144 // convert to unicode and replace HTML-specific entities
145 QByteArray raw = iniDetails.value("name").toByteArray();
146 QTextCodec* codec = QTextCodec::codecForHtml(raw);
147 QString name = codec->toUnicode(raw);
148 name.replace("&quot;", "\"").replace("&amp;", "&");
149 name.replace("&lt;", "<").replace("&gt;", ">");
150 QListWidgetItem *w = new QListWidgetItem;
151 w->setData(Qt::DisplayRole, name.trimmed());
152 w->setData(Qt::UserRole, tl.at(i));
153 ui.listThemes->addItem(w);
155 iniDetails.endGroup();
157 // check if there's a themes "MOTD" available
158 if(iniDetails.contains("status/msg")) {
159 // check if there's a localized msg available
160 QString lang = RbSettings::value(RbSettings::Language).toString().split("_").at(0);
161 QString msg;
162 if(iniDetails.contains("status/msg." + lang))
163 msg = iniDetails.value("status/msg." + lang).toString();
164 else
165 msg = iniDetails.value("status/msg").toString();
166 qDebug() << "[Themes] MOTD" << msg;
167 if(!msg.isEmpty())
168 QMessageBox::information(this, tr("Information"), msg);
173 void ThemesInstallWindow::updateSize(void)
175 long size = 0;
176 // sum up size for all selected themes
177 QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this);
178 int items = ui.listThemes->selectedItems().size();
179 for(int i = 0; i < items; i++) {
180 iniDetails.beginGroup(ui.listThemes->selectedItems()
181 .at(i)->data(Qt::UserRole).toString());
182 size += iniDetails.value("size").toInt();
183 iniDetails.endGroup();
185 ui.labelSize->setText(tr("Download size %L1 kiB (%n item(s))", "", items)
186 .arg((size + 512) / 1024));
190 void ThemesInstallWindow::updateDetails(QListWidgetItem* cur, QListWidgetItem* prev)
192 if(cur == prev)
193 return;
195 QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this);
197 QCoreApplication::processEvents();
198 ui.themeDescription->setText(tr("fetching details for %1")
199 .arg(cur->data(Qt::DisplayRole).toString()));
200 ui.themePreview->clear();
201 ui.themePreview->setText(tr("fetching preview ..."));
202 imgData.clear();
204 iniDetails.beginGroup(cur->data(Qt::UserRole).toString());
206 QUrl img, txt;
207 txt = QUrl(QString(SystemInfo::value(SystemInfo::ThemesUrl).toString() + "/"
208 + iniDetails.value("descriptionfile").toString()));
209 img = QUrl(QString(SystemInfo::value(SystemInfo::ThemesUrl).toString() + "/"
210 + iniDetails.value("image").toString()));
212 QString text;
213 QTextCodec* codec = QTextCodec::codecForName("UTF-8");
214 text = tr("<b>Author:</b> %1<hr/>").arg(codec->toUnicode(iniDetails
215 .value("author", tr("unknown")).toByteArray()));
216 text += tr("<b>Version:</b> %1<hr/>").arg(codec->toUnicode(iniDetails
217 .value("version", tr("unknown")).toByteArray()));
218 text += tr("<b>Description:</b> %1<hr/>").arg(codec->toUnicode(iniDetails
219 .value("about", tr("no description")).toByteArray()));
221 text.replace("\n", "<br/>");
222 ui.themeDescription->setHtml(text);
223 iniDetails.endGroup();
225 igetter.abort();
226 if(!RbSettings::value(RbSettings::CacheDisabled).toBool())
227 igetter.setCache(true);
228 else
230 if(infocachedir=="")
232 infocachedir = QDir::tempPath() + "rbutil-themeinfo";
233 QDir d = QDir::temp();
234 d.mkdir("rbutil-themeinfo");
236 igetter.setCache(infocachedir);
239 igetter.getFile(img);
243 void ThemesInstallWindow::updateImage(bool error)
245 qDebug() << "[Themes] Updating image:"<< !error;
247 if(error) {
248 ui.themePreview->clear();
249 ui.themePreview->setText(tr("Retrieving theme preview failed.\n"
250 "HTTP response code: %1").arg(igetter.httpResponse()));
251 return;
254 QPixmap p;
255 if(!error) {
256 imgData = igetter.readAll();
257 if(imgData.isNull()) return;
258 p.loadFromData(imgData);
259 if(p.isNull()) {
260 ui.themePreview->clear();
261 ui.themePreview->setText(tr("no theme preview"));
263 else
264 ui.themePreview->setPixmap(p);
269 void ThemesInstallWindow::resizeEvent(QResizeEvent* e)
271 qDebug() << "[Themes]" << e;
273 QPixmap p, q;
274 QSize img;
275 img.setHeight(ui.themePreview->height());
276 img.setWidth(ui.themePreview->width());
278 p.loadFromData(imgData);
279 if(p.isNull()) return;
280 q = p.scaled(img, Qt::KeepAspectRatio, Qt::SmoothTransformation);
281 ui.themePreview->setScaledContents(false);
282 ui.themePreview->setPixmap(p);
287 void ThemesInstallWindow::show()
289 QDialog::show();
290 if(windowSelectOnly)
291 ui.buttonOk->setText(tr("Select"));
293 logger = new ProgressLoggerGui(this);
294 logger->show();
295 logger->addItem(tr("getting themes information ..."), LOGINFO);
297 connect(logger, SIGNAL(aborted()), this, SLOT(close()));
299 downloadInfo();
304 void ThemesInstallWindow::abort()
306 igetter.abort();
307 logger->setFinished();
308 this->close();
312 void ThemesInstallWindow::accept(void)
314 if(!windowSelectOnly)
315 install();
316 else
317 close();
321 void ThemesInstallWindow::install()
323 if(ui.listThemes->selectedItems().size() == 0) {
324 this->close();
325 return;
327 QStringList themes;
328 QStringList names;
329 QStringList version;
330 QString zip;
331 QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this);
332 for(int i = 0; i < ui.listThemes->selectedItems().size(); i++) {
333 iniDetails.beginGroup(ui.listThemes->selectedItems().at(i)->data(Qt::UserRole).toString());
334 zip = SystemInfo::value(SystemInfo::ThemesUrl).toString()
335 + "/" + iniDetails.value("archive").toString();
336 themes.append(zip);
337 names.append("Theme: " +
338 ui.listThemes->selectedItems().at(i)->data(Qt::DisplayRole).toString());
339 // if no version info is available use installation (current) date
340 version.append(iniDetails.value("version",
341 QDate().currentDate().toString("yyyyMMdd")).toString());
342 iniDetails.endGroup();
344 qDebug() << "[Themes] installing:" << themes;
346 if(logger == NULL)
347 logger = new ProgressLoggerGui(this);
348 logger->show();
349 QString mountPoint = RbSettings::value(RbSettings::Mountpoint).toString();
350 qDebug() << "[Themes] mountpoint:" << mountPoint;
351 // show dialog with error if mount point is wrong
352 if(!QFileInfo(mountPoint).isDir()) {
353 logger->addItem(tr("Mount point is wrong!"),LOGERROR);
354 logger->setFinished();
355 return;
358 installer = new ZipInstaller(this);
359 installer->setUrl(themes);
360 installer->setLogSection(names);
361 installer->setLogVersion(version);
362 installer->setMountPoint(mountPoint);
363 if(!RbSettings::value(RbSettings::CacheDisabled).toBool())
364 installer->setCache(true);
366 if(!windowSelectOnly) {
367 connect(logger, SIGNAL(closed()), this, SLOT(close()));
368 connect(installer, SIGNAL(done(bool)), logger, SLOT(setFinished()));
370 connect(installer, SIGNAL(logItem(QString, int)), logger, SLOT(addItem(QString, int)));
371 connect(installer, SIGNAL(logProgress(int, int)), logger, SLOT(setProgress(int, int)));
372 connect(installer, SIGNAL(done(bool)), this, SIGNAL(done(bool)));
373 connect(logger, SIGNAL(aborted()), installer, SLOT(abort()));
374 installer->install();
378 void ThemesInstallWindow::changeEvent(QEvent *e)
380 if(e->type() == QEvent::LanguageChange) {
381 ui.retranslateUi(this);
382 } else {
383 QWidget::changeEvent(e);