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 ++++++++++++++++++++++++++++++++++++ rbutil/rbutilqt/installthemes.h | 72 +++++++++ rbutil/rbutilqt/installthemesfrm.ui | 133 ++++++++++++++++ rbutil/rbutilqt/installzip.cpp | 3 +- rbutil/rbutilqt/rbutil.ini | 3 +- rbutil/rbutilqt/rbutilqt.cpp | 20 ++- rbutil/rbutilqt/rbutilqt.h | 1 + rbutil/rbutilqt/rbutilqt.pro | 4 +- rbutil/rbutilqt/settings.h | 0 9 files changed, 527 insertions(+), 5 deletions(-) create mode 100644 rbutil/rbutilqt/installthemes.cpp create mode 100644 rbutil/rbutilqt/installthemes.h create mode 100644 rbutil/rbutilqt/installthemesfrm.ui delete mode 100644 rbutil/rbutilqt/settings.h 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())); +} + diff --git a/rbutil/rbutilqt/installthemes.h b/rbutil/rbutilqt/installthemes.h new file mode 100644 index 0000000000..da6ad86485 --- /dev/null +++ b/rbutil/rbutilqt/installthemes.h @@ -0,0 +1,72 @@ +/*************************************************************************** + * __________ __ ___. + * 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. + * + ****************************************************************************/ + +#ifndef INSTALLTHEMES_H +#define INSTALLTHEMES_H + +#include +#include + +#include "ui_installthemesfrm.h" +#include "httpget.h" +#include "installzip.h" +#include "progressloggergui.h" + +class ThemesInstallWindow : public QDialog +{ + Q_OBJECT + + public: + ThemesInstallWindow(QWidget* parent = 0); + void setDeviceSettings(QSettings*); + void setUserSettings(QSettings *); + void setProxy(QUrl); + void downloadInfo(void); + void show(void); + void accept(void); + + public slots: + + private: + Ui::ThemeInstallFrm ui; + QSettings *devices; + QSettings *userSettings; + HttpGet *getter; + HttpGet igetter; + QTemporaryFile themesInfo; + QString resolution(void); + QUrl proxy; + int currentItem; + void resizeEvent(QResizeEvent*); + QByteArray imgData; + ProgressLoggerGui *logger; + ZipInstaller *installer; + QString file; + QString fileName; + + private slots: + void downloadDone(bool); + void downloadDone(int, bool); + void updateDetails(int); + void updateImage(bool); + void abort(void); +}; + + +#endif diff --git a/rbutil/rbutilqt/installthemesfrm.ui b/rbutil/rbutilqt/installthemesfrm.ui new file mode 100644 index 0000000000..42d0550d00 --- /dev/null +++ b/rbutil/rbutilqt/installthemesfrm.ui @@ -0,0 +1,133 @@ + + ThemeInstallFrm + + + + 0 + 0 + 750 + 450 + + + + Theme Installation + + + + + + + + + :/icons/icons/wizard.xpm + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Selected Theme + + + + + + + 0 + 0 + + + + + + + true + + + Qt::AlignCenter + + + + + + + Description + + + + + + + + + + Download size: + + + + + + + + + + Qt::Horizontal + + + + 368 + 20 + + + + + + + + + + &Ok + + + :/icons/icons/go-next.png + + + + + + + &Cancel + + + :/icons/icons/process-stop.png + + + + + + + + + + + + diff --git a/rbutil/rbutilqt/installzip.cpp b/rbutil/rbutilqt/installzip.cpp index 14e1feb55f..1ca976752a 100644 --- a/rbutil/rbutilqt/installzip.cpp +++ b/rbutil/rbutilqt/installzip.cpp @@ -46,6 +46,7 @@ void ZipInstaller::installContinue() qDebug() << "installContinue()"; runner++; // this gets called when a install finished, so increase first. + qDebug() << "runner is now at" << runner << "size is" << m_urllist.size(); if(runner < m_urllist.size()) { qDebug() << "==> runner at" << runner; m_dp->addItem(tr("done."), LOGOK); @@ -196,7 +197,7 @@ void ZipInstaller::updateDataReadProgress(int read, int total) { m_dp->setProgressMax(total); m_dp->setProgressValue(read); - qDebug() << "progress:" << read << "/" << total; + //qDebug() << "progress:" << read << "/" << total; } diff --git a/rbutil/rbutilqt/rbutil.ini b/rbutil/rbutilqt/rbutil.ini index 5e8b61bf72..d617f0fb98 100644 --- a/rbutil/rbutilqt/rbutil.ini +++ b/rbutil/rbutilqt/rbutil.ini @@ -8,7 +8,8 @@ font_url=http://www.rockbox.org/daily/fonts/rockbox-fonts.zip last_release=2.5 prog_name=rockbox bootloader_url=http://download.rockbox.org/bootloader -themes_url=http://www.rockbox-themes.org/ +themes_url=http://copy.rockbox-themes.org +#themes_url=http://www.rockbox-themes.org manual_url=http://download.rockbox.org/manual doom_url=http://download.rockbox.org/useful/rockdoom.zip voice_url=http://www.rockbox.org/voices/ diff --git a/rbutil/rbutilqt/rbutilqt.cpp b/rbutil/rbutilqt/rbutilqt.cpp index fc03ba754e..39bac3bc36 100644 --- a/rbutil/rbutilqt/rbutilqt.cpp +++ b/rbutil/rbutilqt/rbutilqt.cpp @@ -28,6 +28,7 @@ #include "installtalkwindow.h" #include "httpget.h" #include "installbootloader.h" +#include "installthemes.h" #include "uninstallwindow.h" #include "browseof.h" @@ -81,11 +82,10 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent) connect(ui.buttonGames, SIGNAL(clicked()), this, SLOT(installDoom())); connect(ui.buttonTalk, SIGNAL(clicked()), this, SLOT(createTalkFiles())); connect(ui.buttonVoice, SIGNAL(clicked()), this, SLOT(installVoice())); + connect(ui.buttonThemes, SIGNAL(clicked()), this, SLOT(installThemes())); connect(ui.buttonRemoveRockbox, SIGNAL(clicked()), this, SLOT(uninstall())); connect(ui.buttonRemoveBootloader, SIGNAL(clicked()), this, SLOT(uninstallBootloader())); - // disable unimplemented stuff - ui.buttonThemes->setEnabled(false); ui.buttonSmall->setEnabled(false); ui.buttonComplete->setEnabled(false); @@ -439,6 +439,22 @@ void RbUtilQt::installDoom() } +void RbUtilQt::installThemes() +{ + ThemesInstallWindow* tw = new ThemesInstallWindow(this); + tw->setDeviceSettings(devices); + tw->setUserSettings(userSettings); + if(userSettings->value("defaults/proxytype") == "manual") + tw->setProxy(QUrl(userSettings->value("defaults/proxy").toString())); +#ifdef __linux + else if(userSettings->value("defaults/proxytype") == "system") + tw->setProxy(QUrl(getenv("http_proxy"))); +#endif + tw->setModal(true); + tw->show(); +} + + void RbUtilQt::createTalkFiles(void) { InstallTalkWindow *installWindow = new InstallTalkWindow(this); diff --git a/rbutil/rbutilqt/rbutilqt.h b/rbutil/rbutilqt/rbutilqt.h index 62a7aac3bd..19e7920859 100644 --- a/rbutil/rbutilqt/rbutilqt.h +++ b/rbutil/rbutilqt/rbutilqt.h @@ -66,6 +66,7 @@ class RbUtilQt : public QMainWindow void downloadDone(int, bool); void downloadInfo(void); void installVoice(void); + void installThemes(void); void uninstall(void); void uninstallBootloader(void); }; diff --git a/rbutil/rbutilqt/rbutilqt.pro b/rbutil/rbutilqt/rbutilqt.pro index 40e205b147..708dde052d 100644 --- a/rbutil/rbutilqt/rbutilqt.pro +++ b/rbutil/rbutilqt/rbutilqt.pro @@ -30,12 +30,12 @@ SOURCES += rbutilqt.cpp \ irivertools/irivertools.cpp \ irivertools/md5sum.cpp \ browsedirtree.cpp \ + installthemes.cpp \ uninstall.cpp \ uninstallwindow.cpp \ browseof.cpp HEADERS += rbutilqt.h \ - settings.h \ install.h \ httpget.h \ configure.h \ @@ -64,6 +64,7 @@ HEADERS += rbutilqt.h \ irivertools/h300sums.h \ irivertools/checksums.h \ browsedirtree.h \ + installthemes.h \ uninstall.h \ uninstallwindow.h \ browseof.h @@ -85,6 +86,7 @@ FORMS += rbutilqtfrm.ui \ configurefrm.ui \ browsedirtreefrm.ui \ installtalkfrm.ui \ + installthemesfrm.ui \ uninstallfrm.ui \ browseoffrm.ui diff --git a/rbutil/rbutilqt/settings.h b/rbutil/rbutilqt/settings.h deleted file mode 100644 index e69de29bb2..0000000000 -- cgit v1.2.3