//============================================================================ // // File : PackAddonDialog.cpp // Creation date : Sat 03 May 2008 01:40:44 by Elvio Basello // // This file is part of the KVIrc IRC Client distribution // Copyright (C) 2008-2009 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 "PackAddonDialog.h" #include "AddonFunctions.h" #include "KviLocale.h" #include "KviFileUtils.h" #include "KviApplication.h" #include "KviIconManager.h" #include "KviPackageWriter.h" #include "kvi_fileextensions.h" #include "kvi_sourcesdate.h" #include "KviOptions.h" #include #include #include #include #include #include PackAddonDialog::PackAddonDialog(QWidget * pParent) : QWizard(pParent) { setMinimumSize(400,350); setObjectName("addon_package_wizard"); setOption(QWizard::IndependentPages,true); setWindowTitle(__tr2qs_ctx("Create Addon Package - KVIrc","addon")); 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","addon")); QLabel * pLabel = new QLabel(pPage); pLabel->setWordWrap(true); pLabel->setText(__tr2qs_ctx("This procedure allows you to export the selected addon to a single package. It is useful when you want to distribute your addon to the public.","addon")); pLayout->addWidget(pLabel); pLabel = new QLabel(pPage); pLabel->setWordWrap(true); QString szText; szText += __tr2qs_ctx("You will be asked to provide some information like the package name, the version, a description and so on.","addon"); szText += "

"; szText += __tr2qs_ctx("Hit the \"Next\" button to begin.","addon"); pLabel->setText(szText); pLayout->addWidget(pLabel); pPage->setMinimumWidth(350); addPage(pPage); // Packager information m_pPackAddonInfoPackageWidget = new PackAddonInfoPackageWidget(this); addPage(m_pPackAddonInfoPackageWidget); // File selection m_pPackAddonFileSelectionWidget = new PackAddonFileSelectionWidget(this); addPage(m_pPackAddonFileSelectionWidget); // Save selection m_pPackAddonSaveSelectionWidget = new PackAddonSaveSelectionWidget(this); addPage(m_pPackAddonSaveSelectionWidget); // Summary info m_pPackAddonSummaryInfoWidget = new PackAddonSummaryInfoWidget(this); addPage(m_pPackAddonSummaryInfoWidget); } PackAddonDialog::~PackAddonDialog() { } void PackAddonDialog::accept() { if(!packAddon()) return; QWizard::accept(); } bool PackAddonDialog::packAddon() { // Get data from registered fields AddonInfo info; info.szAuthor = field("packageAuthor").toString(); info.szName = field("packageName").toString(); info.szVersion = field("packageVersion").toString(); info.szDescription = field("packageDescription").toString(); info.szMinVersion = field("packageMinVersion").toString(); info.szImage = field("packageImage").toString(); info.szDirPath = field("packageDirPath").toString(); info.szSavePath = field("packageSavePath").toString(); if(info.szSavePath.isEmpty()) { info.szSavePath = QDir::homePath(); KviQString::ensureLastCharIs(info.szSavePath,QChar(KVI_PATH_SEPARATOR_CHAR)); info.szSavePath += m_szName; info.szSavePath += "-"; info.szSavePath += m_szVersion; info.szSavePath += KVI_FILEEXTENSION_ADDONPACKAGE; } if(QFile::exists(info.szSavePath)) { if(QMessageBox::question( this, __tr2qs_ctx("Export Addon - KVIrc","addon"), __tr2qs_ctx("File %1 already exists. Do you want to overwrite it?","addon").arg(info.szSavePath), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::No) return false; } // Raise the files summary dialog m_pPackAddonSummaryFilesWidget = new PackAddonSummaryFilesWidget(this); m_pPackAddonSummaryFilesWidget->setPath(info.szDirPath); if(m_pPackAddonSummaryFilesWidget->exec() == QDialog::Rejected) { delete m_pPackAddonSummaryFilesWidget; return false; } QString szError; if(!AddonFunctions::pack(info,szError)) { QMessageBox::critical(this, __tr2qs_ctx("Addon Packaging Error","addon"), szError,QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton ); return false; } QMessageBox::information(this,__tr2qs_ctx("Export Addon - KVIrc","addon"),__tr2qs_ctx("Package saved successfully in %1","addon").arg(m_szSavePath),QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); return true; } PackAddonInfoPackageWidget::PackAddonInfoPackageWidget(PackAddonDialog * pParent) : QWizardPage(pParent) { setObjectName("addon_package_info_page"); setTitle(__tr2qs_ctx("Package Information","addon")); setSubTitle(__tr2qs_ctx("Here you need to provide information about you (the packager) and a short description of the package you're creating.","addon")); QGridLayout * pLayout = new QGridLayout(this); QLabel * pLabel = new QLabel(this); pLabel->setText(__tr2qs_ctx("Package &Author:","addon")); pLayout->addWidget(pLabel,0,0); m_pPackageAuthorEdit = new QLineEdit(this); m_pPackageAuthorEdit->setText(__tr2qs_ctx("Your name here","addon")); pLabel->setBuddy(m_pPackageAuthorEdit); pLayout->addWidget(m_pPackageAuthorEdit,0,1); pLabel = new QLabel(this); pLabel->setText(__tr2qs_ctx("Package &Name:","addon")); pLayout->addWidget(pLabel,1,0); m_pPackageNameEdit = new QLineEdit(this); m_pPackageNameEdit->setText(__tr2qs_ctx("No spaces allowed, like MyAddon","addon")); pLabel->setBuddy(m_pPackageNameEdit); pLayout->addWidget(m_pPackageNameEdit,1,1); pLabel = new QLabel(this); pLabel->setText(__tr2qs_ctx("Package &Version:","addon")); pLayout->addWidget(pLabel,2,0); m_pPackageVersionEdit = new QLineEdit(this); m_pPackageVersionEdit->setText(__tr2qs_ctx("Version in the form x.y[.z], like 1.0 or 2.0.3","addon")); pLabel->setBuddy(m_pPackageVersionEdit); pLayout->addWidget(m_pPackageVersionEdit,2,1); pLabel = new QLabel(this); pLabel->setText(__tr2qs_ctx("Package &Description:","addon")); pLayout->addWidget(pLabel,3,0); m_pPackageDescriptionEdit = new QLineEdit(this); m_pPackageDescriptionEdit->setText(QString()); pLabel->setBuddy(m_pPackageDescriptionEdit); pLayout->addWidget(m_pPackageDescriptionEdit,3,1); pLabel = new QLabel(this); pLabel->setText(__tr2qs_ctx("Minimum &KVIrc Version:","addon")); pLayout->addWidget(pLabel,4,0); m_pPackageMinVersionEdit = new QLineEdit(this); m_pPackageMinVersionEdit->setText(KVI_VERSION); pLabel->setBuddy(m_pPackageMinVersionEdit); pLayout->addWidget(m_pPackageMinVersionEdit,4,1); // Store data in the fields registerField("packageAuthor*",m_pPackageAuthorEdit); registerField("packageName*",m_pPackageNameEdit); registerField("packageVersion*",m_pPackageVersionEdit); registerField("packageDescription*",m_pPackageDescriptionEdit); registerField("packageMinVersion",m_pPackageMinVersionEdit); } PackAddonInfoPackageWidget::~PackAddonInfoPackageWidget() { } PackAddonFileSelectionWidget::PackAddonFileSelectionWidget(PackAddonDialog * pParent) : QWizardPage(pParent) { setObjectName("addon_package_file_page"); setTitle(__tr2qs_ctx("Package Files","addon")); setSubTitle(__tr2qs_ctx("Here you need to select the directory where the addon files are.","addon")); QVBoxLayout * pLayout = new QVBoxLayout(this); // Select source directory m_pDirPathSelector = new KviDirectorySelector(this,__tr2qs_ctx("Select the source directory:","addon"),&m_szDirPath,true,KviFileSelector::VerticalLayout); pLayout->addWidget(m_pDirPathSelector); // Select addon icon m_pPackageImageEdit = new KviFileSelector(this,__tr2qs_ctx("Select the image file:","addon"),&m_szPackageImage,true,KviFileSelector::VerticalLayout,KVI_FILTER_IMAGE); pLayout->addWidget(m_pPackageImageEdit); // Store data in the fields registerField("packageDirPath*",m_pDirPathSelector); registerField("packageImage*",m_pPackageImageEdit); } PackAddonFileSelectionWidget::~PackAddonFileSelectionWidget() { } PackAddonSaveSelectionWidget::PackAddonSaveSelectionWidget(PackAddonDialog * pParent) : QWizardPage(pParent) { setObjectName("addon_package_save_page"); setTitle(__tr2qs_ctx("Save Package","addon")); setSubTitle(__tr2qs_ctx("Here you need to provide the path where to save the addon package","addon")); QVBoxLayout * pLayout = new QVBoxLayout(this); // Select save path m_pSavePathSelector = new KviFileSelector( this, __tr2qs_ctx("Select save path:","addon"), &m_szFilePath, true, KviFileSelector::ChooseSaveFileName | KviFileSelector::VerticalLayout, KVI_FILTER_ADDON ); pLayout->addWidget(m_pSavePathSelector); // Store data in the fields registerField("packageSavePath*",m_pSavePathSelector); } PackAddonSaveSelectionWidget::~PackAddonSaveSelectionWidget() { } void PackAddonSaveSelectionWidget::initializePage() { // Get data from registered fields QString szName = field("packageName").toString(); QString szVersion = field("packageVersion").toString(); // Create addon name QString szSavePath = QDir::homePath(); KviQString::ensureLastCharIs(szSavePath,QChar(KVI_PATH_SEPARATOR_CHAR)); szSavePath += szName; szSavePath += "-"; szSavePath += szVersion; szSavePath += KVI_FILEEXTENSION_ADDONPACKAGE; m_pSavePathSelector->setTmpFile(szSavePath); } PackAddonSummaryInfoWidget::PackAddonSummaryInfoWidget(PackAddonDialog * pParent) : QWizardPage(pParent) { setObjectName("addon_package_summary_info_page"); setTitle(__tr2qs_ctx("Final Information","addon")); setSubTitle(__tr2qs_ctx("Here there are the information you provided. If these information are correct, hit the \"Finish\" button to complete the packaging operations.","addon")); QVBoxLayout * pLayout = new QVBoxLayout(this); m_pLabelInfo = new QLabel(this); pLayout->addWidget(m_pLabelInfo); } PackAddonSummaryInfoWidget::~PackAddonSummaryInfoWidget() { } void PackAddonSummaryInfoWidget::initializePage() { // Get data from registered fields QString szAuthor = field("packageAuthor").toString(); QString szName = field("packageName").toString(); QString szVersion = field("packageVersion").toString(); QString szDescription = field("packageDescription").toString(); QString szMinVersion = field("packageMinVersion").toString(); QString szImage = field("packageImage").toString(); QString szDirPath = field("packageDirPath").toString(); QString szSavePath = field("packageSavePath").toString(); QString szText = __tr2qs_ctx("This is what I will check for:","addon"); szText += "

"; szText += __tr2qs_ctx("Package Author","addon"); szText += ": "; szText += szAuthor; szText += "
"; szText += __tr2qs_ctx("Package Name","addon"); szText += ": "; szText += szName; szText += "
"; szText += __tr2qs_ctx("Package Version","addon"); szText += ": "; szText += szVersion; szText += "
"; szText += __tr2qs_ctx("Package Description","addon"); szText += ": "; szText += szDescription; szText += "
"; szText += __tr2qs_ctx("Minimum KVIrc Version","addon"); szText += ": "; szText += szMinVersion; szText += "
"; szText += __tr2qs_ctx("Image File","addon"); szText += ": "; szText += szImage; szText += "
"; szText += __tr2qs_ctx("Source Directory","addon"); szText += ": "; szText += szDirPath; szText += "
"; szText += __tr2qs_ctx("Save Path","addon"); szText += ": "; szText += szSavePath; m_pLabelInfo->setText(szText); } PackAddonSummaryFilesWidget::PackAddonSummaryFilesWidget(PackAddonDialog * pParent) : QDialog(pParent) { setObjectName("addon_package_summary_file_dialog"); setWindowTitle(__tr2qs_ctx("File Summary","addon")); setWindowModality(Qt::WindowModal); setModal(true); QVBoxLayout * pLayout = new QVBoxLayout(this); QLabel * pLabel = new QLabel(this); pLabel->setText(__tr2qs_ctx("Here there are the files I found in the directories you provided.\nIf these and the information showed in the previous page are correct, hit the \"Finish\" button to complete\nthe packaging operations.","addon")); pLayout->addWidget(pLabel); m_pFiles = new QTextEdit(this); m_pFiles->setReadOnly(true); pLayout->addWidget(m_pFiles); KviTalHBox * pBox = new KviTalHBox(this); QPushButton * pCancel = new QPushButton(pBox); pCancel->setText(__tr2qs_ctx("Cancel","addon")); connect(pCancel,SIGNAL(clicked()),this,SLOT(reject())); QPushButton * pAccept = new QPushButton(pBox); pAccept->setText(__tr2qs_ctx("Finish","addon")); connect(pAccept,SIGNAL(clicked()),this,SLOT(accept())); pLayout->addWidget(pBox); } PackAddonSummaryFilesWidget::~PackAddonSummaryFilesWidget() { } void PackAddonSummaryFilesWidget::accept() { QDialog::accept(); } void PackAddonSummaryFilesWidget::reject() { QDialog::reject(); } void PackAddonSummaryFilesWidget::showEvent(QShowEvent *) { QStringList list; QDirIterator it(m_szPath,QDir::AllEntries | QDir::NoDotAndDotDot,QDirIterator::Subdirectories); // Iterate through the addon dir and its subdirs while(it.hasNext()) { QString szStr = it.next(); if(!szStr.contains("/.")) list.append(szStr); } // QDirIterator does not support sorting, so do it manually list.sort(); m_pFiles->setPlainText(list.join("\n")); }