You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
490 lines
15 KiB
490 lines
15 KiB
//=============================================================================
|
|
//
|
|
// 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. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
//
|
|
//=============================================================================
|
|
|
|
#include "packthemedialog.h"
|
|
#include "themefunctions.h"
|
|
|
|
#include <tqlayout.h>
|
|
#include <tqpushbutton.h>
|
|
#include <tqlineedit.h>
|
|
#include <tqregexp.h>
|
|
#include <tqmessagebox.h>
|
|
#include <tqdir.h>
|
|
#include <tqcombobox.h>
|
|
#include <tqpainter.h>
|
|
#include <tqtooltip.h>
|
|
#include <tqimage.h>
|
|
#include <kvi_tal_textedit.h>
|
|
#ifdef COMPILE_USE_QT4
|
|
#include <tq3multilineedit.h>
|
|
#include <TQDateTime>
|
|
#else
|
|
#include <tqmultilineedit.h>
|
|
#endif
|
|
#include <tqbuffer.h>
|
|
#include <tqlabel.h>
|
|
#include <tqregexp.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(TQWidget * pParent,KviPointerList<KviThemeInfo> * pThemeInfoList)
|
|
: KviTalWizard(pParent)
|
|
{
|
|
m_pThemeInfoList = pThemeInfoList;
|
|
|
|
KviThemeInfo * pThemeInfo;
|
|
TQString szPackageName;
|
|
TQString szPackageAuthor;
|
|
TQString szPackageDescription;
|
|
TQString szPackageVersion;
|
|
|
|
m_szPackagePath = TQDir::homeDirPath();
|
|
KviTQString::ensureLastCharIs(m_szPackagePath,TQChar(KVI_PATH_SEPARATOR_CHAR));
|
|
|
|
bool bPackagePathSet = false;
|
|
|
|
if(m_pThemeInfoList->count() > 1)
|
|
{
|
|
szPackageName = "MyThemes";
|
|
szPackageAuthor = __tr2qs_ctx("Your name here","theme");
|
|
szPackageVersion = "1.0.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();
|
|
|
|
m_szPackagePath += pThemeInfo->subdirectory();
|
|
if(m_szPackagePath.find(TQRegExp("[0-9]\\.[0-9]")) == -1)
|
|
{
|
|
m_szPackagePath += "-";
|
|
m_szPackagePath += szPackageVersion;
|
|
}
|
|
m_szPackagePath += ".";
|
|
m_szPackagePath += KVI_FILEEXTENSION_THEMEPACKAGE;
|
|
|
|
bPackagePathSet = true;
|
|
}
|
|
}
|
|
|
|
if(!bPackagePathSet)
|
|
{
|
|
m_szPackagePath += szPackageName;
|
|
m_szPackagePath += "-";
|
|
m_szPackagePath += szPackageVersion;
|
|
m_szPackagePath += ".";
|
|
m_szPackagePath += KVI_FILEEXTENSION_THEMEPACKAGE;
|
|
}
|
|
|
|
setCaption(__tr2qs_ctx("Export Theme - KVIrc","theme"));
|
|
setMinimumSize(400,350);
|
|
|
|
// welcome page ==================================================================================
|
|
TQWidget * pPage = new TQWidget(this);
|
|
TQGridLayout * pLayout = new TQGridLayout(pPage,2,1,4,4);
|
|
|
|
TQLabel * pLabel = new TQLabel(pPage);
|
|
TQString 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 TQWidget(this);
|
|
pLayout = new TQGridLayout(pPage,2,1,4,4);
|
|
|
|
pLabel = new TQLabel(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(TQt::RichText);
|
|
pLayout->addWidget(pLabel,0,0);
|
|
|
|
TQString szThemesDescription = "<html><body bgcolor=\"#ffffff\">";
|
|
|
|
int iIdx = 0;
|
|
TQPixmap pixScreenshot;
|
|
TQString szScreenshotPath;
|
|
|
|
for(pThemeInfo = m_pThemeInfoList->first();pThemeInfo;pThemeInfo = m_pThemeInfoList->next())
|
|
{
|
|
TQString szThemeDescription;
|
|
|
|
if(pixScreenshot.isNull())
|
|
{
|
|
pixScreenshot = pThemeInfo->smallScreenshot();
|
|
if(!pixScreenshot.isNull())
|
|
szScreenshotPath = pThemeInfo->smallScreenshotPath();
|
|
}
|
|
|
|
KviThemeFunctions::getThemeHtmlDescription(
|
|
szThemeDescription,
|
|
pThemeInfo->name(),
|
|
pThemeInfo->version(),
|
|
pThemeInfo->description(),
|
|
pThemeInfo->subdirectory(),
|
|
pThemeInfo->application(),
|
|
pThemeInfo->author(),
|
|
pThemeInfo->date(),
|
|
pThemeInfo->themeEngineVersion(),
|
|
pThemeInfo->smallScreenshot(),
|
|
iIdx
|
|
);
|
|
|
|
if(iIdx > 0)
|
|
szThemesDescription += "<hr>";
|
|
szThemesDescription += szThemeDescription;
|
|
iIdx++;
|
|
}
|
|
|
|
szThemesDescription += "</body></html>";
|
|
|
|
KviTalTextEdit * pTextEdit = new KviTalTextEdit(pPage);
|
|
pTextEdit->setPaper(TQBrush(TQColor(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 TQWidget(this);
|
|
pLayout = new TQGridLayout(pPage,5,2,4,4);
|
|
|
|
pLabel = new TQLabel(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(TQt::RichText);
|
|
pLayout->addMultiCellWidget(pLabel,0,0,0,1);
|
|
|
|
pLabel = new TQLabel(pPage);
|
|
pLabel->setText(__tr2qs_ctx("Package Name:","theme"));
|
|
pLayout->addWidget(pLabel,1,0);
|
|
|
|
m_pPackageNameEdit = new TQLineEdit(pPage);
|
|
m_pPackageNameEdit->setText(szPackageName);
|
|
pLayout->addWidget(m_pPackageNameEdit,1,1);
|
|
|
|
pLabel = new TQLabel(pPage);
|
|
pLabel->setText(__tr2qs_ctx("Version:","theme"));
|
|
pLayout->addWidget(pLabel,2,0);
|
|
|
|
m_pPackageVersionEdit = new TQLineEdit(pPage);
|
|
m_pPackageVersionEdit->setText(szPackageVersion);
|
|
pLayout->addWidget(m_pPackageVersionEdit,2,1);
|
|
|
|
pLabel = new TQLabel(pPage);
|
|
pLabel->setText(__tr2qs_ctx("Description:","theme"));
|
|
pLayout->addWidget(pLabel,3,0);
|
|
|
|
m_pPackageDescriptionEdit = new KviTalTextEdit(pPage);
|
|
m_pPackageDescriptionEdit->setText(szPackageDescription);
|
|
pLayout->addWidget(m_pPackageDescriptionEdit,3,1);
|
|
|
|
pLabel = new TQLabel(pPage);
|
|
pLabel->setText(__tr2qs_ctx("Package Author:","theme"));
|
|
pLayout->addWidget(pLabel,4,0);
|
|
|
|
m_pPackagerNameEdit = new TQLineEdit(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 TQWidget(this);
|
|
pLayout = new TQGridLayout(pPage,3,1,4,4);
|
|
|
|
pLabel = new TQLabel(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(TQt::RichText);
|
|
pLayout->addWidget(pLabel,0,0);
|
|
|
|
m_pImageLabel = new TQLabel(pPage);
|
|
m_pImageLabel->setFrameStyle(TQFrame::Sunken | TQFrame::Panel);
|
|
m_pImageLabel->setMinimumSize(300,225);
|
|
m_pImageLabel->setAlignment(TQt::AlignCenter | TQt::AlignVCenter);
|
|
pLayout->addWidget(m_pImageLabel,1,0);
|
|
|
|
TQString szFilter = "*.png *.jpg *.xpm";
|
|
m_pImageSelector = new KviFileSelector(pPage,"",&m_szImagePath,true,0,szFilter);
|
|
connect(m_pImageSelector,TQT_SIGNAL(selectionChanged(const TQString &)),this,TQT_SLOT(imageSelectionChanged(const TQString &)));
|
|
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 TQWidget(this);
|
|
pLayout = new TQGridLayout(pPage,4,1,4,4);
|
|
|
|
pLabel = new TQLabel(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(TQt::RichText);
|
|
pLayout->addWidget(pLabel,0,0);
|
|
|
|
szFilter = "*.";
|
|
szFilter += KVI_FILEEXTENSION_THEMEPACKAGE;
|
|
m_pPathSelector = new KviFileSelector(pPage,"",&m_szPackagePath,true,KviFileSelector::ChooseSaveFileName,szFilter);
|
|
pLayout->addWidget(m_pPathSelector,1,0);
|
|
|
|
pLabel = new TQLabel(pPage);
|
|
pLabel->setText(__tr2qs_ctx("Finally hit the \"Finish\" button to complete the packaging operation.","theme"));
|
|
pLabel->setTextFormat(TQt::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);
|
|
|
|
if(!szScreenshotPath.isEmpty())
|
|
{
|
|
m_pImageSelector->setSelection(szScreenshotPath);
|
|
imageSelectionChanged(szScreenshotPath);
|
|
}
|
|
}
|
|
|
|
KviPackThemeDialog::~KviPackThemeDialog()
|
|
{
|
|
}
|
|
|
|
void KviPackThemeDialog::imageSelectionChanged(const TQString &szImagePath)
|
|
{
|
|
TQImage pix(szImagePath);
|
|
if(!pix.isNull())
|
|
{
|
|
TQPixmap out;
|
|
if(pix.width() > 300 || pix.height() > 225)
|
|
#ifdef COMPILE_USE_QT4
|
|
out.convertFromImage(pix.scaled(300,225,TQt::KeepAspectRatio,TQt::SmoothTransformation));
|
|
#else
|
|
out.convertFromImage(pix.smoothScale(300,225,TQ_ScaleMin));
|
|
#endif
|
|
else
|
|
out.convertFromImage(pix);
|
|
m_pImageLabel->setPixmap(out);
|
|
return;
|
|
}
|
|
|
|
TQMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),__tr2qs_ctx("Failed to load the selected image","theme"),
|
|
TQMessageBox::Ok,TQMessageBox::NoButton,TQMessageBox::NoButton);
|
|
|
|
m_pImageSelector->setSelection("");
|
|
m_pImageLabel->setPixmap(TQPixmap());
|
|
}
|
|
|
|
|
|
void KviPackThemeDialog::accept()
|
|
{
|
|
if(!packTheme())return;
|
|
KviTalWizard::accept();
|
|
}
|
|
|
|
|
|
bool KviPackThemeDialog::packTheme()
|
|
{
|
|
m_pImageSelector->commit();
|
|
m_pPathSelector->commit();
|
|
|
|
TQString szPackageAuthor = m_pPackagerNameEdit->text();
|
|
TQString szPackageName = m_pPackageNameEdit->text();
|
|
TQString szPackageDescription = m_pPackageDescriptionEdit->text();
|
|
TQString szPackageVersion = m_pPackageVersionEdit->text();
|
|
|
|
TQImage pix(m_szImagePath);
|
|
TQPixmap out;
|
|
if(!pix.isNull())
|
|
{
|
|
if(pix.width() > 300 || pix.height() > 225)
|
|
#ifdef COMPILE_USE_QT4
|
|
out.convertFromImage(pix.scaled(300,225,TQt::KeepAspectRatio));
|
|
#else
|
|
out.convertFromImage(pix.smoothScale(300,225,TQ_ScaleMin));
|
|
#endif
|
|
else
|
|
out.convertFromImage(pix);
|
|
} else {
|
|
if(!m_szImagePath.isEmpty())
|
|
{
|
|
TQMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),__tr2qs_ctx("Failed to load the selected image: please fix it","theme"),
|
|
TQMessageBox::Ok,TQMessageBox::NoButton,TQMessageBox::NoButton);
|
|
setCurrentPage(m_pImageSelectionPage);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
KviPackageWriter f;
|
|
|
|
TQString szTmp = TQDateTime::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())
|
|
{
|
|
TQByteArray * pba = new TQByteArray();
|
|
#ifdef COMPILE_USE_QT4
|
|
TQBuffer buffer(pba,0);
|
|
#else
|
|
TQBuffer buffer(*pba);
|
|
#endif
|
|
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())
|
|
{
|
|
KviTQString::sprintf(szTmp,"Theme%dName",iIdx);
|
|
f.addInfoField(szTmp,pInfo->name());
|
|
KviTQString::sprintf(szTmp,"Theme%dVersion",iIdx);
|
|
f.addInfoField(szTmp,pInfo->version());
|
|
KviTQString::sprintf(szTmp,"Theme%dDescription",iIdx);
|
|
f.addInfoField(szTmp,pInfo->description());
|
|
KviTQString::sprintf(szTmp,"Theme%dDate",iIdx);
|
|
f.addInfoField(szTmp,pInfo->date());
|
|
KviTQString::sprintf(szTmp,"Theme%dSubdirectory",iIdx);
|
|
f.addInfoField(szTmp,pInfo->subdirectory());
|
|
KviTQString::sprintf(szTmp,"Theme%dAuthor",iIdx);
|
|
f.addInfoField(szTmp,pInfo->author());
|
|
KviTQString::sprintf(szTmp,"Theme%dApplication",iIdx);
|
|
f.addInfoField(szTmp,pInfo->application());
|
|
KviTQString::sprintf(szTmp,"Theme%dThemeEngineVersion",iIdx);
|
|
f.addInfoField(szTmp,pInfo->themeEngineVersion());
|
|
TQPixmap pixScreenshot = pInfo->smallScreenshot();
|
|
if(!pixScreenshot.isNull())
|
|
{
|
|
KviTQString::sprintf(szTmp,"Theme%dScreenshot",iIdx);
|
|
TQByteArray * pba = new TQByteArray();
|
|
#ifdef COMPILE_USE_QT4
|
|
TQBuffer bufferz(pba,0);
|
|
#else
|
|
TQBuffer bufferz(*pba);
|
|
#endif
|
|
bufferz.open(IO_WriteOnly);
|
|
pixScreenshot.save(&bufferz,"PNG");
|
|
bufferz.close();
|
|
f.addInfoField(szTmp,pba);
|
|
}
|
|
|
|
if(!f.addDirectory(pInfo->absoluteDirectory(),pInfo->subdirectory()))
|
|
{
|
|
szTmp = __tr2qs_ctx("Packaging failed","theme");
|
|
szTmp += ": ";
|
|
szTmp += f.lastError();
|
|
TQMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),szTmp,
|
|
TQMessageBox::Ok,TQMessageBox::NoButton,TQMessageBox::NoButton);
|
|
}
|
|
|
|
iIdx++;
|
|
}
|
|
|
|
if(!f.pack(m_szPackagePath))
|
|
{
|
|
szTmp = __tr2qs_ctx("Packaging failed","theme");
|
|
szTmp += ": ";
|
|
szTmp += f.lastError();
|
|
TQMessageBox::critical(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),szTmp,
|
|
TQMessageBox::Ok,TQMessageBox::NoButton,TQMessageBox::NoButton);
|
|
return false;
|
|
}
|
|
|
|
//KviPackageReader r;
|
|
//r.unpack("/root/test.kvt","/root/unpacked_test_kvt");
|
|
|
|
TQMessageBox::information(this,__tr2qs_ctx("Export Theme - KVIrc","theme"),__tr2qs("Package saved succesfully"),
|
|
TQMessageBox::Ok,TQMessageBox::NoButton,TQMessageBox::NoButton);
|
|
|
|
return true;
|
|
}
|
|
|