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 }