File indexing completed on 2024-04-28 16:54:47

0001 /*
0002     SPDX-FileCopyrightText: 2014 Bhushan Shah <bhush94@gmail.com>
0003     SPDX-FileCopyrightText: 2014 Marco Martin <notmart@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006 */
0007 
0008 #include "plasmawindowedcorona.h"
0009 #include "plasmawindowedview.h"
0010 #include <QAction>
0011 #include <QCommandLineParser>
0012 #include <QDebug>
0013 
0014 #include <KActionCollection>
0015 #include <KLocalizedString>
0016 
0017 #include <KPackage/Package>
0018 #include <KPackage/PackageLoader>
0019 #include <Plasma/PluginLoader>
0020 
0021 PlasmaWindowedCorona::PlasmaWindowedCorona(const QString &shell, QObject *parent)
0022     : Plasma::Corona(parent)
0023 {
0024     KPackage::Package package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Plasma/Shell"));
0025     package.setPath(shell);
0026     setKPackage(package);
0027     // QMetaObject::invokeMethod(this, "load", Qt::QueuedConnection);
0028     load();
0029 }
0030 
0031 void PlasmaWindowedCorona::loadApplet(const QString &applet, const QVariantList &arguments)
0032 {
0033     if (containments().isEmpty()) {
0034         return;
0035     }
0036 
0037     Plasma::Containment *cont = containments().first();
0038 
0039     // forbid more instances per applet (todo: activate the corresponding already loaded applet)
0040     for (Plasma::Applet *a : cont->applets()) {
0041         if (a->pluginMetaData().pluginId() == applet) {
0042             return;
0043         }
0044     }
0045     PlasmaWindowedView *v = new PlasmaWindowedView();
0046     v->setHasStatusNotifier(m_hasStatusNotifier);
0047     v->show();
0048 
0049     KConfigGroup appletsGroup(KSharedConfig::openConfig(), "Applets");
0050     QString plugin;
0051     for (const QString &group : appletsGroup.groupList()) {
0052         KConfigGroup cg(&appletsGroup, group);
0053         plugin = cg.readEntry("plugin", QString());
0054 
0055         if (plugin == applet) {
0056             Plasma::Applet *a = Plasma::PluginLoader::self()->loadApplet(applet, group.toInt(), arguments);
0057             if (!a) {
0058                 qWarning() << "Unable to load applet" << applet << "with arguments" << arguments;
0059                 v->deleteLater();
0060                 return;
0061             }
0062             a->restore(cg);
0063 
0064             // Access a->config() before adding to containment
0065             // will cause applets to be saved in palsmawindowedrc
0066             // so applets will only be created on demand
0067             KConfigGroup cg2 = a->config();
0068             cont->addApplet(a);
0069 
0070             v->setApplet(a);
0071             return;
0072         }
0073     }
0074 
0075     Plasma::Applet *a = Plasma::PluginLoader::self()->loadApplet(applet, 0, arguments);
0076     if (!a) {
0077         qWarning() << "Unable to load applet" << applet << "with arguments" << arguments;
0078         v->deleteLater();
0079         return;
0080     }
0081 
0082     // Access a->config() before adding to containment
0083     // will cause applets to be saved in palsmawindowedrc
0084     // so applets will only be created on demand
0085     KConfigGroup cg2 = a->config();
0086     cont->addApplet(a);
0087 
0088     v->setApplet(a);
0089 }
0090 
0091 void PlasmaWindowedCorona::activateRequested(const QStringList &arguments, const QString &workingDirectory)
0092 {
0093     Q_UNUSED(workingDirectory)
0094     if (arguments.count() <= 1) {
0095         return;
0096     }
0097 
0098     QCommandLineParser parser;
0099     parser.setApplicationDescription(i18n("Plasma Windowed"));
0100     parser.addOption(
0101         QCommandLineOption(QStringLiteral("statusnotifier"), i18n("Makes the plasmoid stay alive in the Notification Area, even when the window is closed.")));
0102     parser.addPositionalArgument(QStringLiteral("applet"), i18n("The applet to open."));
0103     parser.addPositionalArgument(QStringLiteral("args"), i18n("Arguments to pass to the plasmoid."), QStringLiteral("[args...]"));
0104     parser.addVersionOption();
0105     parser.addHelpOption();
0106     parser.process(arguments);
0107 
0108     if (parser.positionalArguments().isEmpty()) {
0109         parser.showHelp(1);
0110     }
0111 
0112     const QStringList positionalArguments = parser.positionalArguments();
0113 
0114     QVariantList args;
0115     QStringList::const_iterator constIterator = positionalArguments.constBegin() + 1;
0116     for (; constIterator != positionalArguments.constEnd(); ++constIterator) {
0117         args << (*constIterator);
0118     }
0119 
0120     loadApplet(positionalArguments.first(), args);
0121 }
0122 
0123 QRect PlasmaWindowedCorona::screenGeometry(int id) const
0124 {
0125     Q_UNUSED(id);
0126     // TODO?
0127     return QRect();
0128 }
0129 
0130 void PlasmaWindowedCorona::load()
0131 {
0132     /*this won't load applets, since applets are in plasmawindowedrc*/
0133     loadLayout(QStringLiteral("plasmawindowed-appletsrc"));
0134 
0135     bool found = false;
0136     for (auto c : containments()) {
0137         if (c->containmentType() == Plasma::Types::DesktopContainment) {
0138             found = true;
0139             break;
0140         }
0141     }
0142 
0143     if (!found) {
0144         qDebug() << "Loading default layout";
0145         createContainment(QStringLiteral("empty"));
0146         saveLayout(QStringLiteral("plasmawindowed-appletsrc"));
0147     }
0148 
0149     for (auto c : containments()) {
0150         if (c->containmentType() == Plasma::Types::DesktopContainment) {
0151             m_containment = c;
0152             m_containment->setFormFactor(Plasma::Types::Application);
0153             QAction *removeAction = c->actions()->action(QStringLiteral("remove"));
0154             if (removeAction) {
0155                 removeAction->deleteLater();
0156             }
0157             break;
0158         }
0159     }
0160 }
0161 
0162 void PlasmaWindowedCorona::setHasStatusNotifier(bool stay)
0163 {
0164     m_hasStatusNotifier = stay;
0165 }