Use KPlugin to load Calendar plugins

Using KPlugin allows for the plugin metadata to be localized. Contains
also fallback code to be able to load the pre-KPlugin plugins so that
the plugins are not broken until next Plasma/KDE Applications release.

Differential Revision: https://phabricator.kde.org/D3811
This commit is contained in:
Daniel Vrátil 2017-01-12 14:49:53 +01:00
parent 66ebf2c84f
commit 3aec1bf2d3
3 changed files with 45 additions and 10 deletions

View File

@ -20,6 +20,7 @@ target_link_libraries(calendarplugin
Qt5::Gui Qt5::Gui
KF5::I18n KF5::I18n
KF5::CalendarEvents KF5::CalendarEvents
KF5::CoreAddons
) )
install(TARGETS calendarplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/calendar) install(TARGETS calendarplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/calendar)

View File

@ -28,6 +28,9 @@
#include <QDir> #include <QDir>
#include <QDebug> #include <QDebug>
#include <KPluginLoader>
#include <KPluginMetaData>
class EventPluginsModel : public QAbstractListModel class EventPluginsModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
@ -68,20 +71,23 @@ public:
return QVariant(); return QVariant();
} }
const QString currentPlugin = m_manager->m_availablePlugins.keys().at(index.row()); const auto it = m_manager->m_availablePlugins.cbegin() + index.row();
const QJsonObject metadata = m_manager->m_availablePlugins.value(currentPlugin).value(QStringLiteral("MetaData")).toObject(); const QString currentPlugin = it.key();
const EventPluginsManager::PluginData metadata = it.value();
switch (role) { switch (role) {
case Qt::DisplayRole: case Qt::DisplayRole:
return metadata.value(QStringLiteral("Name")); return metadata.name;
case Qt::ToolTipRole:
return metadata.desc;
case Qt::DecorationRole: case Qt::DecorationRole:
return metadata.value(QStringLiteral("Icon")); return metadata.icon;
case Qt::UserRole: case Qt::UserRole:
{ {
// The currentPlugin path contains the full path including // The currentPlugin path contains the full path including
// the plugin filename, so it needs to be cut off from the last '/' // the plugin filename, so it needs to be cut off from the last '/'
const QStringRef pathRef = currentPlugin.leftRef(currentPlugin.lastIndexOf('/')); const QStringRef pathRef = currentPlugin.leftRef(currentPlugin.lastIndexOf('/'));
const QString qmlFilePath = metadata.value(QStringLiteral("ConfigUi")).toString(); const QString qmlFilePath = metadata.configUi;
return QString(pathRef % '/' % qmlFilePath); return QString(pathRef % '/' % qmlFilePath);
} }
case Qt::EditRole: case Qt::EditRole:
@ -127,9 +133,21 @@ private:
EventPluginsManager::EventPluginsManager(QObject *parent) EventPluginsManager::EventPluginsManager(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
// First of all get a list of available plugins auto plugins = KPluginLoader::findPlugins(
// and get their metadata. This alone is enough QStringLiteral("plasmacalendarplugins"),
// for the applet config to work [](const KPluginMetaData &md) {
return md.serviceTypes().contains(QLatin1String("PlasmaCalendar/Plugin"));
});
Q_FOREACH (const KPluginMetaData &plugin, plugins) {
m_availablePlugins.insert(plugin.fileName(),
{ plugin.name(),
plugin.description(),
plugin.iconName(),
plugin.value(QStringLiteral("X-KDE-PlasmaCalendar-ConfigUi"))
});
}
// Fallback for legacy pre-KPlugin plugins so we can still load them
const QStringList paths = QCoreApplication::libraryPaths(); const QStringList paths = QCoreApplication::libraryPaths();
Q_FOREACH (const QString &libraryPath, paths) { Q_FOREACH (const QString &libraryPath, paths) {
const QString path(libraryPath + QStringLiteral("/plasmacalendarplugins")); const QString path(libraryPath + QStringLiteral("/plasmacalendarplugins"));
@ -143,10 +161,20 @@ EventPluginsManager::EventPluginsManager(QObject *parent)
Q_FOREACH (const QString &fileName, entryList) { Q_FOREACH (const QString &fileName, entryList) {
const QString absolutePath = dir.absoluteFilePath(fileName); const QString absolutePath = dir.absoluteFilePath(fileName);
if (m_availablePlugins.contains(absolutePath)) {
continue;
}
QPluginLoader loader(absolutePath); QPluginLoader loader(absolutePath);
// Load only our own plugins // Load only our own plugins
if (loader.metaData().value(QStringLiteral("IID")) == QLatin1String("org.kde.CalendarEventsPlugin")) { if (loader.metaData().value(QStringLiteral("IID")) == QLatin1String("org.kde.CalendarEventsPlugin")) {
m_availablePlugins.insert(absolutePath, loader.metaData()); const auto md = loader.metaData().value(QStringLiteral("MetaData")).toObject();
m_availablePlugins.insert(absolutePath,
{ md.value(QStringLiteral("Name")).toString(),
md.value(QStringLiteral("Description")).toString(),
md.value(QStringLiteral("Icon")).toString(),
md.value(QStringLiteral("ConfigUi")).toString()
});
} }
} }
} }

View File

@ -69,7 +69,13 @@ private:
friend class EventPluginsModel; friend class EventPluginsModel;
EventPluginsModel *m_model; EventPluginsModel *m_model;
QList<CalendarEvents::CalendarEventsPlugin*> m_plugins; QList<CalendarEvents::CalendarEventsPlugin*> m_plugins;
QMap<QString, QJsonObject> m_availablePlugins; struct PluginData {
QString name;
QString desc;
QString icon;
QString configUi;
};
QMap<QString, PluginData> m_availablePlugins;
QStringList m_enabledPlugins; QStringList m_enabledPlugins;
}; };