//============================================================================= // // File : PackThemeDialog.cpp // Creation date : Wed 03 Jan 2007 01:11:44 by Szymon Stefanek // // This file is part of the KVIrc IRC Client distribution // Copyright (C) 2007-2010 Szymon Stefanek // Copyright (C) 2010 Elvio Basello // // This program is FREE software. You can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the HOPE that it will be USEFUL, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, write to the Free Software Foundation, // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // //============================================================================= #include "PackThemeDialog.h" #include "ThemeFunctions.h" #include "KviOptions.h" #include "KviLocale.h" #include "KviConfigurationFile.h" #include "KviFileUtils.h" #include "KviApplication.h" #include "KviMainWindow.h" #include "KviIconManager.h" #include "KviPackageWriter.h" #include "kvi_fileextensions.h" #include "KviSelectors.h" #include "KviMiscUtils.h" #include "kvi_sourcesdate.h" #include #include #include #include #include #include #include #include #include #include //#include //#include //#include PackThemeDialog::PackThemeDialog(QWidget * pParent, KviPointerList * pThemeInfoList) : QWizard(pParent) { setWindowTitle(__tr2qs_ctx("Export Theme - KVIrc", "theme")); setMinimumSize(400, 350); setDefaultProperty("QTextEdit", "plainText", SIGNAL(textChanged())); m_pThemeInfoList = pThemeInfoList; QPixmap * pSide = g_pIconManager->getBigIcon("kvi_setup_label.png"); QPixmap * pLogo = g_pIconManager->getBigIcon("kvi_bigicon_addons.png"); #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) #if(_WIN32_WINNT >= 0x0600) // We are on a Windows Vista / Seven // It will fallback to XP if alpha compositing is disabled setWizardStyle(QWizard::AeroStyle); #else // Windows XP setWizardStyle(QWizard::ModernStyle); setPixmap(QWizard::WatermarkPixmap, *pSide); setPixmap(QWizard::LogoPixmap, *pLogo); #endif #elif defined(COMPILE_ON_MAC) setWizardStyle(QWizard::MacStyle); setPixmap(QWizard::BackgroundPixmap, *pSide); #else // All other systems setWizardStyle(QWizard::ClassicStyle); setPixmap(QWizard::WatermarkPixmap, *pSide); setPixmap(QWizard::LogoPixmap, *pLogo); #endif // Add a default property for file selectors setDefaultProperty("KviFileSelector", "tmpFile", SIGNAL(selectionChanged(const QString &))); // Welcome page QWizardPage * pPage = new QWizardPage(this); QVBoxLayout * pLayout = new QVBoxLayout(pPage); pPage->setLayout(pLayout); pPage->setTitle(__tr2qs_ctx("Welcome", "theme")); QString szText = "

"; szText += __tr2qs_ctx("This procedure allows you to export the selected themes to a single package. It is useful when you want to distribute your themes to the public.", "theme"); szText += "

"; szText += __tr2qs_ctx("You will be asked to provide a package name, a description and, if you want, an icon/screenshot.", "theme"); szText += "

"; szText += __tr2qs_ctx("Hit the \"Next\" button to begin.", "theme"); szText += "

"; QLabel * pLabel = new QLabel(pPage); pLabel->setWordWrap(true); pLabel->setText(szText); pLayout->addWidget(pLabel); addPage(pPage); // Theme data m_pPackThemeDataWidget = new PackThemeDataWidget(this); addPage(m_pPackThemeDataWidget); // Packager information m_pPackThemeInfoWidget = new PackThemeInfoWidget(this); addPage(m_pPackThemeInfoWidget); // Screenshot/logo/icon m_pPackThemeImageWidget = new PackThemeImageWidget(this); addPage(m_pPackThemeImageWidget); // Save file name m_pPackThemeSaveWidget = new PackThemeSaveWidget(this); addPage(m_pPackThemeSaveWidget); //last thing to do before starting m_pPackThemeDataWidget->parseThemes(m_pThemeInfoList); } PackThemeDataWidget::PackThemeDataWidget(PackThemeDialog * pParent) : QWizardPage(pParent) { setObjectName("theme_package_data_page"); setTitle(__tr2qs_ctx("Theme Data", "theme")); setSubTitle(__tr2qs_ctx("This is the information list for the themes you're packaging. If it looks OK press \"Next\" to continue, otherwise press \"Cancel\" and review your themes first.", "theme")); } void PackThemeDataWidget::parseThemes(KviPointerList * pThemeInfoList) { QString szPackageName; QString szPackageAuthor; QString szPackageDescription; QString szPackageVersion; KviThemeInfo * pThemeInfo = 0; bool bPackagePathSet = false; QString szPackagePath = QDir::homePath(); KviQString::ensureLastCharIs(szPackagePath, QChar(KVI_PATH_SEPARATOR_CHAR)); if(pThemeInfoList->count() > 1) { szPackageName = "MyThemes"; szPackageAuthor = __tr2qs_ctx("Your name here", "theme"); szPackageVersion = "1.0.0"; szPackageDescription = __tr2qs_ctx("Enter a package description here...", "theme"); } else { if(pThemeInfoList->count() > 0) { pThemeInfo = pThemeInfoList->first(); szPackageName = pThemeInfo->subdirectory(); szPackageAuthor = pThemeInfo->author(); szPackageDescription = pThemeInfo->description(); szPackageVersion = pThemeInfo->version(); szPackagePath += pThemeInfo->subdirectory(); if(szPackagePath.indexOf(QRegExp("[0-9]\\.[0-9]")) == -1) { szPackagePath += "-"; szPackagePath += szPackageVersion; } szPackagePath += KVI_FILEEXTENSION_THEMEPACKAGE; bPackagePathSet = true; } } if(!bPackagePathSet) { szPackagePath += szPackageName; szPackagePath += "-"; szPackagePath += szPackageVersion; szPackagePath += KVI_FILEEXTENSION_THEMEPACKAGE; } QVBoxLayout * pLayout = new QVBoxLayout(this); QString szThemesDescription = ""; int iIdx = 0; QPixmap pixScreenshot; QString szScreenshotPath; for(pThemeInfo = pThemeInfoList->first(); pThemeInfo; pThemeInfo = pThemeInfoList->next()) { QString szThemeDescription; if(pixScreenshot.isNull()) { pixScreenshot = pThemeInfo->smallScreenshot(); if(!pixScreenshot.isNull()) szScreenshotPath = pThemeInfo->smallScreenshotPath(); } ThemeFunctions::getThemeHtmlDescription( szThemeDescription, pThemeInfo->name(), pThemeInfo->version(), pThemeInfo->description(), pThemeInfo->subdirectory(), pThemeInfo->application(), pThemeInfo->author(), pThemeInfo->date(), pThemeInfo->themeEngineVersion(), pThemeInfo->smallScreenshot(), iIdx); if(iIdx > 0) szThemesDescription += "


"; szThemesDescription += szThemeDescription; iIdx++; } szThemesDescription += ""; QTextEdit * pTextEdit = new QTextEdit(this); pTextEdit->setBackgroundRole(QPalette::Window); pTextEdit->setReadOnly(true); QTextDocument * pDoc = new QTextDocument(pTextEdit); pDoc->setHtml(szThemesDescription); pTextEdit->setDocument(pDoc); pLayout->addWidget(pTextEdit); setField("packageName", QVariant(szPackageName)); setField("packageVersion", szPackageVersion); setField("packageDescription", szPackageDescription); setField("packageAuthor", szPackageAuthor); } PackThemeDataWidget::~PackThemeDataWidget() { } PackThemeInfoWidget::PackThemeInfoWidget(PackThemeDialog * pParent) : QWizardPage(pParent) { setObjectName("theme_package_info_page"); setTitle(__tr2qs_ctx("Package Information", "theme")); setSubTitle(__tr2qs_ctx("Here you need to provide information about you (the packager) and a short description of the package you're creating.", "theme")); QGridLayout * pLayout = new QGridLayout(this); QLabel * pLabel = new QLabel(this); pLabel->setText(__tr2qs_ctx("Package name:", "theme")); pLayout->addWidget(pLabel, 1, 0); m_pPackageNameEdit = new QLineEdit(this); pLabel->setBuddy(m_pPackageNameEdit); pLayout->addWidget(m_pPackageNameEdit, 1, 1); pLabel = new QLabel(this); pLabel->setText(__tr2qs_ctx("Version:", "theme")); pLayout->addWidget(pLabel, 2, 0); m_pPackageVersionEdit = new QLineEdit(this); pLabel->setBuddy(m_pPackageVersionEdit); pLayout->addWidget(m_pPackageVersionEdit, 2, 1); pLabel = new QLabel(this); pLabel->setText(__tr2qs_ctx("Description:", "theme")); pLayout->addWidget(pLabel, 3, 0); m_pPackageDescriptionEdit = new QTextEdit(this); pLabel->setBuddy(m_pPackageDescriptionEdit); pLayout->addWidget(m_pPackageDescriptionEdit, 3, 1); pLabel = new QLabel(this); pLabel->setText(__tr2qs_ctx("Package author:", "theme")); pLayout->addWidget(pLabel, 4, 0); m_pPackageAuthorEdit = new QLineEdit(this); pLabel->setBuddy(m_pPackageAuthorEdit); pLayout->addWidget(m_pPackageAuthorEdit, 4, 1); pLayout->setRowStretch(3, 1); pLayout->setColumnStretch(1, 1); // Store data in the fields registerField("packageName*", m_pPackageNameEdit); registerField("packageVersion*", m_pPackageVersionEdit); registerField("packageDescription*", m_pPackageDescriptionEdit); registerField("packageAuthor*", m_pPackageAuthorEdit); } void PackThemeInfoWidget::initializePage() { QString szPackageName = field("packageName").toString(); QString szPackageVersion = field("packageVersion").toString(); QString szPackageDescription = field("packageDescription").toString(); QString szPackageAuthor = field("packageAuthor").toString(); m_pPackageNameEdit->setText(szPackageName); m_pPackageVersionEdit->setText(szPackageVersion); m_pPackageDescriptionEdit->setText(szPackageDescription); m_pPackageAuthorEdit->setText(szPackageAuthor); } PackThemeInfoWidget::~PackThemeInfoWidget() { } PackThemeImageWidget::PackThemeImageWidget(PackThemeDialog * pParent) : QWizardPage(pParent) { setObjectName("theme_package_image_page"); setTitle(__tr2qs_ctx("Icon/Screenshot", "theme")); setSubTitle(__tr2qs_ctx("Here you can choose the image that will appear in the installation dialog for your theme package. It can be an icon, a logo or a screenshot and it should be not larger than 300x225. If you don't provide an image a simple default icon will be used at installation stage.", "theme")); QVBoxLayout * pLayout = new QVBoxLayout(this); m_pImageLabel = new QLabel(this); m_pImageLabel->setFrameStyle(QFrame::Sunken | QFrame::Panel); m_pImageLabel->setMinimumSize(300, 225); m_pImageLabel->setAlignment(Qt::AlignCenter | Qt::AlignVCenter); pLayout->addWidget(m_pImageLabel); m_pImageSelector = new KviFileSelector(this, "", &m_szImagePath, true, 0, KVI_FILTER_IMAGE); connect(m_pImageSelector, SIGNAL(selectionChanged(const QString &)), this, SLOT(imageSelectionChanged(const QString &))); pLayout->addWidget(m_pImageSelector); // Store data in the fields registerField("packageImagePath*", m_pImageSelector); //m_pImageSelectionPage = pPage; } PackThemeImageWidget::~PackThemeImageWidget() { } void PackThemeImageWidget::imageSelectionChanged(const QString & szImagePath) { QImage pix(szImagePath); if(!pix.isNull()) { QPixmap out; if(pix.width() > 300 || pix.height() > 225) { pix = pix.scaled(300, 225, Qt::KeepAspectRatio, Qt::SmoothTransformation); out = out.fromImage(pix); } else { out = out.fromImage(pix); } m_pImageLabel->setPixmap(out); return; } QMessageBox::critical(this, __tr2qs_ctx("Export Theme - KVIrc", "theme"), __tr2qs_ctx("Failed to load the selected image!", "theme"), QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); m_pImageSelector->setSelection(""); m_pImageLabel->setPixmap(QPixmap()); } PackThemeSaveWidget::PackThemeSaveWidget(PackThemeDialog * pParent) : QWizardPage(pParent) { setObjectName("theme_package_save_page"); setTitle(__tr2qs_ctx("Package Path", "theme")); setSubTitle(__tr2qs_ctx("Here you must choose the file name for the theme package. It should have a *%1 extension.", "theme").arg(KVI_FILEEXTENSION_THEMEPACKAGE)); QVBoxLayout * pLayout = new QVBoxLayout(this); QString szFilter = "*"; szFilter += KVI_FILEEXTENSION_THEMEPACKAGE; m_pSavePathSelector = new KviFileSelector(this, "", &m_szPackagePath, true, KviFileSelector::ChooseSaveFileName, szFilter); pLayout->addWidget(m_pSavePathSelector); QLabel * pLabel = new QLabel(this); pLabel->setWordWrap(true); pLabel->setText(__tr2qs_ctx("Finally hit the \"Finish\" button to complete the packaging operation.", "theme")); pLayout->addWidget(pLabel); // Store data in the fields registerField("packageSavePath*", m_pSavePathSelector); } PackThemeSaveWidget::~PackThemeSaveWidget() { } void PackThemeSaveWidget::initializePage() { m_szPackagePath = field("packageSavePath").toString(); } #if 0 if(!szScreenshotPath.isEmpty()) { m_pImageSelector->setSelection(szScreenshotPath); imageSelectionChanged(szScreenshotPath); } } #endif PackThemeDialog::~PackThemeDialog() { } void PackThemeDialog::accept() { if(!packTheme()) return; QWizard::accept(); } bool PackThemeDialog::packTheme() { //m_pImageSelector->commit(); //m_pPathSelector->commit(); // Get data from registered fields m_szAuthor = field("packageAuthor").toString(); m_szName = field("packageName").toString(); m_szVersion = field("packageVersion").toString(); m_szDescription = field("packageDescription").toString(); m_szImagePath = field("packageImagePath").toString(); m_szPackagePath = field("packageSavePath").toString(); QString szError; if(!ThemeFunctions::packageThemes( m_szPackagePath, m_szName, m_szVersion, m_szDescription, m_szAuthor, m_szImagePath, *m_pThemeInfoList, szError)) { QMessageBox::critical(this, __tr2qs_ctx("Export Theme - KVIrc", "theme"), szError, QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); return false; } QMessageBox::information(this, __tr2qs_ctx("Exporting Theme - KVIrc", "theme"), __tr2qs("Theme package saved successfully."), QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); return true; }