diff options
| author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2009-03-31 19:50:43 +0000 |
|---|---|---|
| committer | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2009-03-31 19:50:43 +0000 |
| commit | 270106d151af76140737a080f2ff50db9b3fbfbe (patch) | |
| tree | 5d8cf5e64fdffd19ef8939ffbb0f9cfc14c9c308 /rbutil/rbutilqt/themesinstallwindow.cpp | |
| parent | e2c69c59c45aa890aa6b5ae22a3c4a7939ec7b2d (diff) | |
| download | rockbox-270106d151af76140737a080f2ff50db9b3fbfbe.zip rockbox-270106d151af76140737a080f2ff50db9b3fbfbe.tar.gz rockbox-270106d151af76140737a080f2ff50db9b3fbfbe.tar.bz2 rockbox-270106d151af76140737a080f2ff50db9b3fbfbe.tar.xz | |
Rename ThemeInstall class files to actually match the class name.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20594 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'rbutil/rbutilqt/themesinstallwindow.cpp')
| -rw-r--r-- | rbutil/rbutilqt/themesinstallwindow.cpp | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/rbutil/rbutilqt/themesinstallwindow.cpp b/rbutil/rbutilqt/themesinstallwindow.cpp new file mode 100644 index 0000000..fb3fbe4 --- /dev/null +++ b/rbutil/rbutilqt/themesinstallwindow.cpp @@ -0,0 +1,335 @@ +/*************************************************************************** + * __________ __ ___. + * 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 <QtGui> + +#include "ui_themesinstallfrm.h" +#include "themesinstallwindow.h" +#include "installzip.h" +#include "progressloggergui.h" +#include "utils.h" + +ThemesInstallWindow::ThemesInstallWindow(QWidget *parent) : QDialog(parent) +{ + ui.setupUi(this); + ui.listThemes->setAlternatingRowColors(true); + ui.listThemes->setSelectionMode(QAbstractItemView::ExtendedSelection); + ui.listThemes->setSortingEnabled(true); + ui.themePreview->clear(); + ui.themePreview->setText(tr("no theme selected")); + ui.labelSize->setText(tr("no selection")); + + connect(ui.buttonCancel, SIGNAL(clicked()), this, SLOT(close())); + connect(ui.buttonOk, SIGNAL(clicked()), this, SLOT(accept())); + connect(ui.listThemes, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), + this, SLOT(updateDetails(QListWidgetItem*, QListWidgetItem*))); + connect(ui.listThemes, SIGNAL(itemSelectionChanged()), this, SLOT(updateSize())); + connect(&igetter, SIGNAL(done(bool)), this, SLOT(updateImage(bool))); +} + +ThemesInstallWindow::~ThemesInstallWindow() +{ + if(infocachedir!="") + recRmdir(infocachedir); +} + + +void ThemesInstallWindow::downloadInfo() +{ + // try to get the current build information + getter = new HttpGet(this); + + qDebug() << "downloading themes info"; + themesInfo.open(); + qDebug() << "file:" << themesInfo.fileName(); + themesInfo.close(); + + QUrl url; + url = QUrl(settings->themeUrl() + "/rbutilqt.php?target=" + + settings->curConfigure_Modelname()); + qDebug() << "downloadInfo()" << url; + qDebug() << url.queryItems(); + if(settings->cacheOffline()) + getter->setCache(true); + getter->setFile(&themesInfo); + + connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool))); + connect(logger, SIGNAL(aborted()), getter, SLOT(abort())); + 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() << iniDetails.value("error/code").toString() + << iniDetails.value("error/description").toString() + << iniDetails.value("error/query").toString(); + + if(error) { + logger->addItem(tr("Network error: %1.\n" + "Please 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()) { + iniDetails.endGroup(); + continue; + } + qDebug() << "adding theme:" << tl.at(i); + 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(); + } + // check if there's a themes "MOTD" available + if(iniDetails.contains("status/msg")) { + // check if there's a localized msg available + QString lang = settings->curLang().split("_").at(0); + QString msg; + if(iniDetails.contains("status/msg." + lang)) + msg = iniDetails.value("status/msg." + lang).toString(); + else + msg = iniDetails.value("status/msg").toString(); + qDebug() << "[Themes] MOTD" << msg; + if(!msg.isEmpty()) + QMessageBox::information(this, tr("Information"), msg); + } +} + + +void ThemesInstallWindow::updateSize(void) +{ + long size = 0; + // sum up size for all selected themes + QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this); + int items = ui.listThemes->selectedItems().size(); + for(int i = 0; i < items; i++) { + iniDetails.beginGroup(ui.listThemes->selectedItems() + .at(i)->data(Qt::UserRole).toString()); + size += iniDetails.value("size").toInt(); + iniDetails.endGroup(); + } + ui.labelSize->setText(tr("Download size %L1 kiB (%n item(s))", "", items) + .arg((size + 512) / 1024)); +} + + +void ThemesInstallWindow::updateDetails(QListWidgetItem* cur, QListWidgetItem* prev) +{ + if(cur == prev) + return; + + QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this); + + QCoreApplication::processEvents(); + ui.themeDescription->setText(tr("fetching details for %1") + .arg(cur->data(Qt::DisplayRole).toString())); + ui.themePreview->clear(); + ui.themePreview->setText(tr("fetching preview ...")); + + iniDetails.beginGroup(cur->data(Qt::UserRole).toString()); + + QUrl img, txt; + txt = QUrl(QString(settings->themeUrl() + "/" + + iniDetails.value("descriptionfile").toString())); + img = QUrl(QString(settings->themeUrl() + "/" + + iniDetails.value("image").toString())); + + QString text; + text = tr("<b>Author:</b> %1<hr/>").arg(iniDetails.value("author", + tr("unknown")).toString()); + text += tr("<b>Version:</b> %1<hr/>").arg(iniDetails.value("version", + tr("unknown")).toString()); + text += tr("<b>Description:</b> %1<hr/>").arg(iniDetails.value("about", + tr("no description")).toString()); + + ui.themeDescription->setHtml(text); + iniDetails.endGroup(); + + igetter.abort(); + if(!settings->cacheDisabled()) + igetter.setCache(true); + else + { + if(infocachedir=="") + { + infocachedir = QDir::tempPath() + "rbutil-themeinfo"; + QDir d = QDir::temp(); + d.mkdir("rbutil-themeinfo"); + } + igetter.setCache(infocachedir); + } + + igetter.getFile(img); +} + + +void ThemesInstallWindow::updateImage(bool error) +{ + qDebug() << "updateImage(bool) =" << error; + + if(error) { + ui.themePreview->clear(); + ui.themePreview->setText(tr("Retrieving theme preview failed.\n" + "HTTP response code: %1").arg(igetter.httpResponse())); + return; + } + + QPixmap p; + if(!error) { + imgData = igetter.readAll(); + if(imgData.isNull()) return; + p.loadFromData(imgData); + if(p.isNull()) { + ui.themePreview->clear(); + ui.themePreview->setText(tr("no theme preview")); + } + else + ui.themePreview->setPixmap(p); + } +} + + +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(p); +} + + + +void ThemesInstallWindow::show() +{ + QDialog::show(); + logger = new ProgressLoggerGui(this); + logger->show(); + logger->addItem(tr("getting themes information ..."), LOGINFO); + + connect(logger, SIGNAL(aborted()), this, SLOT(close())); + + downloadInfo(); + +} + + +void ThemesInstallWindow::abort() +{ + igetter.abort(); + logger->abort(); + this->close(); +} + + +void ThemesInstallWindow::accept() +{ + if(ui.listThemes->selectedItems().size() == 0) { + this->close(); + return; + } + QStringList themes; + QStringList names; + QStringList version; + 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 = settings->themeUrl() + + "/" + iniDetails.value("archive").toString(); + themes.append(zip); + names.append("Theme: " + + ui.listThemes->selectedItems().at(i)->data(Qt::DisplayRole).toString()); + // if no version info is available use installation (current) date + version.append(iniDetails.value("version", + QDate().currentDate().toString("yyyyMMdd")).toString()); + iniDetails.endGroup(); + } + qDebug() << "installing themes:" << themes; + + logger = new ProgressLoggerGui(this); + logger->show(); + QString mountPoint = settings->mountpoint(); + qDebug() << "mountpoint:" << mountPoint; + // 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->setLogSection(names); + installer->setLogVersion(version); + installer->setMountPoint(mountPoint); + if(!settings->cacheDisabled()) + installer->setCache(true); + + connect(logger, SIGNAL(closed()), this, SLOT(close())); + installer->install(logger); + +} + |