From a9833dc9ddfd35ab6d146426e5b951df98ea622b Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Fri, 21 Oct 2022 23:17:30 +0300 Subject: [PATCH] scripting: Prefer metadata.json over metadata.desktop in GenericScriptedConfig KPluginMetaData in KF 6 doesn't load desktop files anymore. It means that plasma packages need to come with json metadata files. This change adjusts the generic scripted config loader so it can load configuration even for packages with no metadata.desktop files. --- src/scripting/genericscriptedconfig.cpp | 47 +++++++++++++++++-------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/src/scripting/genericscriptedconfig.cpp b/src/scripting/genericscriptedconfig.cpp index e2af3e74eb..dec9139b44 100644 --- a/src/scripting/genericscriptedconfig.cpp +++ b/src/scripting/genericscriptedconfig.cpp @@ -14,7 +14,6 @@ #include #define TRANSLATION_DOMAIN "kwin_scripting" -#include #include #include #include @@ -68,14 +67,40 @@ void GenericScriptedConfig::createUi() { QVBoxLayout *layout = new QVBoxLayout(this); - const QString kconfigXTFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, - QLatin1String(KWIN_NAME) + QLatin1Char('/') + typeName() + QLatin1Char('/') + m_packageName + QLatin1String("/contents/config/main.xml")); - const QString uiPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, - QLatin1String(KWIN_NAME) + QLatin1Char('/') + typeName() + QLatin1Char('/') + m_packageName + QLatin1String("/contents/ui/config.ui")); - if (kconfigXTFile.isEmpty() || uiPath.isEmpty()) { - layout->addWidget(new QLabel(i18nc("Error message", "Plugin does not provide configuration file in expected location"))); + const QString packageRoot = QStandardPaths::locate(QStandardPaths::GenericDataLocation, + QLatin1String(KWIN_NAME) + QLatin1Char('/') + typeName() + QLatin1Char('/') + m_packageName, + QStandardPaths::LocateDirectory); + if (packageRoot.isEmpty()) { + layout->addWidget(new QLabel(i18nc("Error message", "Could not locate package metadata"))); return; } + + KPluginMetaData metaData(packageRoot + QLatin1String("/metadata.json")); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + if (!metaData.isValid()) { + metaData = KPluginMetaData::fromDesktopFile(packageRoot + QLatin1String("/metadata.desktop")); + if (metaData.isValid()) { + qWarning("metadata.desktop format is obsolete. Please convert %s to JSON metadata", qPrintable(metaData.fileName())); + } + } +#endif + if (!metaData.isValid()) { + layout->addWidget(new QLabel(i18nc("Required file does not exist", "%1 does not contain a valid metadata.json file", qPrintable(packageRoot)))); + return; + } + + const QString kconfigXTFile = packageRoot + QLatin1String("/contents/config/main.xml"); + if (!QFileInfo::exists(kconfigXTFile)) { + layout->addWidget(new QLabel(i18nc("Required file does not exist", "%1 does not exist", qPrintable(kconfigXTFile)))); + return; + } + + const QString uiPath = packageRoot + QLatin1String("/contents/ui/config.ui"); + if (!QFileInfo::exists(uiPath)) { + layout->addWidget(new QLabel(i18nc("Required file does not exist", "%1 does not exist", qPrintable(uiPath)))); + return; + } + QFile xmlFile(kconfigXTFile); KConfigGroup cg = configGroup(); KConfigLoader *configLoader = new KConfigLoader(cg, &xmlFile, this); @@ -83,13 +108,7 @@ void GenericScriptedConfig::createUi() QUiLoader *loader = new QUiLoader(this); loader->setLanguageChangeEnabled(true); QFile uiFile(uiPath); - // try getting a translation domain - const QString metaDataPath = - QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral(KWIN_NAME "/%1/%2/metadata.desktop").arg(typeName(), m_packageName)); - if (!metaDataPath.isNull()) { - KDesktopFile metaData(metaDataPath); - m_translator->setTranslationDomain(metaData.desktopGroup().readEntry("X-KWin-Config-TranslationDomain", QString())); - } + m_translator->setTranslationDomain(metaData.value("X-KWin-Config-TranslationDomain")); uiFile.open(QFile::ReadOnly); QWidget *customConfigForm = loader->load(&uiFile, this);