diff options
| author | 2007-01-10 01:34:47 +0000 | |
|---|---|---|
| committer | 2007-01-10 01:34:47 +0000 | |
| commit | c7caa2579263eb0ec07625627e9d090f1292a0b0 (patch) | |
| tree | e6744b330ed28b0a319edd172a86c605de68a99d /src/modules/theme | |
| parent | ctrl+w, alt+backspace shortcuts (diff) | |
| download | KVIrc-c7caa2579263eb0ec07625627e9d090f1292a0b0.tar.gz KVIrc-c7caa2579263eb0ec07625627e9d090f1292a0b0.tar.bz2 KVIrc-c7caa2579263eb0ec07625627e9d090f1292a0b0.zip | |
More work on the themeing engine
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@150 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/modules/theme')
| -rw-r--r-- | src/modules/theme/Makefile.am | 22 | ||||
| -rw-r--r-- | src/modules/theme/libkvitheme.cpp | 14 | ||||
| -rw-r--r-- | src/modules/theme/managementdialog.cpp | 834 | ||||
| -rw-r--r-- | src/modules/theme/managementdialog.h | 69 | ||||
| -rw-r--r-- | src/modules/theme/packthemedialog.cpp | 456 | ||||
| -rw-r--r-- | src/modules/theme/packthemedialog.h | 65 | ||||
| -rw-r--r-- | src/modules/theme/savethemedialog.cpp | 173 | ||||
| -rw-r--r-- | src/modules/theme/savethemedialog.h | 62 | ||||
| -rw-r--r-- | src/modules/theme/themefunctions.cpp | 240 | ||||
| -rw-r--r-- | src/modules/theme/themefunctions.h | 39 |
10 files changed, 1114 insertions, 860 deletions
diff --git a/src/modules/theme/Makefile.am b/src/modules/theme/Makefile.am index fba495058..5417e9e5e 100644 --- a/src/modules/theme/Makefile.am +++ b/src/modules/theme/Makefile.am @@ -9,12 +9,28 @@ pluglib_LTLIBRARIES = libkvitheme.la libkvitheme_la_LDFLAGS = -module -avoid-version $(SS_LDFLAGS) $(SS_LIBDIRS) -libkvitheme_la_SOURCES = libkvitheme.cpp managementdialog.cpp -nodist_libkvitheme_la_SOURCES = moc_managementdialog.cpp +libkvitheme_la_SOURCES = libkvitheme.cpp \ + managementdialog.cpp \ + packthemedialog.cpp \ + savethemedialog.cpp \ + themefunctions.cpp + +nodist_libkvitheme_la_SOURCES = moc_managementdialog.cpp \ + moc_packthemedialog.cpp \ + moc_savethemedialog.cpp libkvitheme_la_LIBADD = $(SS_LIBLINK) ../../kvilib/build/libkvilib.la -noinst_HEADERS= managementdialog.h +noinst_HEADERS= managementdialog.h \ + packthemedialog.h \ + savethemedialog.h \ + themefunctions.h moc_managementdialog.cpp: managementdialog.h $(SS_QT_MOC) $< -o $@ + +moc_packthemedialog.cpp: packthemedialog.h + $(SS_QT_MOC) $< -o $@ + +moc_savethemedialog.cpp: savethemedialog.h + $(SS_QT_MOC) $< -o $@ diff --git a/src/modules/theme/libkvitheme.cpp b/src/modules/theme/libkvitheme.cpp index 72b6261a3..12c7786ca 100644 --- a/src/modules/theme/libkvitheme.cpp +++ b/src/modules/theme/libkvitheme.cpp @@ -36,6 +36,7 @@ #include "kvi_sourcesdate.h" #include "managementdialog.h" +#include "themefunctions.h" QRect g_rectManagementDialogGeometry(0,0,0,0); @@ -56,6 +57,19 @@ QRect g_rectManagementDialogGeometry(0,0,0,0); static bool theme_kvs_cmd_install(KviKvsModuleCommandCall * c) { + QString szThemePackFile; + + KVSM_PARAMETERS_BEGIN(c) + KVSM_PARAMETER("package_path",KVS_PT_STRING,0,szThemePackFile) + KVSM_PARAMETERS_END(c) + + QString szError; + if(!KviThemeFunctions::installThemePackage(szThemePackFile,szError)) + { + c->error(__tr2qs_ctx("Error installing theme package: %Q","theme"),&szError); + return false; + } + return true; } diff --git a/src/modules/theme/managementdialog.cpp b/src/modules/theme/managementdialog.cpp index 17822fe0c..3f96ab13b 100644 --- a/src/modules/theme/managementdialog.cpp +++ b/src/modules/theme/managementdialog.cpp @@ -29,7 +29,10 @@ #define LVI_MINIMUM_CELL_WIDTH (LVI_MINIMUM_TEXT_WIDTH + LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING + LVI_BORDER) #include "managementdialog.h" -#include "kvi_xmladdonloader.h" +#include "packthemedialog.h" +#include "savethemedialog.h" +#include "themefunctions.h" + #include "kvi_iconmanager.h" #include "kvi_msgbox.h" @@ -71,676 +74,6 @@ extern QRect g_rectManagementDialogGeometry; -KviSaveThemeDialog::KviSaveThemeDialog(QWidget * par) -: QDialog(par) -{ - setCaption(__tr2qs_ctx("Save Current Theme","theme")); - - QGridLayout * g = new QGridLayout(this,8,2,4,4); - - QLabel * l; - - l = new QLabel(__tr2qs_ctx("Theme name:","theme"),this); - g->addWidget(l,0,0); - - m_pThemeNameEdit = new QLineEdit(this); - g->addMultiCellWidget(m_pThemeNameEdit,0,0,1,2); - connect(m_pThemeNameEdit,SIGNAL(textChanged(const QString &)),this,SLOT(themeNameChanged(const QString &))); - - - l = new QLabel(__tr2qs_ctx("Version:","theme"),this); - g->addWidget(l,1,0); - - m_pVersionEdit = new QLineEdit(this); - g->addMultiCellWidget(m_pVersionEdit,1,1,1,2); - - - l = new QLabel(__tr2qs_ctx("Author:","theme"),this); - g->addWidget(l,2,0); - - m_pAuthorEdit = new QLineEdit(this); - g->addMultiCellWidget(m_pAuthorEdit,2,2,1,2); - - l = new QLabel(__tr2qs_ctx("Description:","theme"),this); - g->addWidget(l,3,0); - - m_pDescriptionEdit = new QTextEdit(this); - g->addMultiCellWidget(m_pDescriptionEdit,3,4,1,2); - - m_pIncludeMsgcolors = new KviStyledCheckBox( __tr2qs_ctx("Include message colors information","theme"), this ); - m_pIncludeMsgcolors->setChecked(TRUE); - g->addMultiCellWidget(m_pIncludeMsgcolors,5,5,0,1); - -// l = new QLabel(__tr2qs_ctx("Package type:","theme"),this); -// g->addWidget(l,6,0); - -// m_pFormatCombo = new QComboBox(this); -// m_pFormatCombo->insertItem(__tr2qs_ctx("KVIrc Package","theme"),0); -// m_pFormatCombo->insertItem(__tr2qs_ctx("New multi-file format","theme"),1); -// m_pFormatCombo->insertItem(__tr2qs_ctx("Dublicate Theme","theme"),1); -// g->addWidget(m_pFormatCombo,6,1); - - QHBox * h = new QHBox(this); - h->setSpacing(7); - g->addWidget(h,7,2); - m_pOkButton = new QPushButton(__tr2qs_ctx("OK","theme"),h); - m_pOkButton->setEnabled(false); - connect(m_pOkButton,SIGNAL(clicked()),this,SLOT(saveTheme())); - m_pOkButton->setIconSet(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_ACCEPT))); - - QPushButton * pb = new QPushButton(__tr2qs_ctx("Cancel","theme"),h); - connect(pb,SIGNAL(clicked()),this,SLOT(reject())); - pb->setIconSet(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_DISCARD))); - -} - -KviSaveThemeDialog::~KviSaveThemeDialog() -{ - -} - -void KviSaveThemeDialog::themeNameChanged(const QString &txt) -{ - m_pOkButton->setEnabled(!txt.isEmpty()); -} - -void KviSaveThemeDialog::saveThemeInOldFormat(KviThemeInfo& sto) -{ - if(!KviFileUtils::directoryExists(sto.szAbsoluteDirectory)) - { - g_pApp->getLocalKvircDirectory(sto.szAbsoluteDirectory,KviApp::Themes,sto.szSubdirectory,true); - if(!KviFileUtils::makeDir(sto.szAbsoluteDirectory)) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Unable to create theme directory.","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - } - g_pApp->saveTheme(sto); - // write down the images - - QString szMsg = __tr2qs_ctx("Theme saved successfully to ","theme"); - szMsg += sto.szAbsoluteDirectory; - - QMessageBox::information(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),szMsg,QMessageBox::Ok, - QMessageBox::NoButton,QMessageBox::NoButton); -} - -void KviSaveThemeDialog::saveThemeInNewFormat(KviThemeInfo& sto) -{ - QString szBaseDir; - QFileDialog * d = new QFileDialog(this); - d->setCaption(__tr2qs_ctx("Choose save directory","theme")); - d->setMode(QFileDialog::DirectoryOnly); - if(d->exec() == QDialog::Accepted) - { - szBaseDir = d->selectedFile(); - KviFileUtils::adjustFilePath(szBaseDir); - delete d; - if(szBaseDir.isEmpty()) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must select save directory","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - } else { - delete d; - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must select save directory","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - KviQString::ensureLastCharIs(szBaseDir,KVI_PATH_SEPARATOR_CHAR); - sto.szAbsoluteDirectory=szBaseDir+sto.szSubdirectory; - KviQString::ensureLastCharIs(sto.szAbsoluteDirectory,KVI_PATH_SEPARATOR_CHAR); - QString szThemeDir=sto.szAbsoluteDirectory; - sto.szAbsoluteDirectory+="files"; - - if(!KviFileUtils::makeDir(sto.szAbsoluteDirectory)) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Unable to create theme files directory.","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - - g_pApp->saveTheme(sto); - - if(!KviFileUtils::makeDir(szThemeDir+"utils")) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Unable to create theme utils directory.","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - - QString szInstallerScript; - g_pApp->getGlobalKvircDirectory(szInstallerScript,KviApp::DefScript,"installer.kvs"); - if(!KviFileUtils::fileExists(szInstallerScript)) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Cannot find installer.kvs.","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - - if(!KviFileUtils::copyFile(szInstallerScript,szThemeDir+"utils/installer.kvs")) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Cannot write installer.kvs.","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - - g_pApp->getGlobalKvircDirectory(szInstallerScript,KviApp::DefScript,"theme-install.kvs"); - QString szMainScript=szThemeDir+"install.kvs"; - if(!KviFileUtils::copyFile(szInstallerScript,szMainScript)) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Cannot write install.kvs.","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - QFile installFile(szMainScript); - if(!installFile.open(IO_ReadOnly)) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Cannot open install.kvs for reading.","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - - QCString szFileContents; - szFileContents=installFile.readAll(); - installFile.close(); - - sto.szName.replace("\"","\\\""); - - szFileContents.replace("@THEMENAME@",sto.szName.utf8().data()); -// szFileContents.replace("@THEMENAME@",sto.szName.utf8().data()); - sto.szDescription.replace("\"","\\\""); - if(sto.szDescription.isEmpty()) sto.szDescription="empty"; - szFileContents.replace("@THEMEDESCRIPTION@",sto.szDescription.utf8().data()); - sto.szVersion.replace("\"","\\\""); - szFileContents.replace("@THEMEVERSION@",sto.szVersion.utf8().data()); - szFileContents.replace("@SUBDIR@",sto.szSubdirectory.utf8().data()); - - QString szAliasName=""; - QString m_szId; - - struct timeval tv; - kvi_gettimeofday(&tv,0); - - KviQString::sprintf(m_szId,"theme_%d%d%d",tv.tv_usec,rand() % 1000,rand() % 1000); - szAliasName.prepend(m_szId); - szFileContents.replace("@ALIASNAME@",szAliasName.utf8().data()); - if(!installFile.open(IO_WriteOnly)) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Cannot open install.kvs for writing.","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - installFile.writeBlock(szFileContents.data(),szFileContents.length()); - installFile.close(); - - QString szMsg = __tr2qs_ctx("Theme saved successfully to ","theme"); - szMsg += szThemeDir; - - QMessageBox::information(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),szMsg,QMessageBox::Ok, - QMessageBox::NoButton,QMessageBox::NoButton); -} - -void KviSaveThemeDialog::saveThemeInXmlFormat(KviThemeInfo& sto) -{ - QString szFilename; - QFileDialog * d = new QFileDialog(this); - d->setCaption(__tr2qs_ctx("Choose filaname","theme")); - d->setMode(QFileDialog::AnyFile); - d->setFilter( "KVIrc Packages (*.kvp)" ); - if(d->exec() == QDialog::Accepted) - { - szFilename = d->selectedFile(); - KviFileUtils::adjustFilePath(szFilename); - delete d; - if(szFilename.isEmpty()) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must select filename","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - } else { - delete d; - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must select filename","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - if(QFileInfo(szFilename).extension()!="kvp") szFilename.append(".kvp"); - g_pApp->saveXmlTheme(sto,szFilename); -} - -void KviSaveThemeDialog::saveTheme() -{ - KviThemeInfo sto; - sto.szName = m_pThemeNameEdit->text(); - if(sto.szName.isEmpty()) - { - QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must choose a theme name!","theme"),QMessageBox::Ok, - QMessageBox::NoButton,QMessageBox::NoButton); - return; - } - - sto.szAuthor = m_pAuthorEdit->text(); - sto.szDescription = m_pDescriptionEdit->text(); - sto.szDate = QDateTime::currentDateTime().toString(); - sto.szVersion = m_pVersionEdit->text(); - sto.szKvircVersion = KVI_VERSION; - sto.bIncludeMsgColors=m_pIncludeMsgcolors->isChecked(); - - if(sto.szVersion.isEmpty())sto.szVersion = "1.0.0"; - - sto.szSubdirectory = sto.szName + QString("-") + sto.szVersion; - sto.szSubdirectory.replace(QRegExp("[ \\\\/:][ \\\\/:]*"),"_"); - -/* - switch(m_pFormatCombo->currentItem()) - { - case 0: - saveThemeInXmlFormat(sto); - break; - case 1: - saveThemeInNewFormat(sto); - break; - case 2:*/ - saveThemeInOldFormat(sto); -/* break; - } -*/ - accept(); -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -KviPackThemeDialog::KviPackThemeDialog(QWidget * pParent,KviPtrList<KviThemeInfo> * pThemeInfoList) -: QWizard(pParent) -{ - m_pThemeInfoList = pThemeInfoList; - - KviThemeInfo * pThemeInfo; - QString szPackageName; - QString szPackageAuthor; - QString szPackageDescription; - QString szPackageVersion; - if(m_pThemeInfoList->count() > 1) - { - szPackageName = "MyThemes"; - szPackageAuthor = __tr2qs_ctx("Your name here","theme"); - szPackageVersion = "1.0"; - szPackageDescription = __tr2qs_ctx("Put a package description here...","theme"); - } else { - if(m_pThemeInfoList->count() > 0) - { - pThemeInfo = m_pThemeInfoList->first(); - szPackageName = pThemeInfo->szSubdirectory; - szPackageAuthor = pThemeInfo->szAuthor; - szPackageDescription = pThemeInfo->szDescription; - szPackageVersion = pThemeInfo->szVersion; - } - } - - - setCaption(__tr2qs_ctx("Export Theme - KVIrc","theme")); - setMinimumSize(400,350); - - // welcome page ================================================================================== - QWidget * pPage = new QWidget(this); - QGridLayout * pLayout = new QGridLayout(pPage,2,1,4,4); - - QLabel * pLabel = new QLabel(pPage); - QString szText = "<p>"; - 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 += "</p><p>"; - szText += __tr2qs_ctx("You will be asked to provide a package name, a description and, if you want, an icon/screenshot.","theme"); - szText += "</p><p>"; - szText += __tr2qs_ctx("Hit the \"Next\" button to begin.","theme"); - szText += "<p>"; - - pLabel->setText(szText); - pLayout->addWidget(pLabel,0,0); - pLayout->setRowStretch(1,1); - - addPage(pPage,__tr2qs_ctx("Welcome","theme")); - setBackEnabled(pPage,false); - setNextEnabled(pPage,true); - setHelpEnabled(pPage,false); - setFinishEnabled(pPage,false); - - // theme data name ================================================================================ - - pPage = new QWidget(this); - pLayout = new QGridLayout(pPage,2,1,4,4); - - pLabel = new QLabel(pPage); - pLabel->setText(__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 rewiew your themes first.","theme")); - pLabel->setTextFormat(Qt::RichText); - pLayout->addWidget(pLabel,0,0); - - QString szAuthor = __tr2qs_ctx("Author","theme"); - QString szCreatedAt = __tr2qs_ctx("Created at","theme"); - QString szCreatedOn = __tr2qs_ctx("Created on","theme"); - QString szSubdirectory = __tr2qs_ctx("Subdirectory","theme"); - - QString szThemesDescription = "<html><body bgcolor=\"#ffffff\">"; - - int iIdx = 0; - for(pThemeInfo = m_pThemeInfoList->first();pThemeInfo;pThemeInfo = m_pThemeInfoList->next()) - { - QString szThemeDescription; - KviQString::sprintf( - szThemeDescription, - "<p>" \ - "<h2>%Q %Q</h2>" \ - "</p>" \ - "<p>" \ - "<i>%Q</i>" \ - "</p>" \ - "<p>" \ - "%Q: <b>%Q</b><br>" \ - "%Q: <b>%Q</b><br>" \ - "</p>" \ - "<p>" \ - "<font color=\"#808080\">" \ - "%Q: KVIrc %Q<br>" \ - "%Q: %Q<br>" \ - "</font>" \ - "</p>", - &(pThemeInfo->szName), - &(pThemeInfo->szVersion), - &(pThemeInfo->szDescription), - &szAuthor, - &(pThemeInfo->szAuthor), - &szCreatedAt, - &(pThemeInfo->szDate), - &szCreatedOn, - &(pThemeInfo->szKvircVersion), - &szSubdirectory, - &(pThemeInfo->szSubdirectory) - ); - if(iIdx > 0) - szThemesDescription += "<hr>"; - szThemesDescription += szThemeDescription; - iIdx++; - } - - szThemesDescription += "</body></html>"; - - QTextEdit * pTextEdit = new QTextEdit(pPage); - pTextEdit->setPaper(QBrush(QColor(255,255,255))); - pTextEdit->setReadOnly(true); - pTextEdit->setText(szThemesDescription); - pLayout->addWidget(pTextEdit,1,0); - pLayout->setRowStretch(1,1); - - addPage(pPage,__tr2qs_ctx("Theme Data","theme")); - setBackEnabled(pPage,true); - setHelpEnabled(pPage,false); - setNextEnabled(pPage,true); - setFinishEnabled(pPage,false); - - // packager informations ================================================================================ - - pPage = new QWidget(this); - pLayout = new QGridLayout(pPage,5,2,4,4); - - pLabel = new QLabel(pPage); - pLabel->setText(__tr2qs_ctx("Here you need to provide informations about you (the packager) and a short description of the package you're creating.","theme")); - pLabel->setTextFormat(Qt::RichText); - pLayout->addMultiCellWidget(pLabel,0,0,0,1); - - pLabel = new QLabel(pPage); - pLabel->setText(__tr2qs_ctx("Package Name:","theme")); - pLayout->addWidget(pLabel,1,0); - - m_pPackageNameEdit = new QLineEdit(pPage); - m_pPackageNameEdit->setText(szPackageName); - pLayout->addWidget(m_pPackageNameEdit,1,1); - - pLabel = new QLabel(pPage); - pLabel->setText(__tr2qs_ctx("Version:","theme")); - pLayout->addWidget(pLabel,2,0); - - m_pPackageVersionEdit = new QLineEdit(pPage); - m_pPackageVersionEdit->setText(szPackageVersion); - pLayout->addWidget(m_pPackageVersionEdit,2,1); - - pLabel = new QLabel(pPage); - pLabel->setText(__tr2qs_ctx("Description:","theme")); - pLayout->addWidget(pLabel,3,0); - - m_pPackageDescriptionEdit = new QMultiLineEdit(pPage); - m_pPackageDescriptionEdit->setText(szPackageDescription); - pLayout->addWidget(m_pPackageDescriptionEdit,3,1); - - pLabel = new QLabel(pPage); - pLabel->setText(__tr2qs_ctx("Package Author:","theme")); - pLayout->addWidget(pLabel,4,0); - - m_pPackagerNameEdit = new QLineEdit(pPage); - m_pPackagerNameEdit->setText(szPackageAuthor); - pLayout->addWidget(m_pPackagerNameEdit,4,1); - - - pLayout->setRowStretch(3,1); - pLayout->setColStretch(1,1); - - addPage(pPage,__tr2qs_ctx("Package Informations","theme")); - setBackEnabled(pPage,true); - setHelpEnabled(pPage,false); - setNextEnabled(pPage,true); - setFinishEnabled(pPage,false); - - // screenshot/logo/icon ================================================================================ - - pPage = new QWidget(this); - pLayout = new QGridLayout(pPage,3,1,4,4); - - pLabel = new QLabel(pPage); - pLabel->setText(__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")); - pLabel->setTextFormat(Qt::RichText); - pLayout->addWidget(pLabel,0,0); - - m_pImageLabel = new QLabel(pPage); - m_pImageLabel->setFrameStyle(QFrame::Sunken | QFrame::Panel); - m_pImageLabel->setMinimumSize(300,225); - m_pImageLabel->setAlignment(Qt::AlignCenter | Qt::AlignVCenter); - pLayout->addWidget(m_pImageLabel,1,0); - - QString szFilter = "*.png *.jpg *.xpm"; - m_pImageSelector = new KviFileSelector(pPage,"",&m_szImagePath,true,0,szFilter); - connect(m_pImageSelector,SIGNAL(selectionChanged(const QString &)),this,SLOT(imageSelectionChanged(const QString &))); - pLayout->addWidget(m_pImageSelector,2,0); - pLayout->setRowStretch(1,1); - - m_pImageSelectionPage = pPage; - addPage(pPage,__tr2qs_ctx("Icon/Screenshot","theme")); - setBackEnabled(pPage,true); - setHelpEnabled(pPage,false); - setNextEnabled(pPage,true); - setFinishEnabled(pPage,false); - - // save file name ================================================================================ - - pPage = new QWidget(this); - pLayout = new QGridLayout(pPage,4,1,4,4); - - pLabel = new QLabel(pPage); - pLabel->setText(__tr2qs_ctx("Here you must choose the file name for the theme package. It should have a *.%1 extension.","theme").arg(KVI_FILEEXTENSION_THEMEPACKAGE)); - pLabel->setTextFormat(Qt::RichText); - pLayout->addWidget(pLabel,0,0); - - m_szPackagePath = QDir::homeDirPath(); - KviQString::ensureLastCharIs(m_szPackagePath,QChar(KVI_PATH_SEPARATOR_CHAR)); - - m_szPackagePath += szPackageName; - m_szPackagePath += "-"; - m_szPackagePath += szPackageVersion; - m_szPackagePath += "."; - m_szPackagePath += KVI_FILEEXTENSION_THEMEPACKAGE; - - szFilter = "*."; - szFilter += KVI_FILEEXTENSION_THEMEPACKAGE; - m_pPathSelector = new KviFileSelector(pPage,"",&m_szPackagePath,true,KviFileSelector::ChooseSaveFileName,szFilter); - pLayout->addWidget(m_pPathSelector,1,0); - - pLabel = new QLabel(pPage); - pLabel->setText(__tr2qs_ctx("Finally hit the \"Finish\" button to complete the packaging operation.","theme")); - pLabel->setTextFormat(Qt::RichText); - pLayout->addWidget(pLabel,3,0); - - pLayout->setRowStretch(2,1); - - addPage(pPage,__tr2qs_ctx("Package Path","theme")); - setBackEnabled(pPage,true); - setHelpEnabled(pPage,false); - setNextEnabled(pPage,false); - setFinishEnabled(pPage,true); - -} - -KviPackThemeDialog::~KviPackThemeDialog() -{ -} - -void KviPackThemeDialog::imageSelectionChanged(const QString &szImagePath) -{ - QImage pix(szImagePath); - if(!pix.isNull()) - { - QPixmap out; - if(pix.width() > 300 || pix.height() > 225) - out.convertFromImage(pix.smoothScale(300,225,QImage::ScaleMin)); - else - out.convertFromImage(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()); -} - - -void KviPackThemeDialog::accept() -{ - if(!packTheme())return; - QWizard::accept(); -} - - -bool KviPackThemeDialog::packTheme() -{ - m_pImageSelector->commit(); - m_pPathSelector->commit(); - - QString szPackageAuthor = m_pPackagerNameEdit->text(); - QString szPackageName = m_pPackageNameEdit->text(); - QString szPackageDescription = m_pPackageDescriptionEdit->text(); - QString szPackageVersion = m_pPackageVersionEdit->text(); - - QImage pix(m_szImagePath); - QPixmap out; - if(!pix.isNull()) - { - if(pix.width() > 300 || pix.height() > 225) - out.convertFromImage(pix.smoothScale(300,225,QImage::ScaleMin)); - else - out.convertFromImage(pix); - } else { - if(!m_szImagePath.isEmpty()) - { - QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),__tr2qs_ctx("Failed to load the selected image: please fix it","theme"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - showPage(m_pImageSelectionPage); - return false; - } - } - - KviPackageWriter f; - - QString szTmp = QDateTime::currentDateTime().toString(); - - f.addInfoField("PackageType","ThemePack"); - f.addInfoField("ThemePackVersion","1"); - f.addInfoField("Name",szPackageName); - f.addInfoField("Version",szPackageVersion); - f.addInfoField("Author",szPackageAuthor); - f.addInfoField("Description",szPackageDescription); - f.addInfoField("Date",szTmp); - f.addInfoField("KVIrcVersion",KVI_VERSION); - - if(!out.isNull()) - { - QByteArray * pba = new QByteArray(); - QBuffer buffer(*pba); - buffer.open(IO_WriteOnly); - out.save(&buffer,"PNG"); - buffer.close(); - f.addInfoField("Image",pba); // cool :) [no disk access needed] - } - - szTmp.setNum(m_pThemeInfoList->count()); - f.addInfoField("ThemeCount",szTmp); - - int iIdx = 0; - for(KviThemeInfo * pInfo = m_pThemeInfoList->first();pInfo;pInfo = m_pThemeInfoList->next()) - { - KviQString::sprintf(szTmp,"Theme%dName",iIdx); - f.addInfoField(szTmp,pInfo->szName); - KviQString::sprintf(szTmp,"Theme%dVersion",iIdx); - f.addInfoField(szTmp,pInfo->szVersion); - KviQString::sprintf(szTmp,"Theme%dDescription",iIdx); - f.addInfoField(szTmp,pInfo->szDescription); - KviQString::sprintf(szTmp,"Theme%dDate",iIdx); - f.addInfoField(szTmp,pInfo->szDate); - KviQString::sprintf(szTmp,"Theme%dSubdirectory",iIdx); - f.addInfoField(szTmp,pInfo->szSubdirectory); - KviQString::sprintf(szTmp,"Theme%dAuthor",iIdx); - f.addInfoField(szTmp,pInfo->szAuthor); - KviQString::sprintf(szTmp,"Theme%dKVIrcVersion",iIdx); - f.addInfoField(szTmp,pInfo->szKvircVersion); - if(!f.addDirectory(pInfo->szAbsoluteDirectory,pInfo->szSubdirectory)) - { - szTmp = __tr2qs_ctx("Packaging failed","theme"); - szTmp += ": "; - szTmp += f.lastError(); - QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),szTmp, - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - } - iIdx++; - } - - if(!f.pack(m_szPackagePath)) - { - szTmp = __tr2qs_ctx("Packaging failed","theme"); - szTmp += ": "; - szTmp += f.lastError(); - QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),szTmp, - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - return false; - } - - //KviPackageReader r; - //r.unpack("/root/test.kvt","/root/unpacked_test_kvt"); - - QMessageBox::information(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),__tr2qs("Package saved succesfully"), - QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - - return true; -} - - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - KviThemeListBoxItem::KviThemeListBoxItem(QListBox * box,KviThemeInfo * inf) @@ -749,26 +82,26 @@ KviThemeListBoxItem::KviThemeListBoxItem(QListBox * box,KviThemeInfo * inf) m_pThemeInfo = inf; QString t; t = "<nobr><b>"; - t += inf->szName; + t += inf->name(); t += "</b>"; - if(!inf->szVersion.isEmpty()) { + if(!inf->version().isEmpty()) { t += "["; - t += inf->szVersion; + t += inf->version(); t += "]"; } - if(!inf->szAuthor.isEmpty()) { + if(!inf->author().isEmpty()) { t += " <font color=\"#a0a0a0\"> "; t += __tr2qs_ctx("by","theme"); t += " "; - t += inf->szAuthor; + t += inf->author(); t += "</font>"; } t += "</nobr>"; t += "<br><nobr><font size=\"-1\">"; - t += inf->szDescription; + t += inf->description(); t += "</font></nobr>"; m_pText = new QSimpleRichText(t,box->font()); int iWidth = box->visibleWidth(); @@ -813,8 +146,6 @@ KviThemeManagementDialog::KviThemeManagementDialog(QWidget * parent) m_pInstance = this; - m_pSaveThemeDialog = 0; - QGridLayout * g = new QGridLayout(this,3,2,4,4); QHBox *hb = new QHBox(this); @@ -853,7 +184,7 @@ KviThemeManagementDialog::KviThemeManagementDialog(QWidget * parent) tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_OPEN))); tb->setUsesBigPixmap(true); QToolTip::add(tb,__tr2qs_ctx("Install Theme Package From Disk","theme")); - connect(tb,SIGNAL(clicked()),this,SLOT(installFromXml())); + connect(tb,SIGNAL(clicked()),this,SLOT(installFromFile())); tb = new KviStyledToolButton(hb); tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_WWW))); @@ -898,19 +229,13 @@ KviThemeManagementDialog::KviThemeManagementDialog(QWidget * parent) KviThemeManagementDialog::~KviThemeManagementDialog() { g_rectManagementDialogGeometry = QRect(pos().x(),pos().y(),size().width(),size().height()); - - if(m_pSaveThemeDialog) - { - delete m_pSaveThemeDialog; - m_pSaveThemeDialog = 0; - } - m_pInstance = 0; } void KviThemeManagementDialog::closeClicked() { delete this; + m_pInstance = 0; } @@ -945,7 +270,7 @@ void KviThemeManagementDialog::packTheme() } -void KviThemeManagementDialog::contextMenuRequested ( QListBoxItem * it, const QPoint & pos ) +void KviThemeManagementDialog::contextMenuRequested(QListBoxItem * it,const QPoint & pos) { if(it) { @@ -959,7 +284,7 @@ void KviThemeManagementDialog::contextMenuRequested ( QListBoxItem * it, const Q void KviThemeManagementDialog::applyTheme ( QListBoxItem * it) { - if(it) m_pListBox->setCurrentItem(it); + if(it)m_pListBox->setCurrentItem(it); applyCurrentTheme(); } @@ -970,12 +295,21 @@ void KviThemeManagementDialog::applyCurrentTheme() if(KviMessageBox::yesNo(__tr2qs_ctx("Apply theme - KVIrc","theme"), __tr2qs_ctx("Do you wish to apply theme \"%Q\" (version %Q)?","theme"), - &(it->themeInfo()->szName),&(it->themeInfo()->szVersion))) { - - QString szPath = it->themeInfo()->szAbsoluteDirectory; - if(szPath.isEmpty())return; + &(it->themeInfo()->name()),&(it->themeInfo()->version()))) + { + QString szPath = it->themeInfo()->absoluteDirectory(); + if(szPath.isEmpty())return; + + KviThemeInfo out; + if(!KviTheme::load(szPath,out)) + { + QString szErr = out.lastError(); + QString szMsg; + KviQString::sprintf(szMsg,__tr2qs_ctx("Failed to apply the specified theme: %Q","theme"),&szErr); + QMessageBox::critical(this,__tr2qs_ctx("Apply theme - KVIrc","theme"),szMsg, + QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); - g_pApp->loadTheme(szPath); + } } } @@ -987,105 +321,30 @@ void KviThemeManagementDialog::deleteTheme() { if(!KviMessageBox::yesNo(__tr2qs_ctx("Delete Theme - KVIrc","theme"), __tr2qs_ctx("Do you really wish to delete theme \"%Q\" (version %Q)?","theme"), - &(pItem->themeInfo()->szName),&(pItem->themeInfo()->szVersion)))goto jump_out; + &(pItem->themeInfo()->name()),&(pItem->themeInfo()->version())))goto jump_out; - KviFileUtils::deleteDir(pItem->themeInfo()->szAbsoluteDirectory); + KviFileUtils::deleteDir(pItem->themeInfo()->absoluteDirectory()); } } jump_out: fillThemeBox(); } -void KviThemeManagementDialog::installFromXml() +void KviThemeManagementDialog::installFromFile() { int iThemeCount=0; QString szFileName; - QDict<QString> * pInfoFields; - QString * pValue; - bool bInstall; - QPixmap pix; - QByteArray * pByteArray; - - const char * check_fields[] = { "Name", "Version", "Author", "Description", "Date", "KVIrcVersion" }; + QString szError; if(!KviFileDialog::askForOpenFileName(szFileName,__tr2qs_ctx("Open Theme - KVIrc","theme"),QString::null,"*.kvt")) return; - // check if it is a valid theme file - KviPackageReader r; - if(!r.readHeader(szFileName)) + if(!KviThemeFunctions::installThemePackage(szFileName,szError,this)) { - QString szErr = r.lastError(); - KviMessageBox::information(__tr2qs_ctx("The selected file does not seem to be a valid KVIrc package: %Q","theme"),&szErr); + KviMessageBox::information(szError); return; } - - pInfoFields = r.stringInfoFields(); - - pValue = pInfoFields->find("PackageType"); - if(!pValue)goto not_a_valid_theme_package; - if(!KviQString::equalCI(*pValue,"ThemePack"))goto not_a_valid_theme_package; - pValue = pInfoFields->find("ThemePackVersion"); - if(!pValue)goto not_a_valid_theme_package; - if(!KviQString::equalCI(*pValue,"1"))goto not_a_valid_theme_package; - - // make sure the default fields exist - for(int i=0;i<6;i++) - { - pValue = pInfoFields->find(check_fields[i]); - if(!pValue)goto not_a_valid_theme_package; - } - - pValue = pInfoFields->find("ThemeCount"); - if(!pValue)goto not_a_valid_theme_package; - bool bOk; - iThemeCount = pValue->toInt(&bOk); - if(!bOk)goto not_a_valid_theme_package; - if(iThemeCount < 1)goto not_a_valid_theme_package; - - // ok.. it should be really valid at this point - - // load its picture - pByteArray = r.binaryInfoFields()->find("Image"); - if(pByteArray) - { - pix.loadFromData(*pByteArray,0,0); - } - - if(pix.isNull()) - { - // load the default icon - } - - /* - KviUnpackThemeDialog * pDialog = new KviUnpackThemeDialog(this,szFileName); - bool bInstall = pDialog->exec() == QDialog::Accepted; - delete pDialog; - */ - - bInstall = true; - - if(bInstall) - { - QString szUnpackPath; - g_pApp->getLocalKvircDirectory(szUnpackPath,KviApp::Themes); - if(!r.unpack(szFileName,szUnpackPath)) - { - QString szErr2 = r.lastError(); - KviMessageBox::information(__tr2qs_ctx("Failed to unpack the selected file: %Q","theme"),&szErr2); - return; - } - } - - /* - KviXmlAddonLoader * pLoader = new KviXmlAddonLoader(szFilename,this); - pLoader->exec(); - */ fillThemeBox(); - return; -not_a_valid_theme_package: - KviMessageBox::information(__tr2qs_ctx("The selected file does not seem to be a valid KVIrc theme package","theme")); - return; } void KviThemeManagementDialog::getMoreThemes() @@ -1096,15 +355,10 @@ void KviThemeManagementDialog::getMoreThemes() void KviThemeManagementDialog::saveCurrentTheme() { - if(m_pSaveThemeDialog)return; - m_pSaveThemeDialog = new KviSaveThemeDialog(this); - m_pSaveThemeDialog->exec(); - if(m_pSaveThemeDialog) - { - delete m_pSaveThemeDialog; - m_pSaveThemeDialog = 0; - fillThemeBox(); - } + KviSaveThemeDialog * pSaveThemeDialog = new KviSaveThemeDialog(this); + pSaveThemeDialog->exec(); + delete pSaveThemeDialog; + fillThemeBox(); } void KviThemeManagementDialog::fillThemeBox(const QString &szDir) @@ -1122,10 +376,10 @@ void KviThemeManagementDialog::fillThemeBox(const QString &szDir) szTest += KVI_PATH_SEPARATOR_CHAR; szTest += *it; - KviThemeInfo * inf = new KviThemeInfo; - inf->szSubdirectory = *it; - if(g_pApp->loadThemeInfo(szTest,*inf)) + KviThemeInfo * inf = new KviThemeInfo(); + if(inf->loadFromDirectory(szTest)) { + inf->setSubdirectory(*it); KviThemeListBoxItem * item = 0; item = new KviThemeListBoxItem(m_pListBox,inf); } else { @@ -1138,18 +392,12 @@ void KviThemeManagementDialog::fillThemeBox() { m_pListBox->clear(); -// KviThemeInfo * ti = new KviThemeInfo; -// ti->szName = __tr2qs_ctx("Current Theme","theme"); - -// KviThemeListBoxItem * itewrq = new KviThemeListBoxItem(m_pListBox,ti); - QString szDir; g_pApp->getGlobalKvircDirectory(szDir,KviApp::Themes); fillThemeBox(szDir); g_pApp->getLocalKvircDirectory(szDir,KviApp::Themes); fillThemeBox(szDir); -// m_pListBox->setCurrentItem(itewrq); enableDisableButtons(); } diff --git a/src/modules/theme/managementdialog.h b/src/modules/theme/managementdialog.h index 36af51a05..a734d557e 100644 --- a/src/modules/theme/managementdialog.h +++ b/src/modules/theme/managementdialog.h @@ -26,6 +26,7 @@ #include "kvi_optionswidget.h" #include "kvi_list.h" +#include "kvi_theme.h" #include <qdialog.h> #include <qsimplerichtext.h> @@ -35,6 +36,7 @@ #include <qcursor.h> #include <qwizard.h> + class QLineEdit; class QTextEdit; class QPushButton; @@ -42,72 +44,12 @@ class QLabel; class QCheckBox; class QMultiLineEdit; -typedef struct _KviThemeInfoTag KviThemeInfo; - -class KviSaveThemeDialog : public QDialog -{ - Q_OBJECT -public: - KviSaveThemeDialog(QWidget *par); - ~KviSaveThemeDialog(); -protected: - QLineEdit * m_pAuthorEdit; - QLineEdit * m_pThemeNameEdit; - QLineEdit * m_pVersionEdit; - QTextEdit * m_pDescriptionEdit; - QPushButton * m_pOkButton; -// QComboBox * m_pFormatCombo; - QCheckBox * m_pIncludeMsgcolors; - -private: - void saveThemeInNewFormat(KviThemeInfo& info); - void saveThemeInOldFormat(KviThemeInfo& info); - void saveThemeInXmlFormat(KviThemeInfo& info); -protected slots: - void saveTheme(); - void themeNameChanged(const QString &txt); -}; - -class KviPackThemeDialog : public QWizard -{ - Q_OBJECT -public: - KviPackThemeDialog(QWidget * pParent,KviPtrList<KviThemeInfo> * pThemeInfoList); - ~KviPackThemeDialog(); -protected: - QString m_szImagePath; - KviFileSelector * m_pImageSelector; - QString m_szPackagePath; - KviFileSelector * m_pPathSelector; - QLabel * m_pImageLabel; - KviPtrList<KviThemeInfo> * m_pThemeInfoList; - QLineEdit * m_pPackageNameEdit; - QMultiLineEdit * m_pPackageDescriptionEdit; - QLineEdit * m_pPackageVersionEdit; - QLineEdit * m_pPackagerNameEdit; - QWidget * m_pImageSelectionPage; -protected: - virtual void accept(); -protected slots: - bool packTheme(); - void imageSelectionChanged(const QString &szImagePath); -}; - -/* -class KviUnpackThemeDialog : public QDialog -{ - Q_OBJECT -public: - KviUnpackThemeDialog(QWidget * pParent); - ~KviUnpackThemeDialog(); -}; -*/ class KviThemeListBoxItem : public QListBoxText { public: KviThemeListBoxItem(QListBox * box,KviThemeInfo * inf); - ~KviThemeListBoxItem(); + virtual ~KviThemeListBoxItem(); public: KviThemeInfo * m_pThemeInfo; QSimpleRichText * m_pText; @@ -126,12 +68,11 @@ class KviThemeManagementDialog : public QDialog Q_OBJECT public: KviThemeManagementDialog(QWidget * parent); - ~KviThemeManagementDialog(); + virtual ~KviThemeManagementDialog(); protected: static KviThemeManagementDialog * m_pInstance; QListBox * m_pListBox; QPopupMenu * m_pContextPopup; - KviSaveThemeDialog * m_pSaveThemeDialog; KviStyledToolButton * m_pDeleteThemeButton; KviStyledToolButton * m_pPackThemeButton; public: @@ -144,7 +85,7 @@ protected: protected slots: void saveCurrentTheme(); void getMoreThemes(); - void installFromXml(); + void installFromFile(); void fillThemeBox(); void deleteTheme(); void closeClicked(); diff --git a/src/modules/theme/packthemedialog.cpp b/src/modules/theme/packthemedialog.cpp new file mode 100644 index 000000000..8b53941cc --- /dev/null +++ b/src/modules/theme/packthemedialog.cpp @@ -0,0 +1,456 @@ +//============================================================================= +// +// File : packthemedialog.cpp +// Created on Wed 03 Jan 2007 01:11:44 by Szymon Stefanek +// +// This file is part of the KVIrc IRC Client distribution +// Copyright (C) 2007 Szymon Stefanek <pragma at kvirc dot net> +// +// 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 opinion) 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. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +//============================================================================= + +#include "packthemedialog.h" + +#include <qlayout.h> +#include <qpushbutton.h> +#include <qlineedit.h> +#include <qregexp.h> +#include <qmessagebox.h> +#include <qdir.h> +#include <qcombobox.h> +#include <qpainter.h> +#include <qtooltip.h> +#include <qimage.h> +#include <qtextedit.h> +#include <qmultilineedit.h> +#include <qbuffer.h> +#include <qlabel.h> + + +#include "kvi_options.h" +#include "kvi_locale.h" +#include "kvi_config.h" +#include "kvi_fileutils.h" +#include "kvi_app.h" +#include "kvi_frame.h" +#include "kvi_iconmanager.h" +#include "kvi_styled_controls.h" +#include "kvi_packagefile.h" +#include "kvi_fileextensions.h" +#include "kvi_filedialog.h" +#include "kvi_msgbox.h" +#include "kvi_selectors.h" +#include "kvi_miscutils.h" +#include "kvi_sourcesdate.h" + + +KviPackThemeDialog::KviPackThemeDialog(QWidget * pParent,KviPtrList<KviThemeInfo> * pThemeInfoList) +: QWizard(pParent) +{ + m_pThemeInfoList = pThemeInfoList; + + KviThemeInfo * pThemeInfo; + QString szPackageName; + QString szPackageAuthor; + QString szPackageDescription; + QString szPackageVersion; + if(m_pThemeInfoList->count() > 1) + { + szPackageName = "MyThemes"; + szPackageAuthor = __tr2qs_ctx("Your name here","theme"); + szPackageVersion = "1.0"; + szPackageDescription = __tr2qs_ctx("Put a package description here...","theme"); + } else { + if(m_pThemeInfoList->count() > 0) + { + pThemeInfo = m_pThemeInfoList->first(); + szPackageName = pThemeInfo->subdirectory(); + szPackageAuthor = pThemeInfo->author(); + szPackageDescription = pThemeInfo->description(); + szPackageVersion = pThemeInfo->version(); + } + } + + + setCaption(__tr2qs_ctx("Export Theme - KVIrc","theme")); + setMinimumSize(400,350); + + // welcome page ================================================================================== + QWidget * pPage = new QWidget(this); + QGridLayout * pLayout = new QGridLayout(pPage,2,1,4,4); + + QLabel * pLabel = new QLabel(pPage); + QString szText = "<p>"; + 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 += "</p><p>"; + szText += __tr2qs_ctx("You will be asked to provide a package name, a description and, if you want, an icon/screenshot.","theme"); + szText += "</p><p>"; + szText += __tr2qs_ctx("Hit the \"Next\" button to begin.","theme"); + szText += "<p>"; + + pLabel->setText(szText); + pLayout->addWidget(pLabel,0,0); + pLayout->setRowStretch(1,1); + + addPage(pPage,__tr2qs_ctx("Welcome","theme")); + setBackEnabled(pPage,false); + setNextEnabled(pPage,true); + setHelpEnabled(pPage,false); + setFinishEnabled(pPage,false); + + // theme data name ================================================================================ + + pPage = new QWidget(this); + pLayout = new QGridLayout(pPage,2,1,4,4); + + pLabel = new QLabel(pPage); + pLabel->setText(__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 rewiew your themes first.","theme")); + pLabel->setTextFormat(Qt::RichText); + pLayout->addWidget(pLabel,0,0); + + QString szAuthor = __tr2qs_ctx("Author","theme"); + QString szCreatedAt = __tr2qs_ctx("Created at","theme"); + QString szCreatedOn = __tr2qs_ctx("Created with","theme"); + QString szMinKVIrc = __tr2qs_ctx("Minimum KVIrc version","theme"); + QString szSubdirectory = __tr2qs_ctx("Subdirectory","theme"); + + QString szThemesDescription = "<html><body bgcolor=\"#ffffff\">"; + + int iIdx = 0; + for(pThemeInfo = m_pThemeInfoList->first();pThemeInfo;pThemeInfo = m_pThemeInfoList->next()) + { + QString szThemeDescription; + KviQString::sprintf( + szThemeDescription, + "<p>" \ + "<h2>%Q %Q</h2>" \ + "</p>" \ + "<p>" \ + "<i>%Q</i>" \ + "</p>" \ + "<p>" \ + "%Q: <b>%Q</b><br>" \ + "%Q: <b>%Q</b><br>" \ + "</p>" \ + "<p>" \ + "<font color=\"#808080\">" \ + "%Q: %Q<br>" \ + "%Q: %Q<br>" \ + "%Q: %Q<br>" \ + "</font>" \ + "</p>", + &(pThemeInfo->name()), + &(pThemeInfo->version()), + &(pThemeInfo->description()), + &szAuthor, + &(pThemeInfo->author()), + &szCreatedAt, + &(pThemeInfo->date()), + &szCreatedOn, + &(pThemeInfo->application()), + &szMinKVIrc, + &(pThemeInfo->minimumKVIrcVersion()), + &szSubdirectory, + &(pThemeInfo->subdirectory()) + ); + if(iIdx > 0) + szThemesDescription += "<hr>"; + szThemesDescription += szThemeDescription; + iIdx++; + } + + szThemesDescription += "</body></html>"; + + QTextEdit * pTextEdit = new QTextEdit(pPage); + pTextEdit->setPaper(QBrush(QColor(255,255,255))); + pTextEdit->setReadOnly(true); + pTextEdit->setText(szThemesDescription); + pLayout->addWidget(pTextEdit,1,0); + pLayout->setRowStretch(1,1); + + addPage(pPage,__tr2qs_ctx("Theme Data","theme")); + setBackEnabled(pPage,true); + setHelpEnabled(pPage,false); + setNextEnabled(pPage,true); + setFinishEnabled(pPage,false); + + // packager informations ================================================================================ + + pPage = new QWidget(this); + pLayout = new QGridLayout(pPage,5,2,4,4); + + pLabel = new QLabel(pPage); + pLabel->setText(__tr2qs_ctx("Here you need to provide informations about you (the packager) and a short description of the package you're creating.","theme")); + pLabel->setTextFormat(Qt::RichText); + pLayout->addMultiCellWidget(pLabel,0,0,0,1); + + pLabel = new QLabel(pPage); + pLabel->setText(__tr2qs_ctx("Package Name:","theme")); + pLayout->addWidget(pLabel,1,0); + + m_pPackageNameEdit = new QLineEdit(pPage); + m_pPackageNameEdit->setText(szPackageName); + pLayout->addWidget(m_pPackageNameEdit,1,1); + + pLabel = new QLabel(pPage); + pLabel->setText(__tr2qs_ctx("Version:","theme")); + pLayout->addWidget(pLabel,2,0); + + m_pPackageVersionEdit = new QLineEdit(pPage); + m_pPackageVersionEdit->setText(szPackageVersion); + pLayout->addWidget(m_pPackageVersionEdit,2,1); + + pLabel = new QLabel(pPage); + pLabel->setText(__tr2qs_ctx("Description:","theme")); + pLayout->addWidget(pLabel,3,0); + + m_pPackageDescriptionEdit = new QMultiLineEdit(pPage); + m_pPackageDescriptionEdit->setText(szPackageDescription); + pLayout->addWidget(m_pPackageDescriptionEdit,3,1); + + pLabel = new QLabel(pPage); + pLabel->setText(__tr2qs_ctx("Package Author:","theme")); + pLayout->addWidget(pLabel,4,0); + + m_pPackagerNameEdit = new QLineEdit(pPage); + m_pPackagerNameEdit->setText(szPackageAuthor); + pLayout->addWidget(m_pPackagerNameEdit,4,1); + + + pLayout->setRowStretch(3,1); + pLayout->setColStretch(1,1); + + addPage(pPage,__tr2qs_ctx("Package Informations","theme")); + setBackEnabled(pPage,true); + setHelpEnabled(pPage,false); + setNextEnabled(pPage,true); + setFinishEnabled(pPage,false); + + // screenshot/logo/icon ================================================================================ + + pPage = new QWidget(this); + pLayout = new QGridLayout(pPage,3,1,4,4); + + pLabel = new QLabel(pPage); + pLabel->setText(__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")); + pLabel->setTextFormat(Qt::RichText); + pLayout->addWidget(pLabel,0,0); + + m_pImageLabel = new QLabel(pPage); + m_pImageLabel->setFrameStyle(QFrame::Sunken | QFrame::Panel); + m_pImageLabel->setMinimumSize(300,225); + m_pImageLabel->setAlignment(Qt::AlignCenter | Qt::AlignVCenter); + pLayout->addWidget(m_pImageLabel,1,0); + + QString szFilter = "*.png *.jpg *.xpm"; + m_pImageSelector = new KviFileSelector(pPage,"",&m_szImagePath,true,0,szFilter); + connect(m_pImageSelector,SIGNAL(selectionChanged(const QString &)),this,SLOT(imageSelectionChanged(const QString &))); + pLayout->addWidget(m_pImageSelector,2,0); + pLayout->setRowStretch(1,1); + + m_pImageSelectionPage = pPage; + addPage(pPage,__tr2qs_ctx("Icon/Screenshot","theme")); + setBackEnabled(pPage,true); + setHelpEnabled(pPage,false); + setNextEnabled(pPage,true); + setFinishEnabled(pPage,false); + + // save file name ================================================================================ + + pPage = new QWidget(this); + pLayout = new QGridLayout(pPage,4,1,4,4); + + pLabel = new QLabel(pPage); + pLabel->setText(__tr2qs_ctx("Here you must choose the file name for the theme package. It should have a *.%1 extension.","theme").arg(KVI_FILEEXTENSION_THEMEPACKAGE)); + pLabel->setTextFormat(Qt::RichText); + pLayout->addWidget(pLabel,0,0); + + m_szPackagePath = QDir::homeDirPath(); + KviQString::ensureLastCharIs(m_szPackagePath,QChar(KVI_PATH_SEPARATOR_CHAR)); + + m_szPackagePath += szPackageName; + m_szPackagePath += "-"; + m_szPackagePath += szPackageVersion; + m_szPackagePath += "."; + m_szPackagePath += KVI_FILEEXTENSION_THEMEPACKAGE; + + szFilter = "*."; + szFilter += KVI_FILEEXTENSION_THEMEPACKAGE; + m_pPathSelector = new KviFileSelector(pPage,"",&m_szPackagePath,true,KviFileSelector::ChooseSaveFileName,szFilter); + pLayout->addWidget(m_pPathSelector,1,0); + + pLabel = new QLabel(pPage); + pLabel->setText(__tr2qs_ctx("Finally hit the \"Finish\" button to complete the packaging operation.","theme")); + pLabel->setTextFormat(Qt::RichText); + pLayout->addWidget(pLabel,3,0); + + pLayout->setRowStretch(2,1); + + addPage(pPage,__tr2qs_ctx("Package Path","theme")); + setBackEnabled(pPage,true); + setHelpEnabled(pPage,false); + setNextEnabled(pPage,false); + setFinishEnabled(pPage,true); + +} + +KviPackThemeDialog::~KviPackThemeDialog() +{ +} + +void KviPackThemeDialog::imageSelectionChanged(const QString &szImagePath) +{ + QImage pix(szImagePath); + if(!pix.isNull()) + { + QPixmap out; + if(pix.width() > 300 || pix.height() > 225) + out.convertFromImage(pix.smoothScale(300,225,QImage::ScaleMin)); + else + out.convertFromImage(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()); +} + + +void KviPackThemeDialog::accept() +{ + if(!packTheme())return; + QWizard::accept(); +} + + +bool KviPackThemeDialog::packTheme() +{ + m_pImageSelector->commit(); + m_pPathSelector->commit(); + + QString szPackageAuthor = m_pPackagerNameEdit->text(); + QString szPackageName = m_pPackageNameEdit->text(); + QString szPackageDescription = m_pPackageDescriptionEdit->text(); + QString szPackageVersion = m_pPackageVersionEdit->text(); + + QImage pix(m_szImagePath); + QPixmap out; + if(!pix.isNull()) + { + if(pix.width() > 300 || pix.height() > 225) + out.convertFromImage(pix.smoothScale(300,225,QImage::ScaleMin)); + else + out.convertFromImage(pix); + } else { + if(!m_szImagePath.isEmpty()) + { + QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),__tr2qs_ctx("Failed to load the selected image: please fix it","theme"), + QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); + showPage(m_pImageSelectionPage); + return false; + } + } + + KviPackageWriter f; + + QString szTmp = QDateTime::currentDateTime().toString(); + + f.addInfoField("PackageType","ThemePack"); + f.addInfoField("ThemePackVersion","1"); + f.addInfoField("Name",szPackageName); + f.addInfoField("Version",szPackageVersion); + f.addInfoField("Author",szPackageAuthor); + f.addInfoField("Description",szPackageDescription); + f.addInfoField("Date",szTmp); + f.addInfoField("Application","KVIrc " KVI_VERSION "." KVI_SOURCES_DATE); + + if(!out.isNull()) + { + QByteArray * pba = new QByteArray(); + QBuffer buffer(*pba); + buffer.open(IO_WriteOnly); + out.save(&buffer,"PNG"); + buffer.close(); + f.addInfoField("Image",pba); // cool :) [no disk access needed] + } + + szTmp.setNum(m_pThemeInfoList->count()); + f.addInfoField("ThemeCount",szTmp); + + QString szMinimumKVIrcVersion = "0"; + + int iIdx = 0; + for(KviThemeInfo * pInfo = m_pThemeInfoList->first();pInfo;pInfo = m_pThemeInfoList->next()) + { + KviQString::sprintf(szTmp,"Theme%dName",iIdx); + f.addInfoField(szTmp,pInfo->name()); + KviQString::sprintf(szTmp,"Theme%dVersion",iIdx); + f.addInfoField(szTmp,pInfo->version()); + KviQString::sprintf(szTmp,"Theme%dDescription",iIdx); + f.addInfoField(szTmp,pInfo->description()); + KviQString::sprintf(szTmp,"Theme%dDate",iIdx); + f.addInfoField(szTmp,pInfo->date()); + KviQString::sprintf(szTmp,"Theme%dSubdirectory",iIdx); + f.addInfoField(szTmp,pInfo->subdirectory()); + KviQString::sprintf(szTmp,"Theme%dAuthor",iIdx); + f.addInfoField(szTmp,pInfo->author()); + KviQString::sprintf(szTmp,"Theme%dApplication",iIdx); + f.addInfoField(szTmp,pInfo->application()); + KviQString::sprintf(szTmp,"Theme%dMinimumKVIrcVersion",iIdx); + f.addInfoField(szTmp,pInfo->minimumKVIrcVersion()); + if(!f.addDirectory(pInfo->absoluteDirectory(),pInfo->subdirectory())) + { + szTmp = __tr2qs_ctx("Packaging failed","theme"); + szTmp += ": "; + szTmp += f.lastError(); + QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),szTmp, + QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); + } + + if(KviMiscUtils::compareVersions(pInfo->minimumKVIrcVersion(),szMinimumKVIrcVersion) < 0) + szMinimumKVIrcVersion = pInfo->minimumKVIrcVersion(); + + iIdx++; + } + + // This is the maximum of the minimum KVIrc versions of the packed themes! + // FIXME: The packages should be warned if in this way we're raising the + // requirements on one of the packed themes... + f.addInfoField("MinimumKVIrcVersion",szMinimumKVIrcVersion); + + if(!f.pack(m_szPackagePath)) + { + szTmp = __tr2qs_ctx("Packaging failed","theme"); + szTmp += ": "; + szTmp += f.lastError(); + QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),szTmp, + QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); + return false; + } + + //KviPackageReader r; + //r.unpack("/root/test.kvt","/root/unpacked_test_kvt"); + + QMessageBox::information(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),__tr2qs("Package saved succesfully"), + QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); + + return true; +} + diff --git a/src/modules/theme/packthemedialog.h b/src/modules/theme/packthemedialog.h new file mode 100644 index 000000000..1316369bc --- /dev/null +++ b/src/modules/theme/packthemedialog.h @@ -0,0 +1,65 @@ +#ifndef _PACKTHEMEDIALOG_H_ +#define _PACKTHEMEDIALOG_H_ +//============================================================================= +// +// File : packthemedialog.h +// Created on Wed 03 Jan 2007 01:11:44 by Szymon Stefanek +// +// This file is part of the KVIrc IRC Client distribution +// Copyright (C) 2007 Szymon Stefanek <pragma at kvirc dot net> +// +// 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 opinion) 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. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +//============================================================================= + +#include "kvi_settings.h" +#include "kvi_list.h" +#include "kvi_theme.h" + +#include <qdialog.h> +#include <qwizard.h> + +class QLineEdit; +class QLabel; +class QMultiLineEdit; +class KviFileSelector; + + +class KviPackThemeDialog : public QWizard +{ + Q_OBJECT +public: + KviPackThemeDialog(QWidget * pParent,KviPtrList<KviThemeInfo> * pThemeInfoList); + virtual ~KviPackThemeDialog(); +protected: + QString m_szImagePath; + KviFileSelector * m_pImageSelector; + QString m_szPackagePath; + KviFileSelector * m_pPathSelector; + QLabel * m_pImageLabel; + KviPtrList<KviThemeInfo> * m_pThemeInfoList; + QLineEdit * m_pPackageNameEdit; + QMultiLineEdit * m_pPackageDescriptionEdit; + QLineEdit * m_pPackageVersionEdit; + QLineEdit * m_pPackagerNameEdit; + QWidget * m_pImageSelectionPage; +protected: + virtual void accept(); +protected slots: + bool packTheme(); + void imageSelectionChanged(const QString &szImagePath); +}; + +#endif //!_PACKTHEMEDIALOG_H_ diff --git a/src/modules/theme/savethemedialog.cpp b/src/modules/theme/savethemedialog.cpp new file mode 100644 index 000000000..7a7a200c3 --- /dev/null +++ b/src/modules/theme/savethemedialog.cpp @@ -0,0 +1,173 @@ +//============================================================================= +// +// File : savethemedialog.cpp +// Created on Wed 03 Jan 2007 03:01:34 by Szymon Stefanek +// +// This file is part of the KVIrc IRC Client distribution +// Copyright (C) 2007 Szymon Stefanek <pragma at kvirc dot net> +// +// 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 opinion) 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. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +//============================================================================= + +#include "savethemedialog.h" + +#include <qlayout.h> +#include <qpushbutton.h> +#include <qlineedit.h> +#include <qregexp.h> +#include <qmessagebox.h> +#include <qdir.h> +#include <qcombobox.h> +#include <qpainter.h> +#include <qtooltip.h> +#include <qimage.h> +#include <qtextedit.h> +#include <qmultilineedit.h> +#include <qbuffer.h> +#include <qlabel.h> + + +#include "kvi_options.h" +#include "kvi_locale.h" +#include "kvi_config.h" +#include "kvi_fileutils.h" +#include "kvi_app.h" +#include "kvi_frame.h" +#include "kvi_iconmanager.h" +#include "kvi_styled_controls.h" +#include "kvi_packagefile.h" +#include "kvi_fileextensions.h" +#include "kvi_filedialog.h" +#include "kvi_msgbox.h" +#include "kvi_selectors.h" +#include "kvi_sourcesdate.h" + + +KviSaveThemeDialog::KviSaveThemeDialog(QWidget * par) +: QDialog(par) +{ + setCaption(__tr2qs_ctx("Save Current Theme","theme")); + + QGridLayout * g = new QGridLayout(this,8,2,4,4); + + QLabel * l; + + l = new QLabel(__tr2qs_ctx("Theme name:","theme"),this); + g->addWidget(l,0,0); + + m_pThemeNameEdit = new QLineEdit(this); + g->addMultiCellWidget(m_pThemeNameEdit,0,0,1,2); + connect(m_pThemeNameEdit,SIGNAL(textChanged(const QString &)),this,SLOT(themeNameChanged(const QString &))); + + + l = new QLabel(__tr2qs_ctx("Version:","theme"),this); + g->addWidget(l,1,0); + + m_pVersionEdit = new QLineEdit(this); + g->addMultiCellWidget(m_pVersionEdit,1,1,1,2); + + + l = new QLabel(__tr2qs_ctx("Author:","theme"),this); + g->addWidget(l,2,0); + + m_pAuthorEdit = new QLineEdit(this); + g->addMultiCellWidget(m_pAuthorEdit,2,2,1,2); + + l = new QLabel(__tr2qs_ctx("Description:","theme"),this); + g->addWidget(l,3,0); + + m_pDescriptionEdit = new QTextEdit(this); + g->addMultiCellWidget(m_pDescriptionEdit,3,4,1,2); + + QHBox * h = new QHBox(this); + h->setSpacing(7); + g->addWidget(h,7,2); + m_pOkButton = new QPushButton(__tr2qs_ctx("OK","theme"),h); + m_pOkButton->setEnabled(false); + connect(m_pOkButton,SIGNAL(clicked()),this,SLOT(saveTheme())); + m_pOkButton->setIconSet(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_ACCEPT))); + + QPushButton * pb = new QPushButton(__tr2qs_ctx("Cancel","theme"),h); + connect(pb,SIGNAL(clicked()),this,SLOT(reject())); + pb->setIconSet(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_DISCARD))); + +} + +KviSaveThemeDialog::~KviSaveThemeDialog() +{ + +} + +void KviSaveThemeDialog::themeNameChanged(const QString &txt) +{ + m_pOkButton->setEnabled(!txt.isEmpty()); +} + + +void KviSaveThemeDialog::saveTheme() +{ + KviThemeInfo sto; + sto.setName(m_pThemeNameEdit->text()); + if(sto.name().isEmpty()) + { + QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("You must choose a theme name!","theme"),QMessageBox::Ok, + QMessageBox::NoButton,QMessageBox::NoButton); + return; + } + + sto.setAuthor(m_pAuthorEdit->text()); + sto.setDescription(m_pDescriptionEdit->text()); + sto.setDate(QDateTime::currentDateTime().toString()); + sto.setVersion(m_pVersionEdit->text()); + sto.setApplication("KVIrc " KVI_VERSION "." KVI_SOURCES_DATE); + + if(sto.version().isEmpty())sto.setVersion("1.0.0"); + + QString szSubdir = sto.name() + QString("-") + sto.version(); + szSubdir.replace(QRegExp("[ \\\\/:][ \\\\/:]*"),"_"); + sto.setSubdirectory(szSubdir); + + QString szAbsDir; + g_pApp->getLocalKvircDirectory(szAbsDir,KviApp::Themes,sto.subdirectory(),true); + if(!KviFileUtils::makeDir(szAbsDir)) + { + QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),__tr2qs_ctx("Unable to create theme directory.","theme"), + QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); + return; + } + + sto.setAbsoluteDirectory(szAbsDir); + + if(!KviTheme::save(sto)) + { + QString szMsg2; + QString szErr = sto.lastError(); + KviQString::sprintf(szMsg2,__tr2qs_ctx("Unable to save theme: %Q","theme"),&szErr); + QMessageBox::critical(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),szMsg2, + QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); + return; + } + // write down the images + + QString szMsg = __tr2qs_ctx("Theme saved successfully to ","theme"); + szMsg += sto.absoluteDirectory(); + + QMessageBox::information(this,__tr2qs_ctx("Save Theme - KVIrc","theme"),szMsg,QMessageBox::Ok, + QMessageBox::NoButton,QMessageBox::NoButton); + + accept(); +} + diff --git a/src/modules/theme/savethemedialog.h b/src/modules/theme/savethemedialog.h new file mode 100644 index 000000000..af9dd2186 --- /dev/null +++ b/src/modules/theme/savethemedialog.h @@ -0,0 +1,62 @@ +#ifndef _SAVETHEMEDIALOG_H_ +#define _SAVETHEMEDIALOG_H_ +//============================================================================= +// +// File : savethemedialog.h +// Created on Wed 03 Jan 2007 03:01:34 by Szymon Stefanek +// +// This file is part of the KVIrc IRC Client distribution +// Copyright (C) 2007 Szymon Stefanek <pragma at kvirc dot net> +// +// 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 opinion) 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. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +//============================================================================= + +#include "kvi_settings.h" +#include "kvi_list.h" + +#include <qdialog.h> + +#include "kvi_theme.h" + +class QLineEdit; +class QTextEdit; +class QPushButton; +class QCheckBox; +class QLabel; +class QMultiLineEdit; +class KviFileSelector; + + +class KviSaveThemeDialog : public QDialog +{ + Q_OBJECT +public: + KviSaveThemeDialog(QWidget *par); + virtual ~KviSaveThemeDialog(); +protected: + QLineEdit * m_pAuthorEdit; + QLineEdit * m_pThemeNameEdit; + QLineEdit * m_pVersionEdit; + QTextEdit * m_pDescriptionEdit; + QPushButton * m_pOkButton; +protected slots: + void saveTheme(); + void themeNameChanged(const QString &txt); +}; + + + +#endif //!_SAVETHEMEDIALOG_H_ diff --git a/src/modules/theme/themefunctions.cpp b/src/modules/theme/themefunctions.cpp new file mode 100644 index 000000000..8a071add3 --- /dev/null +++ b/src/modules/theme/themefunctions.cpp @@ -0,0 +1,240 @@ +//============================================================================= +// +// File : themefunctions.cpp +// Created on Wed 03 Jan 2007 03:14:07 by Szymon Stefanek +// +// This file is part of the KVIrc IRC Client distribution +// Copyright (C) 2007 Szymon Stefanek <pragma at kvirc dot net> +// +// 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 opinion) 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. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +//============================================================================= + +#include "themefunctions.h" + +#include "kvi_packagefile.h" +#include "kvi_locale.h" +#include "kvi_msgbox.h" +#include "kvi_app.h" +#include "kvi_htmldialog.h" +#include "kvi_iconmanager.h" +#include "kvi_miscutils.h" +#include "kvi_sourcesdate.h" + +#include <qmime.h> + +namespace KviThemeFunctions +{ + + static bool notAValidThemePackage(QString &szError) + { + KviQString::sprintf(szError,__tr2qs_ctx("The selected file does not seem to be a valid KVIrc theme package","theme")); + return false; + } + + bool installThemePackage(const QString &szThemePackageFileName,QString &szError,QWidget * pDialogParent) + { + QDict<QString> * pInfoFields; + QString * pValue; + bool bInstall; + QPixmap pix; + QByteArray * pByteArray; + KviHtmlDialogData hd; + + const char * check_fields[] = { "Name", "Version", "Author", "Description", "Date", "MinimumKVIrcVersion", "Application" }; + + // check if it is a valid theme file + KviPackageReader r; + if(!r.readHeader(szThemePackageFileName)) + { + QString szErr = r.lastError(); + KviQString::sprintf(szError,__tr2qs_ctx("The selected file does not seem to be a valid KVIrc package: %Q","theme"),&szErr); + return false; + } + + pInfoFields = r.stringInfoFields(); + + pValue = pInfoFields->find("PackageType"); + if(!pValue)return notAValidThemePackage(szError); + if(!KviQString::equalCI(*pValue,"ThemePack"))return notAValidThemePackage(szError); + pValue = pInfoFields->find("ThemePackVersion"); + if(!pValue)return notAValidThemePackage(szError); + if(!KviQString::equalCI(*pValue,"1"))return notAValidThemePackage(szError); + + // make sure the default fields exist + for(int i=0;i<6;i++) + { + pValue = pInfoFields->find(check_fields[i]); + if(!pValue)return notAValidThemePackage(szError); + } + + pValue = pInfoFields->find("ThemeCount"); + if(!pValue)return notAValidThemePackage(szError); + bool bOk; + int iThemeCount = pValue->toInt(&bOk); + if(!bOk)return notAValidThemePackage(szError); + if(iThemeCount < 1)return notAValidThemePackage(szError); + + // ok.. it should be really valid at this point + + // load its picture + pByteArray = r.binaryInfoFields()->find("Image"); + if(pByteArray) + pix.loadFromData(*pByteArray,0,0); + + if(pix.isNull()) + { + // load the default icon + pix = *(g_pIconManager->getBigIcon(KVI_BIGICON_THEME)); + } + + /////////////////////////////////// + QString szPackageName; + QString szPackageVersion; + QString szPackageAuthor; + QString szPackageDescription; + QString szPackageDate; + QString szPackageMinimumKVIrcVersion; + QString szPackageApplication; + + QString szAuthor = __tr2qs_ctx("Author","theme"); + QString szCreatedAt = __tr2qs_ctx("Created at","theme"); + QString szCreatedOn = __tr2qs_ctx("Created with","theme"); + + r.getStringInfoField("Name",szPackageName); + r.getStringInfoField("Version",szPackageVersion); + r.getStringInfoField("Author",szPackageAuthor); + r.getStringInfoField("Description",szPackageDescription); + r.getStringInfoField("MinimumKVIrcVersion",szPackageMinimumKVIrcVersion); + r.getStringInfoField("Application",szPackageApplication); + r.getStringInfoField("Date",szPackageDate); + + if(KviMiscUtils::compareVersions(KVI_VERSION "." KVI_SOURCES_DATE,szPackageMinimumKVIrcVersion) > 0) + { + KviQString::sprintf(szError,__tr2qs_ctx("The selected theme package requires at least KVIrc %Q","theme"),&szPackageMinimumKVIrcVersion); + return false; + } + + /* + int iIdx = 0; + for(KviThemeInfo * pInfo = m_pThemeInfoList->first();pInfo;pInfo = m_pThemeInfoList->next()) + { + KviQString::sprintf(szTmp,"Theme%dName",iIdx); + f.addInfoField(szTmp,pInfo->szName); + KviQString::sprintf(szTmp,"Theme%dVersion",iIdx); + f.addInfoField(szTmp,pInfo->szVersion); + KviQString::sprintf(szTmp,"Theme%dDescription",iIdx); + f.addInfoField(szTmp,pInfo->szDescription); + KviQString::sprintf(szTmp,"Theme%dDate",iIdx); + f.addInfoField(szTmp,pInfo->szDate); + KviQString::sprintf(szTmp,"Theme%dSubdirectory",iIdx); + f.addInfoField(szTmp,pInfo->szSubdirectory); + KviQString::sprintf(szTmp,"Theme%dAuthor",iIdx); + f.addInfoField(szTmp,pInfo->szAuthor); + KviQString::sprintf(szTmp,"Theme%dKVIrcVersion",iIdx); + f.addInfoField(szTmp,pInfo->szKvircVersion); + if(!f.addDirectory(pInfo->szAbsoluteDirectory,pInfo->szSubdirectory)) + { + szTmp = __tr2qs_ctx("Packaging failed","theme"); + szTmp += ": "; + szTmp += f.lastError(); + QMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),szTmp, + QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton); + } + iIdx++; + } + */ + + KviQString::sprintf(hd.szHtmlText, + "<html bgcolor=\"#ffffff\">" \ + "<body bgcolor=\"#ffffff\">" \ + "<br>" \ + "<p><center>" \ + "<h2>%Q %Q</h2>" \ + "</center></p>" \ + "<p><center>" \ + "<img src=\"theme_dialog_pack_image\">" \ + "</center></p>" \ + "<p><center>" \ + "<i>%Q</i>" \ + "</center></p>" \ + "<p><center>" \ + "%Q: <b>%Q</b><br>" \ + "%Q: <b>%Q</b><br>" \ + "</center></p>" \ + "<p><center>" \ + "<font color=\"#808080\">" \ + "%Q: %Q<br>" \ + "</font>" \ + "</center></p>" \ + "<br>" \ + "<p><center>" \ + "<a href=\"theme_dialog_details\">Show Details</a>" \ + "</center></p>" \ + "</body>" \ + "</html>", + &szPackageName, + &szPackageVersion, + &szPackageDescription, + &szAuthor, + &szPackageAuthor, + &szCreatedAt, + &szPackageDate, + &szCreatedOn, + &szPackageApplication + ); + + QString szDetails = "Doh.. da details"; + + + QMimeSourceFactory::defaultFactory()->setPixmap("theme_dialog_pack_image",pix); + QMimeSourceFactory::defaultFactory()->setText("theme_dialog_details",szDetails); + QMimeSourceFactory::defaultFactory()->setText("theme_dialog_main",hd.szHtmlText); + + QString beginCenter = "<center>"; + QString endCenter = "</center>"; + + hd.szCaption = __tr2qs_ctx("Install Theme Pack - KVIrc","theme"); + hd.szUpperLabelText = beginCenter + __tr2qs_ctx("You're about to install the following theme package","theme") + endCenter; + hd.szLowerLabelText = beginCenter + __tr2qs_ctx("Do you want to proceed with the installation ?","theme") + endCenter; + hd.szButton1Text = __tr2qs_ctx("Do Not Install","theme"); + hd.szButton2Text = __tr2qs_ctx("Yes, Proceed","theme"); + hd.iDefaultButton = 2; + hd.iCancelButton = 1; + hd.pixIcon = *(g_pIconManager->getSmallIcon(KVI_SMALLICON_THEME)); + hd.iMinimumWidth = 350; + hd.iMinimumHeight = 420; + hd.iFlags = KviHtmlDialogData::ForceMinimumSize; + + bInstall = KviHtmlDialog::display(pDialogParent,&hd) == 2; + + if(bInstall) + { + QString szUnpackPath; + g_pApp->getLocalKvircDirectory(szUnpackPath,KviApp::Themes); + if(!r.unpack(szThemePackageFileName,szUnpackPath)) + { + QString szErr2 = r.lastError(); + KviQString::sprintf(szError,__tr2qs_ctx("Failed to unpack the selected file: %Q","theme"),&szErr2); + return true; + } + } + + return true; + } + + +}; + diff --git a/src/modules/theme/themefunctions.h b/src/modules/theme/themefunctions.h new file mode 100644 index 000000000..42949c1b4 --- /dev/null +++ b/src/modules/theme/themefunctions.h @@ -0,0 +1,39 @@ +#ifndef _THEMEFUNCTIONS_H_ +#define _THEMEFUNCTIONS_H_ +//============================================================================= +// +// File : themefunctions.h +// Created on Wed 03 Jan 2007 03:14:07 by Szymon Stefanek +// +// This file is part of the KVIrc IRC Client distribution +// Copyright (C) 2007 Szymon Stefanek <pragma at kvirc dot net> +// +// 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 opinion) 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. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +//============================================================================= + +#include "kvi_settings.h" +#include "kvi_qstring.h" + +#include <qwidget.h> + +namespace KviThemeFunctions +{ + bool installThemePackage(const QString &szThemePackageFileName,QString &szError,QWidget * pDialogParent = 0); +}; + + + +#endif //!_THEMEFUNCTIONS_H_ |
