File indexing completed on 2024-05-12 05:36:15

0001 // SPDX-FileCopyrightText: 2023 Devin Lin <devin@kde.org>
0002 // SPDX-License-Identifier: GPL-2.0-or-later
0003 
0004 #include "wizard.h"
0005 #include "settings.h"
0006 #include "utils.h"
0007 
0008 #include <KPackage/PackageLoader>
0009 
0010 #include <QFileInfo>
0011 #include <QQmlComponent>
0012 
0013 // TODO read distro provided config file
0014 const QList<QString> WIZARD_MODULE_ORDER = {QStringLiteral("org.kde.plasma.mobileinitialstart.prepare"),
0015                                             QStringLiteral("org.kde.plasma.mobileinitialstart.time"),
0016                                             QStringLiteral("org.kde.plasma.mobileinitialstart.wifi"),
0017                                             QStringLiteral("org.kde.plasma.mobileinitialstart.cellular"),
0018                                             QStringLiteral("org.kde.plasma.mobileinitialstart.finished")};
0019 
0020 Wizard::Wizard(QObject *parent, QQmlEngine *engine)
0021     : QObject{parent}
0022     , m_engine{engine}
0023 {
0024 }
0025 
0026 void Wizard::load()
0027 {
0028     if (!m_engine) {
0029         return;
0030     }
0031 
0032     qCDebug(LOGGING_CATEGORY) << "Loading initialstart packages...";
0033 
0034     // load initialstart packages
0035     const auto packages = KPackage::PackageLoader::self()->listPackages(QStringLiteral("KPackage/GenericQML"), QStringLiteral("plasma/mobileinitialstart"));
0036     for (auto &metaData : packages) {
0037         KPackage::Package package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("KPackage/GenericQML"), QFileInfo(metaData.fileName()).path());
0038         if (!package.isValid()) {
0039             qCWarning(LOGGING_CATEGORY) << "initialstart package invalid:" << metaData.fileName();
0040             continue;
0041         }
0042         m_modulePackages.push_back({new KPluginMetaData{metaData}, package});
0043     }
0044 
0045     // sort modules by order
0046     std::sort(m_modulePackages.begin(), m_modulePackages.end(), [](const auto &lhs, const auto &rhs) {
0047         return WIZARD_MODULE_ORDER.indexOf(lhs.first->pluginId()) < WIZARD_MODULE_ORDER.indexOf(rhs.first->pluginId());
0048     });
0049 
0050     QQmlComponent *c = new QQmlComponent(m_engine, this);
0051 
0052     // load initialstart QML items
0053     for (auto &pair : m_modulePackages) {
0054         // load QML from kpackage
0055         c->loadUrl(pair.second.fileUrl("mainscript"), QQmlComponent::PreferSynchronous);
0056 
0057         auto created = c->create(m_engine->rootContext());
0058         auto createdItem = qobject_cast<QQuickItem *>(created);
0059 
0060         // print errors if there were issues loading
0061         if (!createdItem) {
0062             qCWarning(LOGGING_CATEGORY) << "Unable to load initialstart module:" << created;
0063             for (auto error : c->errors()) {
0064                 qCWarning(LOGGING_CATEGORY) << error;
0065             }
0066             delete created;
0067             continue;
0068         }
0069 
0070         m_moduleItems.push_back(createdItem);
0071 
0072         qCDebug(LOGGING_CATEGORY) << "Loaded initialstart module" << pair.first->pluginId();
0073     }
0074 
0075     delete c;
0076 }
0077 
0078 void Wizard::setTestingMode(bool testingMode)
0079 {
0080     if (testingMode != m_testingMode) {
0081         m_testingMode = testingMode;
0082         Q_EMIT testingModeChanged();
0083     }
0084 }
0085 
0086 bool Wizard::testingMode()
0087 {
0088     return m_testingMode;
0089 }
0090 
0091 QList<QQuickItem *> Wizard::steps()
0092 {
0093     return m_moduleItems;
0094 }
0095 
0096 void Wizard::wizardFinished()
0097 {
0098     Settings::self()->setWizardFinished();
0099     QCoreApplication::quit();
0100 }