From 653b996828428370d21ea5fad92ca5790f017019 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Wed, 15 Aug 2007 21:54:15 +0000 Subject: 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 --- rbutil/rbutilqt/installthemes.cpp | 296 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 rbutil/rbutilqt/installthemes.cpp (limited to 'rbutil/rbutilqt/installthemes.cpp') 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 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2007 by Dominik Riebeling + * $Id$ + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include + +#include "ui_installthemesfrm.h" +#include "installthemes.h" +#include "installzip.h" +#include "progressloggergui.h" + + +ThemesInstallWindow::ThemesInstallWindow(QWidget *parent) : QDialog(parent) +{ + ui.setupUi(this); + ui.listThemes->setAlternatingRowColors(true); + ui.listThemes->setSelectionMode(QAbstractItemView::ExtendedSelection); + ui.themePreview->clear(); + ui.themePreview->setText(tr("no theme selected")); + + connect(ui.buttonCancel, SIGNAL(clicked()), this, SLOT(close())); + connect(ui.buttonOk, SIGNAL(clicked()), this, SLOT(accept())); +} + + +QString ThemesInstallWindow::resolution() +{ + QString resolution; + devices->beginGroup(userSettings->value("defaults/platform").toString()); + resolution = devices->value("resolution").toString(); + devices->endGroup(); + return resolution; +} + + +void ThemesInstallWindow::setDeviceSettings(QSettings *dev) +{ + devices = dev; + qDebug() << "setDeviceSettings()" << devices; +} + + +void ThemesInstallWindow::setUserSettings(QSettings *user) +{ + userSettings = user; +} + + +void ThemesInstallWindow::downloadInfo() +{ + // try to get the current build information + getter = new HttpGet(this); + connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool))); + + qDebug() << "downloading themes info"; + themesInfo.open(); + qDebug() << "file:" << themesInfo.fileName(); + themesInfo.close(); + + QUrl url; + url = QUrl(devices->value("themes_url").toString() + "/rbutilqt.php?res=" + resolution()); + qDebug() << "downloadInfo()" << url; + qDebug() << url.queryItems(); + getter->setProxy(proxy); + getter->setFile(&themesInfo); + getter->getFile(url); +} + + +void ThemesInstallWindow::downloadDone(int id, bool error) +{ + downloadDone(error); + qDebug() << "downloadDone(bool) =" << id << error; +} + + +void ThemesInstallWindow::downloadDone(bool error) +{ + qDebug() << "downloadDone(bool) =" << error; + + disconnect(logger, SIGNAL(aborted()), getter, SLOT(abort())); + disconnect(logger, SIGNAL(aborted()), this, SLOT(close())); + themesInfo.open(); + + QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this); + QStringList tl = iniDetails.childGroups(); + qDebug() << tl.size(); + qDebug() << iniDetails.value("error/code").toString() + << iniDetails.value("error/description").toString() + << iniDetails.value("error/query").toString(); + + if(error) { + logger->addItem(tr("Network error: %1.\nPlease check your network and proxy settings.") + .arg(getter->errorString()), LOGERROR); + getter->abort(); + logger->abort(); + disconnect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool))); + connect(logger, SIGNAL(closed()), this, SLOT(close())); + return; + } + // handle possible error codes + if(iniDetails.value("error/code").toInt() != 0 || !iniDetails.contains("error/code")) { + qDebug() << "error!"; + logger->addItem(tr("the following error occured:\n%1") + .arg(iniDetails.value("error/description", "unknown error").toString()), LOGERROR); + logger->abort(); + connect(logger, SIGNAL(closed()), this, SLOT(close())); + return; + } + logger->addItem(tr("done."), LOGOK); + logger->abort(); + logger->close(); + + // setup list + for(int i = 0; i < tl.size(); i++) { + iniDetails.beginGroup(tl.at(i)); + // skip all themes without name field set (i.e. error section) + if(iniDetails.value("name").toString().isEmpty()) continue; + QListWidgetItem *w = new QListWidgetItem; + w->setData(Qt::DisplayRole, iniDetails.value("name").toString()); + w->setData(Qt::UserRole, tl.at(i)); + ui.listThemes->addItem(w); + + iniDetails.endGroup(); + } + connect(ui.listThemes, SIGNAL(currentRowChanged(int)), this, SLOT(updateDetails(int))); +} + + +void ThemesInstallWindow::updateDetails(int row) +{ + if(row == currentItem) return; + + currentItem = row; + qDebug() << "updateDetails(int) =" << row; + QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this); + ui.themeDescription->setText(tr("fetching details for %1") + .arg(ui.listThemes->item(row)->data(Qt::DisplayRole).toString())); + ui.themePreview->clear(); + ui.themePreview->setText(tr("fetching preview ...")); + + int size = 0; + + iniDetails.beginGroup(ui.listThemes->item(row)->data(Qt::UserRole).toString()); + size += iniDetails.value("size").toInt(); + qDebug() << ui.listThemes->item(row)->data(Qt::UserRole).toString() << size; + iniDetails.endGroup(); + ui.labelSize->setText(tr("Download size %1 kiB").arg(size)); + + iniDetails.beginGroup(ui.listThemes->item(row)->data(Qt::UserRole).toString()); + + QUrl img, txt; + txt = QUrl(QString(devices->value("themes_url").toString() + "/" + + iniDetails.value("descriptionfile").toString())); + img = QUrl(QString(devices->value("themes_url").toString() + "/" + + iniDetails.value("image").toString())); + qDebug() << "txt:" << txt; + qDebug() << "img:" << img; + + QString text; + text = tr("Author: %1
").arg(iniDetails.value("author", tr("unknown")).toString()); + text += tr("Version: %1
").arg(iniDetails.value("version", tr("unknown")).toString()); + text += tr("Description: %1
").arg(iniDetails.value("about", tr("no description")).toString()); + ui.themeDescription->setHtml(text); + iniDetails.endGroup(); + + igetter.abort(); + igetter.setProxy(proxy); + igetter.getFile(img); + connect(&igetter, SIGNAL(done(bool)), this, SLOT(updateImage(bool))); +} + + +void ThemesInstallWindow::updateImage(bool error) +{ + qDebug() << "updateImage(bool) =" << error; + if(error) return; + + QPixmap p, q; + QSize img; + img.setHeight(ui.themePreview->height()); + img.setWidth(ui.themePreview->width()); + if(!error) { + imgData = igetter.readAll(); + if(imgData.isNull()) return; + p.loadFromData(imgData); + q = p.scaled(img, Qt::KeepAspectRatio, Qt::SmoothTransformation); + ui.themePreview->setScaledContents(false); + if(q.isNull()) { + ui.themePreview->clear(); + ui.themePreview->setText(tr("no theme preview")); + } + else ui.themePreview->setPixmap(q); + } +} + + +void ThemesInstallWindow::resizeEvent(QResizeEvent* e) +{ + qDebug() << "resizeEvent(QResizeEvent*) =" << e; + + QPixmap p, q; + QSize img; + img.setHeight(ui.themePreview->height()); + img.setWidth(ui.themePreview->width()); + + p.loadFromData(imgData); + if(p.isNull()) return; + q = p.scaled(img, Qt::KeepAspectRatio, Qt::SmoothTransformation); + ui.themePreview->setScaledContents(false); + ui.themePreview->setPixmap(q); +} + + + +void ThemesInstallWindow::show() +{ + downloadInfo(); + QDialog::show(); + logger = new ProgressLoggerGui(this); + logger->show(); + logger->addItem(tr("getting themes information ..."), LOGINFO); + connect(logger, SIGNAL(aborted()), getter, SLOT(abort())); + connect(logger, SIGNAL(aborted()), this, SLOT(close())); +} + + +void ThemesInstallWindow::abort() +{ + igetter.abort(); + logger->abort(); + this->close(); +} + + +void ThemesInstallWindow::setProxy(QUrl p) +{ + proxy = p; + qDebug() << "setProxy()" << proxy; +} + + +void ThemesInstallWindow::accept() +{ + if(ui.listThemes->selectedItems().size() == 0) { + this->close(); + return; + } + QStringList themes; + QStringList names; + QString zip; + QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this); + for(int i = 0; i < ui.listThemes->selectedItems().size(); i++) { + iniDetails.beginGroup(ui.listThemes->selectedItems().at(i)->data(Qt::UserRole).toString()); + zip = devices->value("themes_url").toString() + "/" + iniDetails.value("archive").toString(); + themes.append(zip); + names.append("Theme: " + ui.listThemes->selectedItems().at(i)->data(Qt::DisplayRole).toString()); + iniDetails.endGroup(); + } + qDebug() << "installing themes:" << themes; + + logger = new ProgressLoggerGui(this); + logger->show(); + QString mountPoint = userSettings->value("defaults/mountpoint").toString(); + qDebug() << "mountpoint:" << userSettings->value("defaults/mountpoint").toString(); + // show dialog with error if mount point is wrong + if(!QFileInfo(mountPoint).isDir()) { + logger->addItem(tr("Mount point is wrong!"),LOGERROR); + logger->abort(); + return; + } + + installer = new ZipInstaller(this); + installer->setUrl(themes); + installer->setProxy(proxy); + installer->setLogSection(names); + installer->setMountPoint(mountPoint); + installer->install(logger); + connect(logger, SIGNAL(closed()), this, SLOT(close())); +} + -- cgit v1.2.3