From 1655daf2249fa681bcf56f176b7a49c6332ff26f Mon Sep 17 00:00:00 2001
From: Szymon Tomasz Stefanek
Date: Sat, 30 Dec 2006 14:47:50 +0000
Subject: Theme management stuff and other tricks
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@75 17fca916-40b9-46aa-a4ea-0a15b648b75c
---
src/modules/theme/managementdialog.cpp | 1148 ++++++++++++++++++++++++++++++++
1 file changed, 1148 insertions(+)
create mode 100644 src/modules/theme/managementdialog.cpp
(limited to 'src/modules/theme/managementdialog.cpp')
diff --git a/src/modules/theme/managementdialog.cpp b/src/modules/theme/managementdialog.cpp
new file mode 100644
index 000000000..566b2691c
--- /dev/null
+++ b/src/modules/theme/managementdialog.cpp
@@ -0,0 +1,1148 @@
+//=============================================================================
+//
+// 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_THEMES)));
+
+ 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 = 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_SAVE)));
+ tb->setUsesBigPixmap(true);
+ QToolTip::add(tb,__tr2qs_ctx("Save Current Theme...","theme"));
+ connect(tb,SIGNAL(clicked()),this,SLOT(saveCurrentTheme()));
+
+ 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()));
+
+ 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,0);
+
+ 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()
+{
+ QString szFileName;
+ QDict * pInfoFields;
+ QString * pValue;
+ bool bInstall;
+
+ 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;
+ int 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 it's picture
+ /*
+ 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);
+}
+
+
--
cgit v1.3.1-10-gc9f91