2022-03-17 03:20:36 +00:00
|
|
|
// SPDX-FileCopyrightText: 2022 Devin Lin <devin@kde.org>
|
|
|
|
|
// SPDX-License-Identifier: LGPL-2.0-or-later
|
|
|
|
|
|
|
|
|
|
#include "savedquicksettings.h"
|
|
|
|
|
|
|
|
|
|
#include <KPackage/PackageLoader>
|
|
|
|
|
|
|
|
|
|
#include <QFileInfo>
|
|
|
|
|
|
|
|
|
|
using namespace MobileShell;
|
|
|
|
|
|
|
|
|
|
SavedQuickSettings::SavedQuickSettings(QObject *parent)
|
|
|
|
|
: QObject{parent}
|
|
|
|
|
, m_settings{new MobileShellSettings{this}}
|
|
|
|
|
, m_validPackages{}
|
|
|
|
|
, m_enabledPackages{}
|
|
|
|
|
, m_disabledPackages{}
|
|
|
|
|
, m_enabledQSModel{new SavedQuickSettingsModel{this}}
|
|
|
|
|
, m_disabledQSModel{new SavedQuickSettingsModel{this}}
|
2022-03-17 19:34:27 +00:00
|
|
|
, m_updateTimer{new QTimer{this}}
|
2022-03-17 03:20:36 +00:00
|
|
|
{
|
2022-03-17 19:34:27 +00:00
|
|
|
// throttle model updates from config, to avoid performance issues with fast reloading
|
|
|
|
|
m_updateTimer->setInterval(2000);
|
|
|
|
|
connect(m_updateTimer, &QTimer::timeout, this, [this]() {
|
|
|
|
|
refreshModel();
|
|
|
|
|
});
|
|
|
|
|
|
2022-03-17 03:20:36 +00:00
|
|
|
// load quicksettings packages
|
|
|
|
|
auto packages = KPackage::PackageLoader::self()->listPackages(QStringLiteral("KPackage/GenericQML"), "plasma/quicksettings");
|
|
|
|
|
|
|
|
|
|
for (auto &metaData : packages) {
|
|
|
|
|
KPackage::Package package = KPackage::PackageLoader::self()->loadPackage("KPackage/GenericQML", QFileInfo(metaData.fileName()).path());
|
|
|
|
|
if (!package.isValid()) {
|
|
|
|
|
qWarning() << "Quick setting package invalid:" << metaData.fileName();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2022-03-17 19:34:27 +00:00
|
|
|
m_validPackages.push_back(new KPluginMetaData{metaData});
|
2022-03-17 03:20:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// subscribe to config changes
|
|
|
|
|
connect(m_settings, &MobileShellSettings::enabledQuickSettingsChanged, this, [this]() {
|
2022-03-17 19:34:27 +00:00
|
|
|
m_updateTimer->start();
|
2022-03-17 03:20:36 +00:00
|
|
|
});
|
|
|
|
|
connect(m_settings, &MobileShellSettings::disabledQuickSettingsChanged, this, [this]() {
|
2022-03-17 19:34:27 +00:00
|
|
|
m_updateTimer->start();
|
2022-03-17 03:20:36 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// subscribe to model changes
|
2022-03-17 19:34:27 +00:00
|
|
|
connect(m_enabledQSModel, &SavedQuickSettingsModel::dataUpdated, this, [this](QList<KPluginMetaData *> data) -> void {
|
2022-03-17 03:20:36 +00:00
|
|
|
m_enabledPackages.clear();
|
|
|
|
|
for (auto metaData : data) {
|
|
|
|
|
m_enabledPackages.push_back(metaData);
|
|
|
|
|
}
|
2022-03-17 19:34:27 +00:00
|
|
|
|
|
|
|
|
saveModel();
|
2022-03-17 03:20:36 +00:00
|
|
|
});
|
2022-03-17 19:34:27 +00:00
|
|
|
connect(m_disabledQSModel, &SavedQuickSettingsModel::dataUpdated, this, [this](QList<KPluginMetaData *> data) -> void {
|
2022-03-17 03:20:36 +00:00
|
|
|
m_disabledPackages.clear();
|
|
|
|
|
for (auto metaData : data) {
|
|
|
|
|
m_disabledPackages.push_back(metaData);
|
|
|
|
|
}
|
2022-03-17 19:34:27 +00:00
|
|
|
|
|
|
|
|
saveModel();
|
2022-03-17 03:20:36 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// load
|
|
|
|
|
refreshModel();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SavedQuickSettingsModel *SavedQuickSettings::enabledQuickSettingsModel() const
|
|
|
|
|
{
|
|
|
|
|
return m_enabledQSModel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SavedQuickSettingsModel *SavedQuickSettings::disabledQuickSettingsModel() const
|
|
|
|
|
{
|
|
|
|
|
return m_disabledQSModel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SavedQuickSettings::refreshModel()
|
|
|
|
|
{
|
|
|
|
|
QList<QString> enabledQS = m_settings->enabledQuickSettings();
|
|
|
|
|
QList<QString> disabledQS = m_settings->disabledQuickSettings();
|
|
|
|
|
|
|
|
|
|
m_enabledPackages.clear();
|
|
|
|
|
m_disabledPackages.clear();
|
|
|
|
|
|
|
|
|
|
// add enabled quick settings in order
|
|
|
|
|
for (const QString &pluginId : enabledQS) {
|
|
|
|
|
for (auto &metaData : m_validPackages) {
|
2022-03-17 19:34:27 +00:00
|
|
|
if (pluginId == metaData->pluginId()) {
|
2022-03-17 03:20:36 +00:00
|
|
|
m_enabledPackages.push_back(metaData);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// add disabled quick settings in order
|
|
|
|
|
for (const QString &pluginId : disabledQS) {
|
|
|
|
|
for (auto &metaData : m_validPackages) {
|
2022-03-17 19:34:27 +00:00
|
|
|
if (pluginId == metaData->pluginId()) {
|
2022-03-17 03:20:36 +00:00
|
|
|
m_disabledPackages.push_back(metaData);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// add undefined quick settings to the back of enabled quick settings
|
|
|
|
|
for (auto &metaData : m_validPackages) {
|
2022-03-17 19:34:27 +00:00
|
|
|
if (!enabledQS.contains(metaData->pluginId()) && !disabledQS.contains(metaData->pluginId())) {
|
2022-03-17 03:20:36 +00:00
|
|
|
m_enabledPackages.push_back(metaData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_enabledQSModel->updateData(m_enabledPackages);
|
|
|
|
|
m_disabledQSModel->updateData(m_disabledPackages);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SavedQuickSettings::saveModel()
|
|
|
|
|
{
|
|
|
|
|
QList<QString> enabledQS;
|
|
|
|
|
QList<QString> disabledQS;
|
|
|
|
|
|
|
|
|
|
for (auto &metaData : m_enabledPackages) {
|
2022-03-17 19:34:27 +00:00
|
|
|
enabledQS.push_back(metaData->pluginId());
|
2022-03-17 03:20:36 +00:00
|
|
|
}
|
|
|
|
|
for (auto &metaData : m_disabledPackages) {
|
2022-03-17 19:34:27 +00:00
|
|
|
disabledQS.push_back(metaData->pluginId());
|
2022-03-17 03:20:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_settings->setEnabledQuickSettings(enabledQS);
|
|
|
|
|
m_settings->setDisabledQuickSettings(disabledQS);
|
|
|
|
|
}
|