//============================================================================= // // 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) 2000-2010 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 option) 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 "OptionsWidgetContainer.h" #include "OptionsInstanceManager.h" #include "OptionsDialog.h" #include "KviModule.h" #include "KviOptions.h" #include "KviApplication.h" #include "KviMainWindow.h" #include "KviWindow.h" #include "KviLocale.h" #include "KviControlCodes.h" #include "kvi_out.h" #include "KviPointerHashTable.h" #include KviPointerHashTable * g_pOptionsDialogDict = nullptr; OptionsInstanceManager * g_pOptionsInstanceManager = nullptr; extern int g_iOptionWidgetInstances; /* @doc: options.save @type: command @title: options.save @short: Saves the configuration to disk @syntax: options.save @description: Saves the options to disk; this includes aliases, popups, events and all user preferences. You shouldn't need to call this as KVIrc [i]should[/i] save the relevant part of configuration when it's changed. However you might want it in a debugging session or when testing an unstable version where crashes are possible. */ static bool options_kvs_cmd_save(KviKvsModuleCommandCall *) { //g_pApp->saveOptions(); g_pApp->saveConfiguration(); return true; } /* @doc: options.dialog @type: command @title: options.dialog @short: Shows the preferences dialog @syntax: options.dialog [-t] [options_group] @description: Shows the KVIrc preferences dialog and 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][br] Valid values for [options_group] are [b]general[/b] and [b]theme[/b]. If [options_group] is omitted, the option group [i]general[/i] 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"; if(szGroup != "general" && szGroup != "theme") { c->warning(__tr2qs_ctx("No such options_group %Q", "options"), &szGroup); return true; } OptionsDialog * d = g_pOptionsDialogDict->find(szGroup); if(d) { if(c->hasSwitch('t', "toplevel")) { if(d->parent()) { d->setParent(nullptr); d->setGeometry(0, 0, d->width(), d->height()); } } else { if(d->parent() != g_pMainWindow->splitter()) { d->setParent(g_pMainWindow->splitter()); d->setGeometry(0, 0, d->width(), d->height()); d->show(); } } } else { if(c->hasSwitch('t', "toplevel")) { d = new OptionsDialog(g_pMainWindow, szGroup, true); } else { d = new OptionsDialog(g_pMainWindow->splitter(), szGroup, false); } 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, OptionsWidgetInstanceEntry * e, const char * prefix) { c->window()->output(KVI_OUT_SYSTEMMESSAGE, "%s%c%s%c (%Q)", prefix, KviControlCodes::Bold, e->szClassName, KviControlCodes::Bold, &(e->szName)); KviCString szPre = prefix; szPre.append(" "); if(e->pChildList) { for(OptionsWidgetInstanceEntry * 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 * l = g_pOptionsInstanceManager->instanceEntryTree(); for(OptionsWidgetInstanceEntry * e = l->first(); e; e = l->next()) { options_kvs_module_print_pages(c, e, ""); } return true; } /* @doc: options.edit @type: command @title: options.edit [-n] @short: Shows a single options page @syntax: options.edit @description: Shows an options page as toplevel dialog. The available option pages can be listed by using [cmd]options.pages[/cmd]. If the -n switch is used then dialog will appear as [b]non[/b] modal (will not block input). @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) OptionsWidgetInstanceEntry * e = g_pOptionsInstanceManager->findInstanceEntry(szOption.toUtf8().data()); if(!e) { c->warning(__tr2qs_ctx("No such options page class name %Q", "options"), &szOption); return true; } if(e->pWidget) { e->pWidget->raise(); e->pWidget->activateWindow(); e->pWidget->setFocus(); return true; } OptionsWidgetContainer * wc = new OptionsWidgetContainer( g_pMainWindow, !c->hasSwitch('n', "non-modal")); wc->setup(g_pOptionsInstanceManager->getInstance(e, wc)); //wc->setModal(true); wc->show(); wc->raise(); return true; } /* @doc: options.isdialog @type: function @title: $options.isdialog @short: Returns the options dialog state @syntax: $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 [i]general[/i] is assumed. At the moment of writing the valid [options_group] values are [b]general[/b] and [b]theme[/b]. This command is exported by the [i]options[/i] 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; } /* @doc: options.close @type: command @title: options.close @short: Close an options dialog @syntax: options.close [options_group_or_page_class_name] @description: Closes the KVIrc options dialog for the specified options group or containing the specified options page. If [options_group] is omitted, the option group [i]general[/i] is assumed. This command is exported by the [i]options[/i] module. @seealso: [fnc]$options.isDialog[/fnc] */ static bool options_kvs_cmd_close(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"; OptionsDialog * d = g_pOptionsDialogDict->find(szGroup); if(d) { d->close(); return true; } OptionsWidgetInstanceEntry * e = g_pOptionsInstanceManager->findInstanceEntry(szGroup.toUtf8().data()); if(!e) return true; if(!e->pWidget) return true; // not open QWidget * w = e->pWidget->topLevelWidget(); if(!w) return true; // hm? w->deleteLater(); return true; } static bool options_module_init(KviModule * m) { g_pOptionsInstanceManager = new OptionsInstanceManager(); KVSM_REGISTER_SIMPLE_COMMAND(m, "dialog", options_kvs_cmd_dialog); KVSM_REGISTER_SIMPLE_COMMAND(m, "close", options_kvs_cmd_close); 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; g_pOptionsDialogDict->setAutoDelete(false); return true; } static bool options_module_cleanup(KviModule * m) { KviPointerHashTableIterator it(*g_pOptionsDialogDict); KviPointerList l; l.setAutoDelete(false); OptionsDialog * d; while((d = it.current())) { l.append(d); ++it; } for(d = l.first(); d; d = l.next()) delete d; delete g_pOptionsDialogDict; g_pOptionsDialogDict = nullptr; g_pOptionsInstanceManager->cleanup(m); delete g_pOptionsInstanceManager; g_pOptionsInstanceManager = nullptr; return true; } static bool options_module_can_unload(KviModule *) { return ((g_pOptionsDialogDict->isEmpty()) && (g_iOptionWidgetInstances == 0)); } KVIRC_MODULE( "Options", // module name "4.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, "options")