File indexing completed on 2024-05-12 05:28:35

0001 //////////////////////////////////////////////////////////////////////////////
0002 // breezeconfigurationui.cpp
0003 // -------------------
0004 //
0005 // SPDX-FileCopyrightText: 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0006 //
0007 // SPDX-License-Identifier: MIT
0008 //////////////////////////////////////////////////////////////////////////////
0009 
0010 #include "breezeconfigwidget.h"
0011 #include "breezeexceptionlist.h"
0012 
0013 #include <KLocalizedString>
0014 
0015 #include <QDBusConnection>
0016 #include <QDBusMessage>
0017 #include <QFontDatabase>
0018 
0019 namespace Breeze
0020 {
0021 //_________________________________________________________
0022 ConfigWidget::ConfigWidget(QObject *parent, const KPluginMetaData &data, const QVariantList & /*args*/)
0023     : KCModule(parent, data)
0024     , m_configuration(KSharedConfig::openConfig(QStringLiteral("breezerc")))
0025     , m_changed(false)
0026 {
0027     // configuration
0028     m_ui.setupUi(widget());
0029 
0030     // track ui changes
0031     connect(m_ui.titleAlignment, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()));
0032     connect(m_ui.buttonSize, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()));
0033     connect(m_ui.outlineCloseButton, &QAbstractButton::clicked, this, &ConfigWidget::updateChanged);
0034     connect(m_ui.drawBorderOnMaximizedWindows, &QAbstractButton::clicked, this, &ConfigWidget::updateChanged);
0035     connect(m_ui.drawBackgroundGradient, &QAbstractButton::clicked, this, &ConfigWidget::updateChanged);
0036 
0037     // track shadows changes
0038     connect(m_ui.shadowSize, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()));
0039     connect(m_ui.shadowStrength, SIGNAL(valueChanged(int)), SLOT(updateChanged()));
0040     connect(m_ui.shadowColor, &KColorButton::changed, this, &ConfigWidget::updateChanged);
0041     connect(m_ui.outlineIntensity, SIGNAL(activated(int)), SLOT(updateChanged()));
0042 
0043     // track exception changes
0044     connect(m_ui.exceptions, &ExceptionListWidget::changed, this, &ConfigWidget::updateChanged);
0045 
0046     // set formatting
0047     m_ui.drawBorderOnMaximizedWindowsHelpLabel->setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont));
0048 }
0049 
0050 //_________________________________________________________
0051 void ConfigWidget::load()
0052 {
0053     // create internal settings and load from rc files
0054     m_internalSettings = InternalSettingsPtr(new InternalSettings());
0055     m_internalSettings->load();
0056 
0057     // assign to ui
0058     m_ui.titleAlignment->setCurrentIndex(m_internalSettings->titleAlignment());
0059     m_ui.buttonSize->setCurrentIndex(m_internalSettings->buttonSize());
0060     m_ui.drawBorderOnMaximizedWindows->setChecked(m_internalSettings->drawBorderOnMaximizedWindows());
0061     m_ui.outlineCloseButton->setChecked(m_internalSettings->outlineCloseButton());
0062     m_ui.drawBackgroundGradient->setChecked(m_internalSettings->drawBackgroundGradient());
0063 
0064     // load shadows
0065     if (m_internalSettings->shadowSize() <= InternalSettings::ShadowVeryLarge) {
0066         m_ui.shadowSize->setCurrentIndex(m_internalSettings->shadowSize());
0067     } else {
0068         m_ui.shadowSize->setCurrentIndex(InternalSettings::ShadowLarge);
0069     }
0070 
0071     m_ui.shadowStrength->setValue(qRound(qreal(m_internalSettings->shadowStrength() * 100) / 255));
0072     m_ui.shadowColor->setColor(m_internalSettings->shadowColor());
0073 
0074     // load outline intensity
0075     if (m_internalSettings->outlineIntensity() <= InternalSettings::OutlineMaximum) {
0076         m_ui.outlineIntensity->setCurrentIndex(m_internalSettings->outlineIntensity());
0077     } else {
0078         m_ui.outlineIntensity->setCurrentIndex(InternalSettings::OutlineMedium);
0079     }
0080 
0081     // load exceptions
0082     ExceptionList exceptions;
0083     exceptions.readConfig(m_configuration);
0084     m_ui.exceptions->setExceptions(exceptions.get());
0085     setNeedsSave(false);
0086 }
0087 
0088 //_________________________________________________________
0089 void ConfigWidget::save()
0090 {
0091     // create internal settings and load from rc files
0092     m_internalSettings = InternalSettingsPtr(new InternalSettings());
0093     m_internalSettings->load();
0094 
0095     // apply modifications from ui
0096     m_internalSettings->setTitleAlignment(m_ui.titleAlignment->currentIndex());
0097     m_internalSettings->setButtonSize(m_ui.buttonSize->currentIndex());
0098     m_internalSettings->setOutlineCloseButton(m_ui.outlineCloseButton->isChecked());
0099     m_internalSettings->setDrawBorderOnMaximizedWindows(m_ui.drawBorderOnMaximizedWindows->isChecked());
0100     m_internalSettings->setDrawBackgroundGradient(m_ui.drawBackgroundGradient->isChecked());
0101 
0102     m_internalSettings->setShadowSize(m_ui.shadowSize->currentIndex());
0103     m_internalSettings->setShadowStrength(qRound(qreal(m_ui.shadowStrength->value() * 255) / 100));
0104     m_internalSettings->setShadowColor(m_ui.shadowColor->color());
0105     m_internalSettings->setOutlineIntensity(m_ui.outlineIntensity->currentIndex());
0106 
0107     // save configuration
0108     m_internalSettings->save();
0109 
0110     // get list of exceptions and write
0111     InternalSettingsList exceptions(m_ui.exceptions->exceptions());
0112     ExceptionList(exceptions).writeConfig(m_configuration);
0113 
0114     // sync configuration
0115     m_configuration->sync();
0116     setNeedsSave(false);
0117 
0118     // needed to tell kwin to reload when running from external kcmshell
0119     {
0120         QDBusMessage message = QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
0121         QDBusConnection::sessionBus().send(message);
0122     }
0123 
0124     // needed for breeze style to reload shadows
0125     {
0126         QDBusMessage message(QDBusMessage::createSignal("/BreezeDecoration", "org.kde.Breeze.Style", "reparseConfiguration"));
0127         QDBusConnection::sessionBus().send(message);
0128     }
0129 }
0130 
0131 //_________________________________________________________
0132 void ConfigWidget::defaults()
0133 {
0134     // create internal settings and load from rc files
0135     m_internalSettings = InternalSettingsPtr(new InternalSettings());
0136     m_internalSettings->setDefaults();
0137 
0138     // assign to ui
0139     m_ui.titleAlignment->setCurrentIndex(m_internalSettings->titleAlignment());
0140     m_ui.buttonSize->setCurrentIndex(m_internalSettings->buttonSize());
0141     m_ui.outlineCloseButton->setChecked(m_internalSettings->outlineCloseButton());
0142     m_ui.drawBorderOnMaximizedWindows->setChecked(m_internalSettings->drawBorderOnMaximizedWindows());
0143     m_ui.drawBackgroundGradient->setChecked(m_internalSettings->drawBackgroundGradient());
0144 
0145     m_ui.shadowSize->setCurrentIndex(m_internalSettings->shadowSize());
0146     m_ui.shadowStrength->setValue(qRound(qreal(m_internalSettings->shadowStrength() * 100) / 255));
0147     m_ui.shadowColor->setColor(m_internalSettings->shadowColor());
0148     m_ui.outlineIntensity->setCurrentIndex(m_internalSettings->outlineIntensity());
0149 }
0150 
0151 //_______________________________________________
0152 void ConfigWidget::updateChanged()
0153 {
0154     // check configuration
0155     if (!m_internalSettings) {
0156         return;
0157     }
0158 
0159     // track modifications
0160     bool modified(false);
0161 
0162     if (m_ui.titleAlignment->currentIndex() != m_internalSettings->titleAlignment()) {
0163         modified = true;
0164     } else if (m_ui.buttonSize->currentIndex() != m_internalSettings->buttonSize()) {
0165         modified = true;
0166     } else if (m_ui.outlineCloseButton->isChecked() != m_internalSettings->outlineCloseButton()) {
0167         modified = true;
0168     } else if (m_ui.drawBorderOnMaximizedWindows->isChecked() != m_internalSettings->drawBorderOnMaximizedWindows()) {
0169         modified = true;
0170     } else if (m_ui.drawBackgroundGradient->isChecked() != m_internalSettings->drawBackgroundGradient()) {
0171         modified = true;
0172 
0173         // shadows
0174     } else if (m_ui.shadowSize->currentIndex() != m_internalSettings->shadowSize()) {
0175         modified = true;
0176     } else if (qRound(qreal(m_ui.shadowStrength->value() * 255) / 100) != m_internalSettings->shadowStrength()) {
0177         modified = true;
0178     } else if (m_ui.shadowColor->color() != m_internalSettings->shadowColor()) {
0179         modified = true;
0180     } else if (m_ui.outlineIntensity->currentIndex() != m_internalSettings->outlineIntensity()) {
0181         modified = true;
0182 
0183         // exceptions
0184     } else if (m_ui.exceptions->isChanged()) {
0185         modified = true;
0186     }
0187 
0188     setNeedsSave(modified);
0189 }
0190 
0191 }