aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authorGravatar Szymon Tomasz Stefanek2007-01-10 01:34:47 +0000
committerGravatar Szymon Tomasz Stefanek2007-01-10 01:34:47 +0000
commitc7caa2579263eb0ec07625627e9d090f1292a0b0 (patch)
treee6744b330ed28b0a319edd172a86c605de68a99d /src/modules
parentctrl+w, alt+backspace shortcuts (diff)
downloadKVIrc-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')
-rw-r--r--src/modules/addon/libkviaddon.cpp11
-rw-r--r--src/modules/math/libkvimath.cpp2
-rw-r--r--src/modules/mediaplayer/libkvimediaplayer.cpp3
-rw-r--r--src/modules/mediaplayer/mp_xmmsinterface.cpp183
-rw-r--r--src/modules/mediaplayer/mp_xmmsinterface.h25
-rw-r--r--src/modules/setup/libkvisetup.cpp4
-rw-r--r--src/modules/system/libkvisystem.cpp36
-rw-r--r--src/modules/theme/Makefile.am22
-rw-r--r--src/modules/theme/libkvitheme.cpp14
-rw-r--r--src/modules/theme/managementdialog.cpp834
-rw-r--r--src/modules/theme/managementdialog.h69
-rw-r--r--src/modules/theme/packthemedialog.cpp456
-rw-r--r--src/modules/theme/packthemedialog.h65
-rw-r--r--src/modules/theme/savethemedialog.cpp173
-rw-r--r--src/modules/theme/savethemedialog.h62
-rw-r--r--src/modules/theme/themefunctions.cpp240
-rw-r--r--src/modules/theme/themefunctions.h39
17 files changed, 1297 insertions, 941 deletions
diff --git a/src/modules/addon/libkviaddon.cpp b/src/modules/addon/libkviaddon.cpp
index 2dc34efab..2095bf216 100644
--- a/src/modules/addon/libkviaddon.cpp
+++ b/src/modules/addon/libkviaddon.cpp
@@ -35,6 +35,7 @@
#include "kvi_mirccntrl.h"
#include "kvi_config.h"
#include "kvi_sourcesdate.h"
+#include "kvi_miscutils.h"
#include "managementdialog.h"
@@ -75,7 +76,7 @@ static bool addon_kvs_fnc_exists(KviKvsModuleFunctionCall * c)
{
c->returnValue()->setBoolean(true);
} else {
- c->returnValue()->setBoolean(KviKvsScriptAddonManager::instance()->compareVersions(a->version(),szVersion) < 0);
+ c->returnValue()->setBoolean(KviMiscUtils::compareVersions(a->version(),szVersion) < 0);
}
} else {
c->returnValue()->setBoolean(false);
@@ -530,19 +531,19 @@ static bool addon_kvs_cmd_register(KviKvsModuleCallbackCommandCall * c)
if(c->callback())
rd.szUninstallCallbackScript = c->callback()->code();
- if(!KviKvsScriptAddonManager::instance()->isValidVersionString(rd.szVersion))
+ if(!KviMiscUtils::isValidVersionString(rd.szVersion))
{
c->error(__tr2qs("The specified version \"%Q\" is not a valid version string"),&(rd.szVersion));
return false;
}
- if(!KviKvsScriptAddonManager::instance()->isValidVersionString(szMinKVIrcVersion))
+ if(!KviMiscUtils::isValidVersionString(szMinKVIrcVersion))
{
c->error(__tr2qs("The specified KVIrc version \"%Q\" is not a valid version string"),&szMinKVIrcVersion);
return false;
}
- if(KviKvsScriptAddonManager::instance()->compareVersions(szMinKVIrcVersion,KVI_VERSION "." KVI_SOURCES_DATE) < 0)
+ if(KviMiscUtils::compareVersions(szMinKVIrcVersion,KVI_VERSION "." KVI_SOURCES_DATE) < 0)
{
c->error(__tr2qs("This KVIrc executable is too old to run this addon (minimum version required is %Q)"),&szMinKVIrcVersion);
return false;
@@ -555,7 +556,7 @@ static bool addon_kvs_cmd_register(KviKvsModuleCallbackCommandCall * c)
if(a)
{
// the same addon already exists
- if(KviKvsScriptAddonManager::instance()->compareVersions(a->version(),rd.szVersion) < 0)
+ if(KviMiscUtils::compareVersions(a->version(),rd.szVersion) < 0)
{
// and it has a higher version...
// complain unless -f is used
diff --git a/src/modules/math/libkvimath.cpp b/src/modules/math/libkvimath.cpp
index 829292acb..849a7c930 100644
--- a/src/modules/math/libkvimath.cpp
+++ b/src/modules/math/libkvimath.cpp
@@ -472,7 +472,7 @@ static bool math_module_cleanup(KviModule *m)
}
KVIRC_MODULE(
- "System", // module name
+ "Math", // module name
"1.0.0", // module version
"Copyright (C) 2006 Szymon Stefanek (pragma at kvirc dot net),"\
"Tonino Imbesi (grifisx at barmes dot org)," \
diff --git a/src/modules/mediaplayer/libkvimediaplayer.cpp b/src/modules/mediaplayer/libkvimediaplayer.cpp
index 1176c7bd4..4eb227f3f 100644
--- a/src/modules/mediaplayer/libkvimediaplayer.cpp
+++ b/src/modules/mediaplayer/libkvimediaplayer.cpp
@@ -1396,7 +1396,7 @@ MP_KVS_FUNCTION(status)
the informations about the currently played media (in order to implement the nice /playing
scripts). The module has replaced the old mediaplayer module which after
years of development had developed some design flaws and needed a complete rewrite.
- At the moment of writing the supported players are: xmms (unix), winamp (windows),
+ At the moment of writing the supported players are: xmms (unix), audacious (unix), winamp (windows),
amarok (kde) and juk (kde). You choose the player interface by either setting
the option in the settings dialog, by manually setting [cmd]option[/cmd] stringPreferredMediaPlayer
or by running [cmd]mediaplayer.detect[/cmd] that will guess the media player interface for you.[br]
@@ -1516,6 +1516,7 @@ static bool mediaplayer_module_init( KviModule * m )
#ifndef COMPILE_ON_WINDOWS
g_pDescriptorList->append(MP_CREATE_DESCRIPTOR(KviXmmsInterface));
+ g_pDescriptorList->append(MP_CREATE_DESCRIPTOR(KviAudaciousInterface));
#endif
#ifdef COMPILE_ON_WINDOWS
diff --git a/src/modules/mediaplayer/mp_xmmsinterface.cpp b/src/modules/mediaplayer/mp_xmmsinterface.cpp
index 5ace1ac55..1bb1caaba 100644
--- a/src/modules/mediaplayer/mp_xmmsinterface.cpp
+++ b/src/modules/mediaplayer/mp_xmmsinterface.cpp
@@ -4,7 +4,7 @@
// Created on Fri 25 Mar 2005 20:04:54 by Szymon Stefanek
//
// This file is part of the KVIrc IRC client distribution
-// Copyright (C) 2005 Szymon Stefanek <pragma at kvirc dot net>
+// Copyright (C) 2005-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
@@ -20,13 +20,15 @@
// along with this program. If not, write to the Free Software Foundation,
// Inc. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
+// Thnx to Alexander Stillich <torque at pltn dot org> for Audacious
+// media player interface hints :)
+//
//=============================================================================
#include "mp_xmmsinterface.h"
#ifndef COMPILE_ON_WINDOWS
-#include "kvi_library.h"
#include "kvi_locale.h"
MP_IMPLEMENT_DESCRIPTOR(
@@ -40,77 +42,118 @@ MP_IMPLEMENT_DESCRIPTOR(
)
)
+MP_IMPLEMENT_DESCRIPTOR(
+ KviAudaciousInterface,
+ "audacious",
+ __tr2qs_ctx(
+ "An interface to the popular UNIX audacious media player.\n" \
+ "Download it from http://audacious-media-player.org\n"
+ ,
+ "mediaplayer"
+ )
+)
-static kvi_library_t g_hXmmsLib = 0;
+static const char *xmms_lib_names[] =
+{
+ "libxmms.so",
+ "libxmms.so.1",
+ "/usr/lib/libxmms.so",
+ "/usr/lib/libxmms.so.1",
+ "/usr/local/lib/libxmms.so",
+ "/usr/local/lib/libxmms.so.1",
+ 0
+};
-static inline kvi_library_t load_xmms_lib()
+static const char *audacious_lib_names[] =
{
- if(g_hXmmsLib)return g_hXmmsLib;
- g_hXmmsLib = kvi_library_load("libxmms.so");
- if(!g_hXmmsLib)
- {
- g_hXmmsLib = kvi_library_load("libxmms.so.1");
- if(!g_hXmmsLib)
- {
- g_hXmmsLib = kvi_library_load("/usr/lib/libxmms.so");
- if(!g_hXmmsLib)
- {
- g_hXmmsLib = kvi_library_load("/usr/lib/libxmms.so.1");
- if(!g_hXmmsLib)
- {
- g_hXmmsLib = kvi_library_load("/usr/local/lib/libxmms.so");
- if(!g_hXmmsLib)
- {
- g_hXmmsLib = kvi_library_load("/usr/local/lib/libxmms.so.1");
- }
- }
- }
- }
- }
- return g_hXmmsLib;
+ "libaudacious.so",
+ "libaudacious.so.4",
+ "/usr/lib/libaudacious.so",
+ "/usr/lib/libaudacious.so.4",
+ "/usr/local/lib/libaudacious.so",
+ "/usr/local/lib/libaudacious.so.4",
+ 0
+};
+
+
+
+KviXmmsInterface::KviXmmsInterface()
+: KviMediaPlayerInterface()
+{
+ m_hPlayerLibrary = 0;
+ m_szPlayerLibraryName = "libxmms.so";
+ m_pLibraryPaths = xmms_lib_names;
}
-static inline void * lookup_xmms_symbol(KviXmmsInterface * i,const char * sym)
+KviXmmsInterface::~KviXmmsInterface()
{
- if(!load_xmms_lib())
- {
- i->setLastError(__tr2qs_ctx("Can't load the xmms library (libxmms.so)","mediaplayer"));
- return 0;
- }
- void * symptr = kvi_library_symbol(g_hXmmsLib,sym);
- if(!symptr)
+ if(m_hPlayerLibrary)
{
- QString tmp;
- KviQString::sprintf(tmp,__tr2qs_ctx("Can't find symbol %s in libxmms.so","mediaplayer"),sym);
- i->setLastError(tmp);
+ kvi_library_close(m_hPlayerLibrary);
+ m_hPlayerLibrary = 0;
}
- return symptr;
}
+KviAudaciousInterface::KviAudaciousInterface()
+: KviXmmsInterface()
+{
+ m_szPlayerLibraryName = "libaudacious.so";
+ m_pLibraryPaths = audacious_lib_names;
+}
+KviAudaciousInterface::~KviAudaciousInterface()
+{
+}
-KviXmmsInterface::KviXmmsInterface()
-: KviMediaPlayerInterface()
+bool KviXmmsInterface::loadPlayerLibrary()
{
+ if(m_hPlayerLibrary)return true;
+
+ const char **lib_name = m_pLibraryPaths;
+ while(*lib_name)
+ {
+ m_hPlayerLibrary = kvi_library_load(*lib_name);
+ if(m_hPlayerLibrary)
+ {
+ m_szPlayerLibraryName = *lib_name;
+ break;
+ }
+ lib_name++;
+ }
+ return true;
}
-KviXmmsInterface::~KviXmmsInterface()
+void * KviXmmsInterface::lookupSymbol(const char * szSymbolName)
{
- if(g_hXmmsLib)
+ if(!m_hPlayerLibrary)
+ {
+ if(!loadPlayerLibrary())
+ {
+ QString tmp;
+ KviQString::sprintf(tmp,__tr2qs_ctx("Can't load the player library (%Q)","mediaplayer"),&m_szPlayerLibraryName);
+ setLastError(tmp);
+ return 0;
+ }
+ }
+ void * symptr = kvi_library_symbol(m_hPlayerLibrary,szSymbolName);
+ if(!symptr)
{
- kvi_library_close(g_hXmmsLib);
- g_hXmmsLib = 0;
+ QString tmp;
+ KviQString::sprintf(tmp,__tr2qs_ctx("Can't find symbol %s in %Q","mediaplayer"),szSymbolName,&m_szPlayerLibraryName);
+ setLastError(tmp);
}
+ return symptr;
}
+
int KviXmmsInterface::detect(bool bStart)
{
- void * sym = lookup_xmms_symbol(this,"xmms_remote_play");
+ void * sym = lookupSymbol("xmms_remote_play");
return sym ? 80 : 0;
}
#define XMMS_SIMPLE_CALL(__symname) \
- void (*sym)(int) = (void (*)(int))lookup_xmms_symbol(this,__symname); \
+ void (*sym)(int) = (void (*)(int))lookupSymbol(__symname); \
if(!sym)return false; \
sym(0); \
return true;
@@ -147,7 +190,7 @@ bool KviXmmsInterface::quit()
bool KviXmmsInterface::jumpTo(int &iPos)
{
- void (*sym)(int,int) = (void (*)(int,int))lookup_xmms_symbol(this,"xmms_remote_jump_to_time");
+ void (*sym)(int,int) = (void (*)(int,int))lookupSymbol("xmms_remote_jump_to_time");
if(!sym)return false;
sym(0,iPos);
return true;
@@ -155,7 +198,7 @@ bool KviXmmsInterface::jumpTo(int &iPos)
bool KviXmmsInterface::setVol(int &iVol)
{
- void (*sym)(int,int) = (void (*)(int,int))lookup_xmms_symbol(this,"xmms_remote_set_main_volume");
+ void (*sym)(int,int) = (void (*)(int,int))lookupSymbol("xmms_remote_set_main_volume");
if(!sym)return false;
sym(0,100*iVol/255);
return true;
@@ -163,7 +206,7 @@ bool KviXmmsInterface::setVol(int &iVol)
int KviXmmsInterface::getVol()
{
- int (*sym)(int) = (int (*)(int))lookup_xmms_symbol(this,"xmms_remote_get_main_volume");
+ int (*sym)(int) = (int (*)(int))lookupSymbol("xmms_remote_get_main_volume");
if(!sym)return -1;
int iVol = sym(0);
return iVol * 255 /100;
@@ -171,7 +214,7 @@ int KviXmmsInterface::getVol()
bool KviXmmsInterface::getRepeat()
{
- bool (*sym)(int) = (bool (*)(int))lookup_xmms_symbol(this,"xmms_remote_is_repeat");
+ bool (*sym)(int) = (bool (*)(int))lookupSymbol("xmms_remote_is_repeat");
if(!sym)return false;
bool ret = sym(0);
return ret;
@@ -179,12 +222,12 @@ bool KviXmmsInterface::getRepeat()
bool KviXmmsInterface::setRepeat(bool &bVal)
{
- bool (*sym1)(int) = (bool (*)(int))lookup_xmms_symbol(this,"xmms_remote_is_repeat");
+ bool (*sym1)(int) = (bool (*)(int))lookupSymbol("xmms_remote_is_repeat");
if(!sym1)return false;
bool bNow = sym1(0);
if(bNow != bVal)
{
- void (*sym2)(int) = (void (*)(int))lookup_xmms_symbol(this,"xmms_remote_toggle_repeat");
+ void (*sym2)(int) = (void (*)(int))lookupSymbol("xmms_remote_toggle_repeat");
if(!sym2)return false;
sym2(0);
}
@@ -193,7 +236,7 @@ bool KviXmmsInterface::setRepeat(bool &bVal)
bool KviXmmsInterface::getShuffle()
{
- bool (*sym)(int) = (bool (*)(int))lookup_xmms_symbol(this,"xmms_remote_is_shuffle");
+ bool (*sym)(int) = (bool (*)(int))lookupSymbol("xmms_remote_is_shuffle");
if(!sym)return false;
bool ret = sym(0);
return ret;
@@ -201,12 +244,12 @@ bool KviXmmsInterface::getShuffle()
bool KviXmmsInterface::setShuffle(bool &bVal)
{
- bool (*sym1)(int) = (bool (*)(int))lookup_xmms_symbol(this,"xmms_remote_is_shuffle");
+ bool (*sym1)(int) = (bool (*)(int))lookupSymbol("xmms_remote_is_shuffle");
if(!sym1)return false;
bool bNow = sym1(0);
if(bNow != bVal)
{
- void (*sym2)(int) = (void (*)(int))lookup_xmms_symbol(this,"xmms_remote_toggle_shuffle");
+ void (*sym2)(int) = (void (*)(int))lookupSymbol("xmms_remote_toggle_shuffle");
if(!sym2)return false;
sym2(0);
}
@@ -215,11 +258,11 @@ bool KviXmmsInterface::setShuffle(bool &bVal)
KviMediaPlayerInterface::PlayerStatus KviXmmsInterface::status()
{
- bool (*sym1)(int) = (bool (*)(int))lookup_xmms_symbol(this,"xmms_remote_is_paused");
+ bool (*sym1)(int) = (bool (*)(int))lookupSymbol("xmms_remote_is_paused");
if(sym1)
{
if(sym1(0))return KviMediaPlayerInterface::Paused;
- bool (*sym2)(int) = (bool (*)(int))lookup_xmms_symbol(this,"xmms_remote_is_playing");
+ bool (*sym2)(int) = (bool (*)(int))lookupSymbol("xmms_remote_is_playing");
if(sym2)
{
if(sym2(0))return KviMediaPlayerInterface::Playing;
@@ -232,20 +275,20 @@ KviMediaPlayerInterface::PlayerStatus KviXmmsInterface::status()
bool KviXmmsInterface::playMrl(const QString &mrl)
{
- void (*sym)(int,char *) = (void (*)(int,char *))lookup_xmms_symbol(this,"xmms_remote_playlist_add_url_string");
+ void (*sym)(int,char *) = (void (*)(int,char *))lookupSymbol("xmms_remote_playlist_add_url_string");
QCString tmp = mrl.local8Bit();
if(!tmp.isEmpty())
{
if(sym)
{
sym(0,tmp.data());
- int (*sym1)(int) = (int (*)(int))lookup_xmms_symbol(this,"xmms_remote_get_playlist_length");
+ int (*sym1)(int) = (int (*)(int))lookupSymbol("xmms_remote_get_playlist_length");
if(sym1)
{
int len = sym1(0);
if(len > 0)
{
- void (*sym2)(int,int) = (void (*)(int,int))lookup_xmms_symbol(this,"xmms_remote_set_playlist_pos");
+ void (*sym2)(int,int) = (void (*)(int,int))lookupSymbol("xmms_remote_set_playlist_pos");
if(sym2)
{
sym2(0,len - 1);
@@ -259,20 +302,20 @@ bool KviXmmsInterface::playMrl(const QString &mrl)
QString KviXmmsInterface::nowPlaying()
{
- int (*sym)(int) = (int (*)(int))lookup_xmms_symbol(this,"xmms_remote_get_playlist_pos");
+ int (*sym)(int) = (int (*)(int))lookupSymbol("xmms_remote_get_playlist_pos");
if(!sym)return QString::null;
int pos = sym(0);
- char * (*sym2)(int,int) = (char * (*)(int,int))lookup_xmms_symbol(this,"xmms_remote_get_playlist_title");
+ char * (*sym2)(int,int) = (char * (*)(int,int))lookupSymbol("xmms_remote_get_playlist_title");
if(!sym2)return QString::null;
return QString::fromLocal8Bit(sym2(0,pos));
}
QString KviXmmsInterface::mrl()
{
- int (*sym)(int) = (int (*)(int))lookup_xmms_symbol(this,"xmms_remote_get_playlist_pos");
+ int (*sym)(int) = (int (*)(int))lookupSymbol("xmms_remote_get_playlist_pos");
if(!sym)return QString::null;
int pos = sym(0);
- char * (*sym2)(int,int) = (char * (*)(int,int))lookup_xmms_symbol(this,"xmms_remote_get_playlist_file");
+ char * (*sym2)(int,int) = (char * (*)(int,int))lookupSymbol("xmms_remote_get_playlist_file");
if(!sym2)return QString::null;
QString ret = QString::fromLocal8Bit(sym2(0,pos));
if(ret.length() > 1)
@@ -282,27 +325,27 @@ QString KviXmmsInterface::mrl()
int KviXmmsInterface::position()
{
- int (*sym)(int) = (int (*)(int))lookup_xmms_symbol(this,"xmms_remote_get_playlist_pos");
+ int (*sym)(int) = (int (*)(int))lookupSymbol("xmms_remote_get_playlist_pos");
if(!sym)return -1;
int pos = sym(0);
- int (*sym2)(int,int) = (int (*)(int,int))lookup_xmms_symbol(this,"xmms_remote_get_output_time");
+ int (*sym2)(int,int) = (int (*)(int,int))lookupSymbol("xmms_remote_get_output_time");
if(!sym2)return -1;
return sym2(0,pos);
}
int KviXmmsInterface::length()
{
- int (*sym)(int) = (int (*)(int))lookup_xmms_symbol(this,"xmms_remote_get_playlist_pos");
+ int (*sym)(int) = (int (*)(int))lookupSymbol("xmms_remote_get_playlist_pos");
if(!sym)return -1;
int pos = sym(0);
- int (*sym2)(int,int) = (int (*)(int,int))lookup_xmms_symbol(this,"xmms_remote_get_playlist_time");
+ int (*sym2)(int,int) = (int (*)(int,int))lookupSymbol("xmms_remote_get_playlist_time");
if(!sym2)return -1;
return sym2(0,pos);
}
int KviXmmsInterface::getPlayListPos()
{
- int (*sym)(int) = (int (*)(int))lookup_xmms_symbol(this,"xmms_remote_get_playlist_pos");
+ int (*sym)(int) = (int (*)(int))lookupSymbol("xmms_remote_get_playlist_pos");
if(!sym)return -1;
return sym(0);
}
diff --git a/src/modules/mediaplayer/mp_xmmsinterface.h b/src/modules/mediaplayer/mp_xmmsinterface.h
index a49877e4e..8482defd2 100644
--- a/src/modules/mediaplayer/mp_xmmsinterface.h
+++ b/src/modules/mediaplayer/mp_xmmsinterface.h
@@ -6,7 +6,7 @@
// Created on Fri 25 Mar 2005 20:04:54 by Szymon Stefanek
//
// This file is part of the KVIrc IRC client distribution
-// Copyright (C) 2005 Szymon Stefanek <pragma at kvirc dot net>
+// Copyright (C) 2005-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
@@ -22,11 +22,14 @@
// along with this program. If not, write to the Free Software Foundation,
// Inc. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
+// Thnx to Alexander Stillich <torque at pltn dot org> for Audacious
+// media player interface hints :)
+//
//=============================================================================
#include "kvi_settings.h"
#include "mp_interface.h"
-
+#include "kvi_library.h"
#ifndef COMPILE_ON_WINDOWS
class KviXmmsInterface : public KviMediaPlayerInterface
@@ -34,6 +37,10 @@
public:
KviXmmsInterface();
virtual ~KviXmmsInterface();
+ protected:
+ kvi_library_t m_hPlayerLibrary;
+ QString m_szPlayerLibraryName;
+ const char ** m_pLibraryPaths;
public:
virtual int detect(bool bStart);
virtual bool prev();
@@ -57,11 +64,23 @@
virtual bool setRepeat(bool &bVal);
virtual bool setShuffle(bool &bVal);
protected:
- bool initPlayer();
+ bool loadPlayerLibrary();
+ void * lookupSymbol(const char * szSymbolName);
};
MP_DECLARE_DESCRIPTOR(KviXmmsInterface)
+ class KviAudaciousInterface : public KviXmmsInterface
+ {
+ public:
+ KviAudaciousInterface();
+ virtual ~KviAudaciousInterface();
+ protected:
+ virtual void * lookupSymbol(const char * szSymbolName);
+ };
+
+ MP_DECLARE_DESCRIPTOR(KviAudaciousInterface)
+
#endif //!COMPILE_ON_WINDOWS
#endif //!_MP_XMMSINTERFACE_H_
diff --git a/src/modules/setup/libkvisetup.cpp b/src/modules/setup/libkvisetup.cpp
index c86287853..2c0365cbb 100644
--- a/src/modules/setup/libkvisetup.cpp
+++ b/src/modules/setup/libkvisetup.cpp
@@ -35,6 +35,7 @@
#include "kvi_kvs_script.h"
#include "kvi_kvs_variantlist.h"
#include "kvi_window.h"
+#include "kvi_theme.h"
// this will be choosen during the setup process
QString g_szChoosenIncomingDirectory;
@@ -97,7 +98,8 @@ KVIMODULEEXPORTFUNC void setup_finish()
}*/
g_pApp->getGlobalKvircDirectory(szDir,KviApp::Themes,"silverirc");
- g_pApp->loadTheme(szDir);
+ KviThemeInfo out;
+ KviTheme::load(szDir,out);
g_pApp->loadDefaultScript();
if(!szUrl.isEmpty())
diff --git a/src/modules/system/libkvisystem.cpp b/src/modules/system/libkvisystem.cpp
index 979336b87..7f29e2c23 100644
--- a/src/modules/system/libkvisystem.cpp
+++ b/src/modules/system/libkvisystem.cpp
@@ -44,6 +44,8 @@
#include <dcopclient.h>
#endif
+#include "kvi_modulemanager.h"
+
/*
@doc: system.ostype
@type:
@@ -334,6 +336,39 @@ static bool system_kvs_fnc_selection(KviKvsModuleFunctionCall *c)
/*
+ @doc: system.checkModule
+ @keyterms:
+ Module checking
+ @type:
+ function
+ @title:
+ $system.checkModule
+ @short:
+ Checks if a KVIrc module is loadable
+ @syntax:
+ <boolean> $system.checkModule(<module_name:string>)
+ @description:
+ Attempts to load the specified module and returns
+ $true if succesfull and $false otherwise. This can
+ be effectively used to test if a KVIrc exension module
+ is present on the system and can be loaded by the
+ KVIrc engine.
+*/
+
+static bool system_kvs_fnc_checkModule(KviKvsModuleFunctionCall *c)
+{
+ QString szModuleName;
+
+ KVSM_PARAMETERS_BEGIN(c)
+ KVSM_PARAMETER("module_name",KVS_PT_STRING,0,szModuleName)
+ KVSM_PARAMETERS_END(c)
+
+ c->returnValue()->setBoolean(g_pModuleManager->loadModule(szModuleName.utf8().data()));
+ return true;
+}
+
+
+/*
@doc: system.hostname
@keyterms:
System information
@@ -622,6 +657,7 @@ static bool system_module_init(KviModule * m)
KVSM_REGISTER_FUNCTION(m,"dcop",system_kvs_fnc_dcop);
KVSM_REGISTER_FUNCTION(m,"clipboard",system_kvs_fnc_clipboard);
KVSM_REGISTER_FUNCTION(m,"selection",system_kvs_fnc_selection);
+ KVSM_REGISTER_FUNCTION(m,"checkModule",system_kvs_fnc_checkModule);
KVSM_REGISTER_SIMPLE_COMMAND(m,"setenv",system_kvs_cmd_setenv);
KVSM_REGISTER_SIMPLE_COMMAND(m,"setClipboard",system_kvs_cmd_setClipboard);
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_