File indexing completed on 2024-05-05 05:28:25

0001 /*
0002 
0003     SPDX-FileCopyrightText: 2011-2015 Sebastian Kügler <sebas@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 // std
0009 #include <iomanip>
0010 #include <iostream>
0011 
0012 // own
0013 #include "module.h"
0014 #include "modulesproxymodel.h"
0015 #include "settingsapp.h"
0016 #include "version.h"
0017 
0018 // Qt
0019 #include <QApplication>
0020 #include <QCommandLineOption>
0021 #include <QCommandLineParser>
0022 #include <QDebug>
0023 #include <QIcon>
0024 #include <QQmlApplicationEngine>
0025 #include <QQmlContext>
0026 
0027 // Frameworks
0028 #include <KAboutData>
0029 #include <KLocalizedContext>
0030 #include <KLocalizedString>
0031 #include <KPluginMetaData>
0032 
0033 int main(int argc, char **argv)
0034 {
0035     QApplication app(argc, argv);
0036 
0037     KLocalizedString::setApplicationDomain("mobile.plasma-settings");
0038 
0039     // About data
0040     KAboutData aboutData("org.kde.mobile.plasmasettings",
0041                          i18n("Settings"),
0042                          QStringLiteral(PLASMA_SETTINGS_VERSION_STRING),
0043                          i18n("Touch-friendly settings application."),
0044                          KAboutLicense::GPL,
0045                          i18n("Copyright 2011-2015, Sebastian Kügler"));
0046     aboutData.addAuthor(i18n("Sebastian Kügler"), i18n("Maintainer"), "sebas@kde.org");
0047     aboutData.addAuthor(i18n("Marco Martin"), i18n("Maintainer"), "mart@kde.org");
0048     aboutData.setDesktopFileName("org.kde.mobile.plasmasettings");
0049     KAboutData::setApplicationData(aboutData);
0050 
0051     QApplication::setWindowIcon(QIcon::fromTheme("preferences-system"));
0052 
0053     QCommandLineParser parser;
0054 
0055     const QCommandLineOption listOption({QStringLiteral("l"), QStringLiteral("list")}, i18n("List available settings modules"));
0056     const QCommandLineOption formfactorOption(
0057         {QStringLiteral("x"), QStringLiteral("formfactor")},
0058         i18n("Limit to modules suitable for <formfactor>, e.g. handset, tablet, mediacenter, desktop, test, all (default handset)"),
0059         i18n("formfactor"));
0060     const QCommandLineOption moduleOption({QStringLiteral("m"), QStringLiteral("module")}, i18n("Settings module to open"), i18n("modulename"));
0061     const QCommandLineOption singleModuleOption({QStringLiteral("s"), QStringLiteral("singleModule")}, i18n("Only show a single module, requires --module"));
0062     const QCommandLineOption fullscreenOption({QStringLiteral("f"), QStringLiteral("fullscreen")}, i18n("Start window fullscreen"));
0063     const QCommandLineOption layoutOption(QStringLiteral("layout"), i18n("Package to use for the UI (default org.kde.mobile.settings)"), i18n("packagename"));
0064 
0065     parser.addOption(listOption);
0066     parser.addOption(formfactorOption);
0067     parser.addOption(moduleOption);
0068     parser.addOption(singleModuleOption);
0069     parser.addOption(fullscreenOption);
0070     parser.addOption(layoutOption);
0071     aboutData.setupCommandLine(&parser);
0072 
0073     parser.process(app);
0074     aboutData.processCommandLine(&parser);
0075 
0076     if (parser.isSet(listOption)) {
0077         int nameWidth = 24;
0078         QSet<QString> seen;
0079         std::cout << std::setfill('.');
0080 
0081         auto formfactor = parser.value(formfactorOption);
0082 
0083         const auto plugins = KPluginMetaData::findPlugins("kcms")
0084             << KPluginMetaData::findPlugins("plasma/kcms") << KPluginMetaData::findPlugins("plasma/kcms/systemsettings");
0085         for (const auto &plugin : plugins) {
0086             if (seen.contains(plugin.pluginId())) {
0087                 continue;
0088             }
0089             // Filter out modules that are not explicitly suitable for the "handset" formfactor
0090             // const QStringList &formFactors = plugin.formFactors();
0091             if (!formfactor.isEmpty() && !plugin.formFactors().contains(formfactor) && formfactor != QStringLiteral("all")) {
0092                 continue;
0093             }
0094             const int len = plugin.pluginId().length();
0095             if (len > nameWidth) {
0096                 nameWidth = len;
0097             }
0098 
0099             seen << plugin.pluginId();
0100             std::cout << plugin.pluginId().toLocal8Bit().data() << ' ' << std::setw(nameWidth - plugin.pluginId().length() + 2) << '.' << ' '
0101                       << plugin.description().toLocal8Bit().data() << std::endl;
0102 
0103             // qDebug() << "Formafactors: " << formFactors;
0104         }
0105 
0106         const auto kcmPlugin = KPluginMetaData::findPlugins("kcms")
0107             << KPluginMetaData::findPlugins("plasma/kcms") << KPluginMetaData::findPlugins("plasma/kcms/systemsettings");
0108         for (const auto &plugin : kcmPlugin) {
0109             if (seen.contains(plugin.pluginId())) {
0110                 continue;
0111             }
0112             if (!formfactor.isEmpty() && !plugin.formFactors().contains(formfactor) && formfactor != QStringLiteral("all")) {
0113                 continue;
0114             }
0115             const int len = plugin.pluginId().length();
0116             if (len > nameWidth) {
0117                 nameWidth = len;
0118             }
0119             std::cout << plugin.pluginId().toLocal8Bit().data() << ' ' << std::setw(nameWidth - plugin.pluginId().length() + 2) << '.' << ' '
0120                       << plugin.description().toLocal8Bit().data() << std::endl;
0121         }
0122 
0123         return 0;
0124     }
0125 
0126     const QString module = parser.value(moduleOption);
0127     const bool singleModule = parser.isSet(singleModuleOption);
0128 
0129     if (singleModule && module.isEmpty()) {
0130         parser.showHelp();
0131         return 0;
0132     }
0133 
0134     auto *settingsApp = new SettingsApp(parser);
0135     settingsApp->setStartModule(module);
0136     settingsApp->setSingleModule(singleModule);
0137 
0138     qmlRegisterType<ModulesProxyModel>("org.kde.plasma.settings", 0, 1, "ModulesProxyModel");
0139     qmlRegisterType<Module>("org.kde.plasma.settings", 0, 1, "Module");
0140     qmlRegisterSingletonInstance<SettingsApp>("org.kde.plasma.settings", 0, 1, "SettingsApp", settingsApp);
0141 
0142     QQmlApplicationEngine engine;
0143     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0144     engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
0145 
0146     return app.exec();
0147 }