diff --git a/plasmoidviewer/main.cpp b/plasmoidviewer/main.cpp --- a/plasmoidviewer/main.cpp +++ b/plasmoidviewer/main.cpp @@ -27,19 +27,101 @@ #include #include +#include #include #include #include #include #include #include +#include #include #include #include "view.h" #include +#include + +#include + +void listApplets() +{ + int maxLen = 0; + QMap applets; + + const QList plugins = Plasma::PluginLoader::self()->listAppletMetaData(QString()); + for (const auto& info : plugins) { + if (!info.isValid() || + (info.rawData().value(QStringLiteral("NoDisplay")).toBool() == true)) { + continue; + } + + const QString name = info.pluginId(); + const int len = name.length(); + if (len > maxLen) { + maxLen = len; + } + + QString comment = info.description(); + + if (comment.isEmpty()) { + comment = i18n("No description available"); + } + + applets.insert(name, comment); + } + + for (auto it = applets.constBegin(); it != applets.constEnd(); ++it) { + std::cout << it.key().leftJustified(maxLen, ' ').toLocal8Bit().data() << " - " + << it.value().toLocal8Bit().data() << std::endl; + } +} + +void listThemes() +{ + int maxLen = 0; + QMap themes; + + const QStringList basePaths = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "plasma/desktoptheme", QStandardPaths::LocateDirectory); + for (const QString& basePath : basePaths) { + const QStringList dirNames = QDir(basePath).entryList(QDir::Dirs | QDir::Hidden); + for (const QString& packageName : dirNames) { + if (packageName == QLatin1String(".") || packageName == QLatin1String("..")) { + continue; + } + const QString packagePath = basePath + QLatin1Char('/') + packageName; + const QString metadataFile = packagePath + QLatin1String("/metadata.desktop"); + if (!QFile::exists(metadataFile)) { + continue; + } + + KDesktopFile df(metadataFile); + + if (df.noDisplay()) { + continue; + } + + QString name = df.readName(); + if (name.isEmpty()) { + name = packageName; + } + + const int len = packageName.length(); + if (len > maxLen) { + maxLen = len; + } + themes.insert(packageName, name); + } + } + + for (auto it = themes.constBegin(); it != themes.constEnd(); ++it) { + std::cout << it.key().leftJustified(maxLen, ' ').toLocal8Bit().data() << " - " + << it.value().toLocal8Bit().data() << std::endl; + } +} + int main(int argc, char **argv) { @@ -86,12 +168,27 @@ i18n("The name of the theme which the shell will use"), QStringLiteral("themeName"))); + parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("list"), + i18n("Displays a list of known applets"))); + parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("list-themes"), + i18n("Displays a list of known themes"))); + parser.addPositionalArgument(QStringLiteral("externalData"), i18n("Data that should be passed to the applet as 'externalData' event")); parser.addHelpOption(); parser.addVersionOption(); parser.process(app); + if (parser.isSet("list")) { + listApplets(); + return 0; + } + + if (parser.isSet("list-themes")) { + listThemes(); + return 0; + } + KDBusService service(KDBusService::Multiple); KQuickAddons::QtQuickSettings::init();