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.
This commit is contained in:
Vlad Zahorodnii 2022-10-21 23:17:30 +03:00
parent 0e393b8fe0
commit a9833dc9dd

View file

@ -14,7 +14,6 @@
#include <KAboutData>
#define TRANSLATION_DOMAIN "kwin_scripting"
#include <KDesktopFile>
#include <KLocalizedString>
#include <KLocalizedTranslator>
#include <kconfigloader.h>
@ -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);