summaryrefslogtreecommitdiffstats
path: root/src/modules/options/libkvioptions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/options/libkvioptions.cpp')
-rw-r--r--src/modules/options/libkvioptions.cpp324
1 files changed, 324 insertions, 0 deletions
diff --git a/src/modules/options/libkvioptions.cpp b/src/modules/options/libkvioptions.cpp
new file mode 100644
index 00000000..175b61ff
--- /dev/null
+++ b/src/modules/options/libkvioptions.cpp
@@ -0,0 +1,324 @@
+//============================================================================================
+//
+// File : libkvioptions.cpp
+// Creation date : Fri Aug 18 2000 15:04:09 by Szymon Stefanek
+//
+// This file is part of the KVirc irc client distribution
+// Copyright (C) 1999-2006 Szymon Stefanek (pragma at kvirc dot net)
+//
+// This program is FREE software. You can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your opinion) any later version.
+//
+// This program is distributed in the HOPE that it will be USEFUL,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, write to the Free Software Foundation,
+// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+//============================================================================================
+
+#include "kvi_module.h"
+#include "kvi_options.h"
+#include "kvi_app.h"
+#include "kvi_frame.h"
+#include "kvi_window.h"
+#include "kvi_locale.h"
+#include "kvi_mirccntrl.h"
+#include "kvi_out.h"
+#include "kvi_splash.h"
+
+#include "container.h"
+#include "instances.h"
+
+#include "dialog.h"
+
+#include <qsplitter.h>
+#include "kvi_pointerhashtable.h"
+
+
+KviPointerHashTable<QString,KviOptionsDialog> * g_pOptionsDialogDict = 0;
+
+KviOptionsInstanceManager * g_pOptionsInstanceManager = 0;
+
+extern int g_iOptionWidgetInstances;
+
+/*
+ @doc: options.save
+ @type:
+ command
+ @title:
+ options.save
+ @short:
+ Saves the options to disk
+ @syntax:
+ options.save
+ @description:
+ Saves the options to disk; this includes aliases , popups ,
+ events and user preferences.
+*/
+
+static bool options_kvs_cmd_save(KviKvsModuleCommandCall * c)
+{
+ g_pApp->saveOptions();
+ return true;
+}
+
+
+/*
+ @doc: options.dialog
+ @type:
+ command
+ @title:
+ options.dialog
+ @short:
+ Shows the "options dialog"
+ @syntax:
+ options.dialog [-t] [options_group]
+ @description:
+ Shows the KVIrc options dialog for the specified options group.
+ If the [-t] switch is used , the dialog is opened as toplevel window,
+ otherwise it is opened as part of the current frame window.[br]
+ Valid values for [options_group] are "general" and "theme".
+ If [options_group] is omitted, the option group "general" is assumed.
+ This command is exported by the "options" module.
+ @seealso:
+ [fnc]$options.isDialog[/fnc]
+*/
+
+
+static bool options_kvs_cmd_dialog(KviKvsModuleCommandCall * c)
+{
+ QString szGroup;
+ KVSM_PARAMETERS_BEGIN(c)
+ KVSM_PARAMETER("options_group",KVS_PT_STRING,KVS_PF_OPTIONAL,szGroup)
+ KVSM_PARAMETERS_END(c)
+ if(szGroup.isEmpty())szGroup = "general";
+ KviOptionsDialog * d = g_pOptionsDialogDict->find(szGroup);
+ if(d)
+ {
+ if(c->hasSwitch('t',"toplevel"))
+ {
+ if(d->parent())
+ {
+ d->reparent(0,QPoint(0,0),true);
+ }
+ } else {
+ if(d->parent() != c->window()->frame()->splitter())
+ {
+ d->reparent(c->window()->frame()->splitter(),QPoint(0,0),true);
+ }
+ }
+ } else {
+ if(c->hasSwitch('t',"toplevel"))
+ {
+ d = new KviOptionsDialog(0,szGroup);
+ } else {
+ d = new KviOptionsDialog(c->window()->frame()->splitter(),szGroup);
+ }
+ g_pOptionsDialogDict->insert(szGroup,d);
+ }
+ d->raise();
+ d->show();
+ d->setFocus();
+ return true;
+}
+
+/*
+ @doc: options.pages
+ @type:
+ command
+ @title:
+ options.pages
+ @short:
+ Lists the option pages
+ @syntax:
+ options.pages
+ @description:
+ Lists the option pages available for editing by the means of [cmd]options.edit[/cmd].
+ @seealso:
+*/
+
+
+static void options_kvs_module_print_pages(KviKvsModuleCommandCall * c,KviOptionsWidgetInstanceEntry * e,const char * prefix)
+{
+ c->window()->output(KVI_OUT_SYSTEMMESSAGE,"%s%c%s%c (%Q)",prefix,KVI_TEXT_BOLD,e->szClassName,KVI_TEXT_BOLD,&(e->szName));
+ KviStr szPre = prefix;
+ szPre.append(" ");
+ if(e->pChildList)
+ {
+ for(KviOptionsWidgetInstanceEntry * ex = e->pChildList->first();ex;ex = e->pChildList->next())
+ {
+ options_kvs_module_print_pages(c,ex,szPre.ptr());
+ }
+ }
+}
+static bool options_kvs_cmd_pages(KviKvsModuleCommandCall * c)
+{
+ KviPointerList<KviOptionsWidgetInstanceEntry> * l = g_pOptionsInstanceManager->instanceEntryTree();
+
+ for(KviOptionsWidgetInstanceEntry * e = l->first();e;e = l->next())
+ {
+ options_kvs_module_print_pages(c,e,"");
+ }
+
+ return true;
+}
+
+/*
+ @doc: options.edit
+ @type:
+ command
+ @title:
+ options.edit [-m]
+ @short:
+ Shows a single options page
+ @syntax:
+ options.edit <"options page class name">
+ @description:
+ Shows an options page as toplevel dialog.
+ The available option pages can be listed by using [cmd]options.pages[/cmd].
+ If the -m switch is used, the dialog will appear as modal, blocking input
+ to the main frame until it's closed.
+ @seealso:
+*/
+
+static bool options_kvs_cmd_edit(KviKvsModuleCommandCall * c)
+{
+ QString szOption;
+ KVSM_PARAMETERS_BEGIN(c)
+ KVSM_PARAMETER("option",KVS_PT_STRING,0,szOption)
+ KVSM_PARAMETERS_END(c)
+ KviOptionsWidgetInstanceEntry * e = g_pOptionsInstanceManager->findInstanceEntry(szOption);
+ if(!e)
+ {
+ c->warning(__tr2qs_ctx("No such options page class name %Q","options"),&szOption);
+ return true;
+ }
+
+ if(e->pWidget)
+ {
+ //c->warning(__tr("The editor page is already open","options"));
+ e->pWidget->raise();
+ e->pWidget->setActiveWindow();
+ e->pWidget->setFocus();
+ return true;
+ }
+
+ QWidget * w;
+
+ if(c->hasSwitch('m',"modal"))
+ {
+ w = g_pApp->activeModalWidget();
+ if(!w)w = g_pFrame;
+ } else {
+ w = g_pFrame;
+ }
+
+ KviOptionsWidgetContainer * wc = new KviOptionsWidgetContainer(w,c->hasSwitch('m',"modal"));
+
+ wc->setup(g_pOptionsInstanceManager->getInstance(e,wc));
+
+ // a trick for the dialog covering the splash screen before the time (this is prolly a WM or Qt bug)
+ if(g_pSplashScreen)
+ {
+ if(g_pSplashScreen->isVisible()) // another bug: this ALWAYS RETURNS TRUE, even if the splash was hidden by a mouse click...
+ {
+ QObject::connect(g_pSplashScreen,SIGNAL(destroyed()),wc,SLOT(show()));
+ return true;
+ }
+ }
+
+ wc->show();
+ wc->raise();
+ return true;
+}
+
+/*
+ @doc: options.isdialog
+ @type:
+ function
+ @title:
+ $options.isdialog
+ @short:
+ Returns the options dialog state
+ @syntax:
+ <boolean> $options.isdialog([options_group:string])
+ @description:
+ Returns '1' if the options dialog for the specified options_group is open, '0' otherwise.[br]
+ If [options_group] is omitted then the group "general" is assumed.
+ At the moment of writing the valid [options_group] values are "general" and "theme".
+ This command is exported by the "options" module.
+ @seealso:
+ [cmd]options.dialog[/cmd]
+*/
+
+static bool options_kvs_fnc_isdialog(KviKvsModuleFunctionCall * c)
+{
+ QString szGroup;
+ KVSM_PARAMETERS_BEGIN(c)
+ KVSM_PARAMETER("options_group",KVS_PT_STRING,KVS_PF_OPTIONAL,szGroup)
+ KVSM_PARAMETERS_END(c)
+ if(szGroup.isEmpty())szGroup = "general";
+ c->returnValue()->setBoolean(g_pOptionsDialogDict->find(szGroup));
+ return true;
+}
+
+
+static bool options_module_init(KviModule * m)
+{
+ g_pOptionsInstanceManager = new KviOptionsInstanceManager();
+
+ KVSM_REGISTER_SIMPLE_COMMAND(m,"dialog",options_kvs_cmd_dialog);
+ KVSM_REGISTER_SIMPLE_COMMAND(m,"save",options_kvs_cmd_save);
+ KVSM_REGISTER_SIMPLE_COMMAND(m,"pages",options_kvs_cmd_pages);
+ KVSM_REGISTER_SIMPLE_COMMAND(m,"edit",options_kvs_cmd_edit);
+ KVSM_REGISTER_FUNCTION(m,"isDialog",options_kvs_fnc_isdialog);
+
+ g_pOptionsDialogDict = new KviPointerHashTable<QString,KviOptionsDialog>;
+ g_pOptionsDialogDict->setAutoDelete(false);
+
+ return true;
+}
+
+static bool options_module_cleanup(KviModule *m)
+{
+ KviPointerHashTableIterator<QString,KviOptionsDialog> it(*g_pOptionsDialogDict);
+ KviPointerList<KviOptionsDialog> l;
+ l.setAutoDelete(false);
+ KviOptionsDialog * d;
+ while(d = it.current())
+ {
+ l.append(d);
+ ++it;
+ }
+ for(d = l.first();d;d = l.next())delete d;
+ delete g_pOptionsDialogDict;
+ g_pOptionsDialogDict = 0;
+
+ g_pOptionsInstanceManager->cleanup(m);
+ delete g_pOptionsInstanceManager;
+ g_pOptionsInstanceManager = 0;
+
+ return true;
+}
+
+static bool options_module_can_unload(KviModule *m)
+{
+ return ((g_pOptionsDialogDict->isEmpty()) && (g_iOptionWidgetInstances == 0));
+}
+
+KVIRC_MODULE(
+ "Options", // module name
+ "1.0.0", // module version
+ "Copyright (C) 2000 Szymon Stefanek (pragma at kvirc dot net)", // author & (C)
+ "Options Dialog",
+ options_module_init,
+ options_module_can_unload,
+ 0,
+ options_module_cleanup
+)