//============================================================================= // // File : managementdialog.cpp // Created on Sat 30 Dec 2006 14:54:56 by Szymon Stefanek // // This file is part of the KVIrc IRC Client distribution // Copyright (C) 2006 Szymon Stefanek // // 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. // //============================================================================= #define LVI_ICON_SIZE 32 #define LVI_BORDER 4 #define LVI_SPACING 8 #define LVI_MINIMUM_TEXT_WIDTH 300 #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 "kvi_iconmanager.h" #include "kvi_msgbox.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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_internalcmd.h" #include "kvi_styled_controls.h" #include "kvi_doublebuffer.h" #include "kvi_packagefile.h" #include "kvi_fileextensions.h" #include "kvi_filedialog.h" #include // rand & srand 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 * 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 = "

"; 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 += "

"; 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 = ""; int iIdx = 0; for(pThemeInfo = m_pThemeInfoList->first();pThemeInfo;pThemeInfo = m_pThemeInfoList->next()) { QString szThemeDescription; KviQString::sprintf( szThemeDescription, "

" \ "

%Q %Q

" \ "

" \ "

" \ "%Q" \ "

" \ "

" \ "%Q: %Q
" \ "%Q: %Q
" \ "

" \ "

" \ "" \ "%Q: KVIrc %Q
" \ "%Q: %Q
" \ "
" \ "

", &(pThemeInfo->szName), &(pThemeInfo->szVersion), &(pThemeInfo->szDescription), &szAuthor, &(pThemeInfo->szAuthor), &szCreatedAt, &(pThemeInfo->szDate), &szCreatedOn, &(pThemeInfo->szKvircVersion), &szSubdirectory, &(pThemeInfo->szSubdirectory) ); if(iIdx > 0) szThemesDescription += "
"; szThemesDescription += szThemeDescription; iIdx++; } szThemesDescription += ""; 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) : QListBoxText(box) { m_pThemeInfo = inf; QString t; t = ""; t += inf->szName; t += ""; if(!inf->szVersion.isEmpty()) { t += "["; t += inf->szVersion; t += "]"; } if(!inf->szAuthor.isEmpty()) { t += " "; t += __tr2qs_ctx("by","theme"); t += " "; t += inf->szAuthor; t += ""; } t += ""; t += "
"; t += inf->szDescription; t += ""; m_pText = new QSimpleRichText(t,box->font()); int iWidth = box->visibleWidth(); if(iWidth < LVI_MINIMUM_CELL_WIDTH)iWidth = LVI_MINIMUM_CELL_WIDTH; iWidth -= LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING + LVI_BORDER; m_pText->setWidth(iWidth); } KviThemeListBoxItem::~KviThemeListBoxItem() { delete m_pThemeInfo; delete m_pText; } void KviThemeListBoxItem::paint ( QPainter * p ) { QListBoxText::paint(p); p->drawPixmap(LVI_BORDER,LVI_BORDER, *(g_pIconManager->getBigIcon(QString(KVI_BIGICON_THEME))) ); int afterIcon = LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING; int www = p->window().width() - (afterIcon + LVI_BORDER); m_pText->setWidth(www); m_pText->draw(p,afterIcon,LVI_BORDER,QRect(afterIcon,LVI_BORDER,www,p->window().height() - (LVI_BORDER * 2)),listBox()->viewport()->colorGroup()); } int KviThemeListBoxItem::height ( const QListBox * lb ) const { int iHeight = m_pText->height() + (2 * LVI_BORDER); if(iHeight < (LVI_ICON_SIZE + (2 * LVI_BORDER)))iHeight = LVI_ICON_SIZE + (2 * LVI_BORDER); return iHeight; } KviThemeManagementDialog * KviThemeManagementDialog::m_pInstance = 0; KviThemeManagementDialog::KviThemeManagementDialog(QWidget * parent) : QDialog(parent,"theme_options_widget") { setCaption(__tr2qs_ctx("Manage Themes - KVIrc","theme")); setIcon(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_THEME))); setModal(true); m_pInstance = this; m_pSaveThemeDialog = 0; QGridLayout * g = new QGridLayout(this,3,2,4,4); QHBox *hb = new QHBox(this); g->addMultiCellWidget(hb,0,0,0,1); KviStyledToolButton * tb; QFrame * sep; tb = new KviStyledToolButton(hb); tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_SAVE))); tb->setUsesBigPixmap(true); QToolTip::add(tb,__tr2qs_ctx("Save Current Theme...","theme")); connect(tb,SIGNAL(clicked()),this,SLOT(saveCurrentTheme())); sep = new QFrame(hb); sep->setFrameStyle(QFrame::VLine | QFrame::Sunken); sep->setMinimumWidth(12); m_pPackThemeButton = new KviStyledToolButton(hb); m_pPackThemeButton->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_PACK))); m_pPackThemeButton->setUsesBigPixmap(true); QToolTip::add(m_pPackThemeButton,__tr2qs_ctx("Export Selected Themes to a Distributable Package","theme")); connect(m_pPackThemeButton,SIGNAL(clicked()),this,SLOT(packTheme())); m_pDeleteThemeButton = new KviStyledToolButton(hb); m_pDeleteThemeButton->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_REMOVE))); m_pDeleteThemeButton->setUsesBigPixmap(true); QToolTip::add(m_pDeleteThemeButton,__tr2qs_ctx("Delete Selected Themes","theme")); connect(m_pDeleteThemeButton,SIGNAL(clicked()),this,SLOT(deleteTheme())); sep = new QFrame(hb); sep->setFrameStyle(QFrame::VLine | QFrame::Sunken); sep->setMinimumWidth(12); tb = new KviStyledToolButton(hb); 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())); tb = new KviStyledToolButton(hb); tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_WWW))); tb->setUsesBigPixmap(true); QToolTip::add(tb,__tr2qs_ctx("Get More Themes...","theme")); connect(tb,SIGNAL(clicked()),this,SLOT(getMoreThemes())); QWidget *w= new QWidget(hb); w->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); m_pListBox = new QListBox(this); m_pListBox->setMinimumHeight(400); m_pListBox->setMinimumWidth(400); m_pListBox->setSelectionMode(QListBox::Extended); connect(m_pListBox,SIGNAL(doubleClicked(QListBoxItem *)),this,SLOT(applyTheme(QListBoxItem *))); connect(m_pListBox,SIGNAL(contextMenuRequested(QListBoxItem *,const QPoint &)), this,SLOT(contextMenuRequested(QListBoxItem *,const QPoint &))); connect(m_pListBox,SIGNAL(selectionChanged()),this,SLOT(enableDisableButtons())); g->addMultiCellWidget(m_pListBox,1,1,0,1); QPushButton * b = new QPushButton(__tr2qs("Close"),this); connect(b,SIGNAL(clicked()),this,SLOT(closeClicked())); g->addWidget(b,2,1); g->setRowStretch(1,0); g->setColStretch(0,1); fillThemeBox(); m_pContextPopup = new QPopupMenu(this); if(g_rectManagementDialogGeometry.y() < 5) { g_rectManagementDialogGeometry.setY(5); } resize(g_rectManagementDialogGeometry.width(), g_rectManagementDialogGeometry.height()); move(g_rectManagementDialogGeometry.x(), g_rectManagementDialogGeometry.y()); } 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; } void KviThemeManagementDialog::display() { if(m_pInstance)return; m_pInstance = new KviThemeManagementDialog(g_pFrame); m_pInstance->show(); } void KviThemeManagementDialog::cleanup() { if(!m_pInstance)return; delete m_pInstance; m_pInstance = 0; } void KviThemeManagementDialog::packTheme() { KviPtrList dl; dl.setAutoDelete(false); for(KviThemeListBoxItem * it = (KviThemeListBoxItem *)m_pListBox->firstItem();it;it = (KviThemeListBoxItem *)it->next()) { if(it->isSelected()) dl.append(it->themeInfo()); } if(dl.isEmpty())return; KviPackThemeDialog * pDialog = new KviPackThemeDialog(this,&dl); pDialog->exec(); delete pDialog; } void KviThemeManagementDialog::contextMenuRequested ( QListBoxItem * it, const QPoint & pos ) { if(it) { m_pListBox->setCurrentItem(it); m_pContextPopup->clear(); m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MINUS)),__tr2qs_ctx("&Remove Theme","theme"),this,SLOT(deleteTheme())); m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_ACCEPT)),__tr2qs_ctx("&Apply Theme","theme"),this,SLOT(applyCurrentTheme())); m_pContextPopup->popup(pos); } } void KviThemeManagementDialog::applyTheme ( QListBoxItem * it) { if(it) m_pListBox->setCurrentItem(it); applyCurrentTheme(); } void KviThemeManagementDialog::applyCurrentTheme() { KviThemeListBoxItem * it = (KviThemeListBoxItem *)m_pListBox->item(m_pListBox->currentItem()); if(!it)return; 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; g_pApp->loadTheme(szPath); } } void KviThemeManagementDialog::deleteTheme() { for(KviThemeListBoxItem * pItem = (KviThemeListBoxItem *)m_pListBox->firstItem();pItem;pItem = (KviThemeListBoxItem *)pItem->next()) { if(pItem->isSelected()) { 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; KviFileUtils::deleteDir(pItem->themeInfo()->szAbsoluteDirectory); } } jump_out: fillThemeBox(); } void KviThemeManagementDialog::installFromXml() { int iThemeCount=0; QString szFileName; QDict * pInfoFields; QString * pValue; bool bInstall; QPixmap pix; QByteArray * pByteArray; const char * check_fields[] = { "Name", "Version", "Author", "Description", "Date", "KVIrcVersion" }; 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)) { QString szErr = r.lastError(); KviMessageBox::information(__tr2qs_ctx("The selected file does not seem to be a valid KVIrc package: %Q","theme"),&szErr); 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() { if(!g_pFrame)return; g_pFrame->executeInternalCommand(KVI_INTERNALCOMMAND_OPENURL_KVIRC_THEMES); } 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(); } } void KviThemeManagementDialog::fillThemeBox(const QString &szDir) { QDir d(szDir); QStringList sl = d.entryList(QDir::Dirs); for(QStringList::Iterator it = sl.begin();it != sl.end();++it) { if(*it == ".")continue; if(*it == "..")continue; QString szTest = szDir; szTest += KVI_PATH_SEPARATOR_CHAR; szTest += *it; KviThemeInfo * inf = new KviThemeInfo; inf->szSubdirectory = *it; if(g_pApp->loadThemeInfo(szTest,*inf)) { KviThemeListBoxItem * item = 0; item = new KviThemeListBoxItem(m_pListBox,inf); } else { delete inf; } } } 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(); } bool KviThemeManagementDialog::hasSelectedItems() { for(QListBoxItem * it = m_pListBox->firstItem();it;it = it->next()) { if(it->isSelected())return true; } return false; } void KviThemeManagementDialog::enableDisableButtons() { bool b = hasSelectedItems(); m_pPackThemeButton->setEnabled(b); m_pDeleteThemeButton->setEnabled(b); }