2023-04-01 07:09:57 +00:00
|
|
|
// SPDX-FileCopyrightText: 2023 Devin Lin <devin@kde.org>
|
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
|
|
#include "wizard.h"
|
|
|
|
|
#include "settings.h"
|
|
|
|
|
#include "utils.h"
|
|
|
|
|
|
|
|
|
|
#include <KPackage/PackageLoader>
|
|
|
|
|
|
|
|
|
|
#include <QFileInfo>
|
|
|
|
|
#include <QQmlComponent>
|
|
|
|
|
|
|
|
|
|
// TODO read distro provided config file
|
|
|
|
|
const QList<QString> WIZARD_MODULE_ORDER = {QStringLiteral("org.kde.plasma.mobileinitialstart.prepare"),
|
|
|
|
|
QStringLiteral("org.kde.plasma.mobileinitialstart.time"),
|
|
|
|
|
QStringLiteral("org.kde.plasma.mobileinitialstart.wifi"),
|
|
|
|
|
QStringLiteral("org.kde.plasma.mobileinitialstart.cellular"),
|
2025-03-05 16:27:14 +00:00
|
|
|
QStringLiteral("org.kde.plasma.mobileinitialstart.systemnavigation"),
|
2023-04-01 07:09:57 +00:00
|
|
|
QStringLiteral("org.kde.plasma.mobileinitialstart.finished")};
|
|
|
|
|
|
|
|
|
|
Wizard::Wizard(QObject *parent, QQmlEngine *engine)
|
|
|
|
|
: QObject{parent}
|
|
|
|
|
, m_engine{engine}
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Wizard::load()
|
|
|
|
|
{
|
|
|
|
|
if (!m_engine) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
qCDebug(LOGGING_CATEGORY) << "Loading initialstart packages...";
|
|
|
|
|
|
|
|
|
|
// load initialstart packages
|
|
|
|
|
const auto packages = KPackage::PackageLoader::self()->listPackages(QStringLiteral("KPackage/GenericQML"), QStringLiteral("plasma/mobileinitialstart"));
|
|
|
|
|
for (auto &metaData : packages) {
|
|
|
|
|
KPackage::Package package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("KPackage/GenericQML"), QFileInfo(metaData.fileName()).path());
|
|
|
|
|
if (!package.isValid()) {
|
|
|
|
|
qCWarning(LOGGING_CATEGORY) << "initialstart package invalid:" << metaData.fileName();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
m_modulePackages.push_back({new KPluginMetaData{metaData}, package});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// sort modules by order
|
|
|
|
|
std::sort(m_modulePackages.begin(), m_modulePackages.end(), [](const auto &lhs, const auto &rhs) {
|
|
|
|
|
return WIZARD_MODULE_ORDER.indexOf(lhs.first->pluginId()) < WIZARD_MODULE_ORDER.indexOf(rhs.first->pluginId());
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
QQmlComponent *c = new QQmlComponent(m_engine, this);
|
|
|
|
|
|
|
|
|
|
// load initialstart QML items
|
2024-11-07 06:07:50 +00:00
|
|
|
for (const auto &[pluginMetadata, package] : m_modulePackages) {
|
2023-04-01 07:09:57 +00:00
|
|
|
// load QML from kpackage
|
2024-11-07 06:07:50 +00:00
|
|
|
c->loadUrl(package.fileUrl("mainscript"), QQmlComponent::PreferSynchronous);
|
2023-04-01 07:09:57 +00:00
|
|
|
|
|
|
|
|
auto created = c->create(m_engine->rootContext());
|
2024-11-07 06:07:50 +00:00
|
|
|
InitialStartModule *createdItem = qobject_cast<InitialStartModule *>(created);
|
2023-04-01 07:09:57 +00:00
|
|
|
|
|
|
|
|
// print errors if there were issues loading
|
|
|
|
|
if (!createdItem) {
|
|
|
|
|
qCWarning(LOGGING_CATEGORY) << "Unable to load initialstart module:" << created;
|
|
|
|
|
for (auto error : c->errors()) {
|
|
|
|
|
qCWarning(LOGGING_CATEGORY) << error;
|
|
|
|
|
}
|
|
|
|
|
delete created;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-07 06:07:50 +00:00
|
|
|
connect(createdItem, &InitialStartModule::availableChanged, this, &Wizard::determineAvailableModuleItems);
|
2023-04-01 07:09:57 +00:00
|
|
|
m_moduleItems.push_back(createdItem);
|
|
|
|
|
|
2024-11-07 06:07:50 +00:00
|
|
|
qCDebug(LOGGING_CATEGORY) << "Loaded initialstart module" << pluginMetadata->pluginId();
|
2023-04-01 07:09:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete c;
|
2024-11-07 06:07:50 +00:00
|
|
|
|
|
|
|
|
// Populate model
|
|
|
|
|
determineAvailableModuleItems();
|
2023-04-01 07:09:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Wizard::setTestingMode(bool testingMode)
|
|
|
|
|
{
|
|
|
|
|
if (testingMode != m_testingMode) {
|
|
|
|
|
m_testingMode = testingMode;
|
|
|
|
|
Q_EMIT testingModeChanged();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Wizard::testingMode()
|
|
|
|
|
{
|
|
|
|
|
return m_testingMode;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-07 06:07:50 +00:00
|
|
|
QList<InitialStartModule *> Wizard::steps()
|
2023-04-01 07:09:57 +00:00
|
|
|
{
|
2024-11-07 06:07:50 +00:00
|
|
|
return m_availableModuleItems;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int Wizard::stepsCount()
|
|
|
|
|
{
|
|
|
|
|
return m_availableModuleItems.size();
|
2023-04-01 07:09:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Wizard::wizardFinished()
|
|
|
|
|
{
|
|
|
|
|
Settings::self()->setWizardFinished();
|
2023-10-22 23:53:53 +00:00
|
|
|
QCoreApplication::quit();
|
2023-04-01 07:09:57 +00:00
|
|
|
}
|
2024-11-07 06:07:50 +00:00
|
|
|
|
|
|
|
|
void Wizard::determineAvailableModuleItems()
|
|
|
|
|
{
|
|
|
|
|
m_availableModuleItems.clear();
|
|
|
|
|
for (auto *moduleItem : m_moduleItems) {
|
|
|
|
|
if (moduleItem->available()) {
|
|
|
|
|
m_availableModuleItems.push_back(moduleItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Q_EMIT stepsChanged();
|
|
|
|
|
}
|