//============================================================================= // // File : libkvitheme.cpp // Creation date : Sat 30 Dec 2006 14:54:56 by Szymon Stefanek // // This file is part of the KVIrc IRC client distribution // Copyright (C) 2006-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 "ThemeManagementDialog.h" #include "ThemeFunctions.h" #include "KviKvsArrayCast.h" #include "KviMessageBox.h" #include "KviModule.h" #include "KviLocale.h" #include "KviCommandFormatter.h" #include "KviError.h" #include "kvi_out.h" #include "KviMainWindow.h" #include "KviIconManager.h" #include "KviConfigurationFile.h" #include "kvi_sourcesdate.h" #include "KviFileUtils.h" #include "KviFileDialog.h" #include "KviTheme.h" #include #include QRect g_rectManagementDialogGeometry(0, 0, 0, 0); /* @doc: theme.install @type: command @title: theme.install @short: Shows the theme management editor @syntax: theme.install @description: Attempts to install the themes in the package specified by . */ 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(!ThemeFunctions::installThemePackage(szThemePackFile, szError)) { c->error(__tr2qs_ctx("Error installing theme package: %Q", "theme"), &szError); return false; } return true; } /* @doc: theme.apply @type: command @title: theme.apply @short: Apply a theme. @syntax: theme.apply [-b] [-e] [-u] @switches: !sw: -e | --external is an absolute directory containing a theme !sw: -b | --builtin is the name of a builtin theme (a subdirectory of the KVIrc global themes directory) !sw: -u | --user is the name of a user theme (a subdirectory of the KVIrc local themes directory) @description: Attempts to apply the global theme specified by . If the -b switch is present then is assumed to be a name of a builtin installed theme (a subdirectory of the KVIrc global themes directory). If the -l switch is present then is assumed to be a name of a user installed theme (a subdirectory of the KVIrc local themes directory). If the -e switch is present then is assumed to be an absolute directory containing the theme data. If no switch is present then KVIrc tries to determine automatically the type of theme (user, builtin or external). */ static bool theme_kvs_cmd_apply(KviKvsModuleCommandCall * c) { QString szTheme; KVSM_PARAMETERS_BEGIN(c) KVSM_PARAMETER("theme", KVS_PT_STRING, 0, szTheme) KVSM_PARAMETERS_END(c) KviThemeInfo out; KviThemeInfo::Location eLocation = KviThemeInfo::Auto; if(c->switches()->find('b', "builtin")) eLocation = KviThemeInfo::Builtin; else if(c->switches()->find('e', "external")) eLocation = KviThemeInfo::External; else if(c->switches()->find('u', "user")) eLocation = KviThemeInfo::User; if(!KviTheme::apply(szTheme, eLocation, out)) { QString szErr = out.lastError(); c->error(__tr2qs_ctx("Failed to apply theme: %Q", "theme"), &szErr); return false; } return true; } /* @doc: theme.info @type: function @title: $theme.info @short: Return info about a user defined theme. @description: Returns a hash with information about the global theme specified by . */ static bool theme_kvs_fnc_info(KviKvsModuleFunctionCall * c) { QString szTheme; KVSM_PARAMETERS_BEGIN(c) KVSM_PARAMETER("theme", KVS_PT_STRING, 0, szTheme) KVSM_PARAMETERS_END(c) KviKvsHash * pHash = new KviKvsHash(); c->returnValue()->setHash(pHash); KviThemeInfo theme; if(!theme.load(szTheme, KviThemeInfo::Auto)) { c->warning(__tr2qs_ctx("The theme package '%Q' doesn't exist", "theme"), &szTheme); return true; } pHash->set("name", new KviKvsVariant(theme.name())); pHash->set("version", new KviKvsVariant(theme.version())); pHash->set("author", new KviKvsVariant(theme.author())); pHash->set("description", new KviKvsVariant(theme.description())); return true; } /* @doc: theme.screenshot @type: command @title: theme.screenshot @short: Makes a screenshot of the KVIrc window @syntax: theme.screenshot [file_name_path:string] @description: Makes a screenshot of the KVIrc main window and saves it in the specified file. If [file_name_path] is not specified then a save file dialog is shown. */ static bool theme_kvs_cmd_screenshot(KviKvsModuleCommandCall * c) { QString szFileName; KVSM_PARAMETERS_BEGIN(c) KVSM_PARAMETER("file_name_path", KVS_PT_STRING, KVS_PF_OPTIONAL, szFileName) KVSM_PARAMETERS_END(c) KviFileUtils::adjustFilePath(szFileName); QString szTmp; c->enterBlockingSection(); bool bResult = KviFileDialog::askForSaveFileName( szTmp, __tr2qs_ctx("Enter a Filename - KVIrc", "theme"), //dialog header title szFileName, "*.png", false, false, true, g_pMainWindow); if(!c->leaveBlockingSection()) return false; // need to stop immediately if(!bResult) return true; szFileName = szTmp; if(szFileName.isEmpty()) return true; // done KviFileUtils::adjustFilePath(szFileName); if(QFileInfo(szFileName).suffix() != "png") szFileName += ".png"; QString szError; if(!ThemeFunctions::makeKVIrcScreenshot(szFileName)) { c->error(__tr2qs_ctx("Error capturing and saving screenshot!", "theme")); return false; } return true; } /* @doc: theme.dialog @type: command @title: theme.dialog @short: Shows the theme theme management editor @syntax: theme.dialog [-t] @description: Shows the theme theme management editor[br] 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] */ static bool theme_kvs_cmd_dialog(KviKvsModuleCommandCall * c) { ThemeManagementDialog::display(c->hasSwitch('t', "toplevel")); return true; } /* @doc: theme.pack @type: command @title: theme.pack @short: Creates a kvt package containing a set of themes @syntax: theme.pack @description: Creates a *.kvt package containing a set of KVIrc themes.[br] is the absolute path and file name of the package that should be saved.[br] is the visible name of the package (something like "My Theme Set").[br] is the version of the package in the form X.Y.Z.[br] is a textual description of the package. is the name of the person that is creating the package (NOT necessarily the themes contained within). is the path of an image to be used as package representative image. If the package is going to contain a single theme you may specify the theme's screenshot here. Pass an empty string if you don't want an image to be stored in the package. is a either a single path to a directory containing a theme as it's exported by KVIrc, or an array of such paths. */ static bool theme_kvs_cmd_pack(KviKvsModuleCommandCall * c) { QString szPath, szName, szVersion, szDescription, szAuthor, szImage; KviKvsArrayCast aCast; KVSM_PARAMETERS_BEGIN(c) KVSM_PARAMETER("package_path", KVS_PT_NONEMPTYSTRING, 0, szPath) KVSM_PARAMETER("package_name", KVS_PT_NONEMPTYSTRING, 0, szName) KVSM_PARAMETER("package_version", KVS_PT_NONEMPTYSTRING, 0, szVersion) KVSM_PARAMETER("package_description", KVS_PT_STRING, 0, szDescription) KVSM_PARAMETER("package_author", KVS_PT_NONEMPTYSTRING, 0, szAuthor) KVSM_PARAMETER("package_image", KVS_PT_STRING, 0, szImage) KVSM_PARAMETER("theme", KVS_PT_ARRAYCAST, 0, aCast) KVSM_PARAMETERS_END(c) KviKvsArray * pArray = aCast.array(); if((!pArray) || (pArray->size() < 1)) { c->error(__tr2qs_ctx("No themes specified", "theme")); return false; } kvs_uint_t s = pArray->size(); QStringList lThemeList; for(kvs_uint_t i = 0; i < s; i++) { KviKvsVariant * v = pArray->at(i); if(!v) continue; // ? QString szVal; v->asString(szVal); if(szVal.isEmpty()) continue; lThemeList.append(szVal); } KviPointerList lThemeInfoList; lThemeInfoList.setAutoDelete(true); for(const auto & szTheme : lThemeList) { KviThemeInfo * pInfo = new KviThemeInfo(); if(!pInfo->load(szTheme, KviThemeInfo::External)) { QString szErr = pInfo->lastError(); c->error(__tr2qs_ctx("Failed to load theme from directory %Q: %Q", "theme"), &szTheme, &szErr); delete pInfo; return false; } lThemeInfoList.append(pInfo); } if(lThemeInfoList.isEmpty()) { c->error(__tr2qs_ctx("No themes specified: refusing to create an empty theme package", "theme")); return false; } QString szError; if( ThemeFunctions::packageThemes( szPath, szName, szVersion, szDescription, szAuthor, szImage, lThemeInfoList, szError)) return true; c->error(szError); return false; } static bool theme_module_init(KviModule * m) { KVSM_REGISTER_SIMPLE_COMMAND(m, "dialog", theme_kvs_cmd_dialog); KVSM_REGISTER_SIMPLE_COMMAND(m, "install", theme_kvs_cmd_install); KVSM_REGISTER_SIMPLE_COMMAND(m, "apply", theme_kvs_cmd_apply); KVSM_REGISTER_SIMPLE_COMMAND(m, "screenshot", theme_kvs_cmd_screenshot); KVSM_REGISTER_SIMPLE_COMMAND(m, "pack", theme_kvs_cmd_pack); KVSM_REGISTER_FUNCTION(m, "info", theme_kvs_fnc_info); QString szBuf; m->getDefaultConfigFileName(szBuf); KviConfigurationFile cfg(szBuf, KviConfigurationFile::Read); g_rectManagementDialogGeometry = cfg.readRectEntry("EditorGeometry", QRect(10, 10, 390, 440)); return true; } static bool theme_module_cleanup(KviModule * m) { ThemeManagementDialog::cleanup(); QString szBuf; m->getDefaultConfigFileName(szBuf); KviConfigurationFile cfg(szBuf, KviConfigurationFile::Write); cfg.writeEntry("EditorGeometry", g_rectManagementDialogGeometry); return true; } static bool theme_module_can_unload(KviModule *) { return (!ThemeManagementDialog::instance()); } KVIRC_MODULE( "Theme", // module name "4.0.0", // module version "Copyright (C) 2006 Szymon Stefanek (pragma at kvirc dot net)", // author & (C) "Theme management functions", theme_module_init, theme_module_can_unload, 0, theme_module_cleanup, "theme")