Brooklyn/plasma/workspace/applets/systemtray/systemtraysettings.cpp
2022-03-05 22:41:29 +05:00

165 lines
4.2 KiB
C++

/*
SPDX-FileCopyrightText: 2020 Konrad Materka <materka@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "systemtraysettings.h"
#include "debug.h"
#include <KConfigLoader>
static const QString KNOWN_ITEMS_KEY = QStringLiteral("knownItems");
static const QString EXTRA_ITEMS_KEY = QStringLiteral("extraItems");
static const QString SHOW_ALL_ITEMS_KEY = QStringLiteral("showAllItems");
static const QString SHOWN_ITEMS_KEY = QStringLiteral("shownItems");
static const QString HIDDEN_ITEMS_KEY = QStringLiteral("hiddenItems");
SystemTraySettings::SystemTraySettings(KConfigLoader *config, QObject *parent)
: QObject(parent)
, config(config)
{
connect(config, &KConfigLoader::configChanged, this, [this]() {
if (!updatingConfigValue) {
loadConfig();
}
});
loadConfig();
}
bool SystemTraySettings::isKnownPlugin(const QString &pluginId)
{
return m_knownItems.contains(pluginId);
}
const QStringList SystemTraySettings::knownPlugins() const
{
return m_knownItems;
}
void SystemTraySettings::addKnownPlugin(const QString &pluginId)
{
m_knownItems << pluginId;
writeConfigValue(KNOWN_ITEMS_KEY, m_knownItems);
}
void SystemTraySettings::removeKnownPlugin(const QString &pluginId)
{
m_knownItems.removeAll(pluginId);
writeConfigValue(KNOWN_ITEMS_KEY, m_knownItems);
}
bool SystemTraySettings::isEnabledPlugin(const QString &pluginId) const
{
return m_extraItems.contains(pluginId);
}
const QStringList SystemTraySettings::enabledPlugins() const
{
return m_extraItems;
}
void SystemTraySettings::addEnabledPlugin(const QString &pluginId)
{
m_extraItems << pluginId;
writeConfigValue(EXTRA_ITEMS_KEY, m_extraItems);
Q_EMIT enabledPluginsChanged({pluginId}, {});
}
void SystemTraySettings::removeEnabledPlugin(const QString &pluginId)
{
m_extraItems.removeAll(pluginId);
writeConfigValue(EXTRA_ITEMS_KEY, m_extraItems);
Q_EMIT enabledPluginsChanged({}, {pluginId});
}
bool SystemTraySettings::isShowAllItems() const
{
return config->property(SHOW_ALL_ITEMS_KEY).toBool();
}
const QStringList SystemTraySettings::shownItems() const
{
return config->property(SHOWN_ITEMS_KEY).toStringList();
}
const QStringList SystemTraySettings::hiddenItems() const
{
return config->property(HIDDEN_ITEMS_KEY).toStringList();
}
void SystemTraySettings::cleanupPlugin(const QString &pluginId)
{
removeKnownPlugin(pluginId);
removeEnabledPlugin(pluginId);
QStringList shown = shownItems();
shown.removeAll(pluginId);
writeConfigValue(SHOWN_ITEMS_KEY, shown);
QStringList hidden = hiddenItems();
hidden.removeAll(pluginId);
writeConfigValue(HIDDEN_ITEMS_KEY, hidden);
}
void SystemTraySettings::loadConfig()
{
if (!config) {
return;
}
config->load();
m_knownItems = config->property(KNOWN_ITEMS_KEY).toStringList();
QStringList extraItems = config->property(EXTRA_ITEMS_KEY).toStringList();
if (extraItems != m_extraItems) {
QStringList extraItemsOld = m_extraItems;
m_extraItems = extraItems;
notifyAboutChangedEnabledPlugins(extraItemsOld, m_extraItems);
}
Q_EMIT configurationChanged();
}
void SystemTraySettings::writeConfigValue(const QString &key, const QVariant &value)
{
if (!config) {
return;
}
KConfigSkeletonItem *item = config->findItemByName(key);
if (item) {
updatingConfigValue = true;
item->setWriteFlags(KConfigBase::Notify);
item->setProperty(value);
config->save();
// refresh state of config scheme, if not, above writes are ignored
config->read();
updatingConfigValue = false;
}
Q_EMIT configurationChanged();
}
void SystemTraySettings::notifyAboutChangedEnabledPlugins(const QStringList &enabledPluginsOld, const QStringList &enabledPluginsNew)
{
QStringList newlyEnabled;
QStringList newlyDisabled;
for (const QString &pluginId : enabledPluginsOld) {
if (!enabledPluginsNew.contains(pluginId)) {
newlyDisabled << pluginId;
}
}
for (const QString &pluginId : enabledPluginsNew) {
if (!enabledPluginsOld.contains(pluginId)) {
newlyEnabled << pluginId;
}
}
Q_EMIT enabledPluginsChanged(newlyEnabled, newlyDisabled);
}