1 //////////////////////////////////////////////////////////////////////////////
2 // breezeconfigurationui.cpp
3 // -------------------
4 //
5 // SPDX-FileCopyrightText: 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
6 //
7 // SPDX-License-Identifier: MIT
8 //////////////////////////////////////////////////////////////////////////////
9 
10 #include "breezeconfigwidget.h"
11 #include "breezeexceptionlist.h"
12 
13 #include <KLocalizedString>
14 
15 #include <QDBusConnection>
16 #include <QDBusMessage>
17 
18 namespace Breeze
19 {
20 
21     //_________________________________________________________
ConfigWidget(QWidget * parent,const QVariantList & args)22     ConfigWidget::ConfigWidget( QWidget* parent, const QVariantList &args ):
23         KCModule(parent, args),
24         m_configuration( KSharedConfig::openConfig( QStringLiteral( "breezerc" ) ) ),
25         m_changed( false )
26     {
27 
28         // configuration
29         m_ui.setupUi( this );
30 
31         // track ui changes
32         connect( m_ui.titleAlignment, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
33         connect( m_ui.buttonSize, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
34         connect( m_ui.outlineCloseButton, &QAbstractButton::clicked, this, &ConfigWidget::updateChanged );
35         connect( m_ui.drawBorderOnMaximizedWindows, &QAbstractButton::clicked, this, &ConfigWidget::updateChanged );
36         connect( m_ui.drawSizeGrip, &QAbstractButton::clicked, this, &ConfigWidget::updateChanged );
37         connect( m_ui.drawBackgroundGradient, &QAbstractButton::clicked, this, &ConfigWidget::updateChanged );
38         connect( m_ui.drawTitleBarSeparator, &QAbstractButton::clicked, this, &ConfigWidget::updateChanged );
39 
40         // track shadows changes
41         connect( m_ui.shadowSize, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
42         connect( m_ui.shadowStrength, SIGNAL(valueChanged(int)), SLOT(updateChanged()) );
43         connect( m_ui.shadowColor, &KColorButton::changed, this, &ConfigWidget::updateChanged );
44 
45         // track exception changes
46         connect( m_ui.exceptions, &ExceptionListWidget::changed, this, &ConfigWidget::updateChanged );
47 
48     }
49 
50     //_________________________________________________________
load()51     void ConfigWidget::load()
52     {
53 
54         // create internal settings and load from rc files
55         m_internalSettings = InternalSettingsPtr( new InternalSettings() );
56         m_internalSettings->load();
57 
58         // assign to ui
59         m_ui.titleAlignment->setCurrentIndex( m_internalSettings->titleAlignment() );
60         m_ui.buttonSize->setCurrentIndex( m_internalSettings->buttonSize() );
61         m_ui.drawBorderOnMaximizedWindows->setChecked( m_internalSettings->drawBorderOnMaximizedWindows() );
62         m_ui.outlineCloseButton->setChecked( m_internalSettings->outlineCloseButton() );
63         m_ui.drawSizeGrip->setChecked( m_internalSettings->drawSizeGrip() );
64         m_ui.drawBackgroundGradient->setChecked( m_internalSettings->drawBackgroundGradient() );
65         m_ui.drawTitleBarSeparator->setChecked( m_internalSettings->drawTitleBarSeparator() );
66 
67         // load shadows
68         if( m_internalSettings->shadowSize() <= InternalSettings::ShadowVeryLarge ) m_ui.shadowSize->setCurrentIndex( m_internalSettings->shadowSize() );
69         else m_ui.shadowSize->setCurrentIndex( InternalSettings::ShadowLarge );
70 
71         m_ui.shadowStrength->setValue( qRound(qreal(m_internalSettings->shadowStrength()*100)/255 ) );
72         m_ui.shadowColor->setColor( m_internalSettings->shadowColor() );
73 
74         // load exceptions
75         ExceptionList exceptions;
76         exceptions.readConfig( m_configuration );
77         m_ui.exceptions->setExceptions( exceptions.get() );
78         setChanged( false );
79 
80     }
81 
82     //_________________________________________________________
save()83     void ConfigWidget::save()
84     {
85 
86         // create internal settings and load from rc files
87         m_internalSettings = InternalSettingsPtr( new InternalSettings() );
88         m_internalSettings->load();
89 
90         // apply modifications from ui
91         m_internalSettings->setTitleAlignment( m_ui.titleAlignment->currentIndex() );
92         m_internalSettings->setButtonSize( m_ui.buttonSize->currentIndex() );
93         m_internalSettings->setOutlineCloseButton( m_ui.outlineCloseButton->isChecked() );
94         m_internalSettings->setDrawBorderOnMaximizedWindows( m_ui.drawBorderOnMaximizedWindows->isChecked() );
95         m_internalSettings->setDrawSizeGrip( m_ui.drawSizeGrip->isChecked() );
96         m_internalSettings->setDrawBackgroundGradient( m_ui.drawBackgroundGradient->isChecked() );
97         m_internalSettings->setDrawTitleBarSeparator(m_ui.drawTitleBarSeparator->isChecked());
98 
99         m_internalSettings->setShadowSize( m_ui.shadowSize->currentIndex() );
100         m_internalSettings->setShadowStrength( qRound( qreal(m_ui.shadowStrength->value()*255)/100 ) );
101         m_internalSettings->setShadowColor( m_ui.shadowColor->color() );
102 
103         // save configuration
104         m_internalSettings->save();
105 
106         // get list of exceptions and write
107         InternalSettingsList exceptions( m_ui.exceptions->exceptions() );
108         ExceptionList( exceptions ).writeConfig( m_configuration );
109 
110         // sync configuration
111         m_configuration->sync();
112         setChanged( false );
113 
114         // needed to tell kwin to reload when running from external kcmshell
115         {
116             QDBusMessage message = QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
117             QDBusConnection::sessionBus().send(message);
118         }
119 
120         // needed for breeze style to reload shadows
121         {
122             QDBusMessage message( QDBusMessage::createSignal("/BreezeDecoration",  "org.kde.Breeze.Style", "reparseConfiguration") );
123             QDBusConnection::sessionBus().send(message);
124         }
125 
126     }
127 
128     //_________________________________________________________
defaults()129     void ConfigWidget::defaults()
130     {
131 
132         // create internal settings and load from rc files
133         m_internalSettings = InternalSettingsPtr( new InternalSettings() );
134         m_internalSettings->setDefaults();
135 
136         // assign to ui
137         m_ui.titleAlignment->setCurrentIndex( m_internalSettings->titleAlignment() );
138         m_ui.buttonSize->setCurrentIndex( m_internalSettings->buttonSize() );
139         m_ui.outlineCloseButton->setChecked( m_internalSettings->outlineCloseButton() );
140         m_ui.drawBorderOnMaximizedWindows->setChecked( m_internalSettings->drawBorderOnMaximizedWindows() );
141         m_ui.drawSizeGrip->setChecked( m_internalSettings->drawSizeGrip() );
142         m_ui.drawBackgroundGradient->setChecked( m_internalSettings->drawBackgroundGradient() );
143         m_ui.drawTitleBarSeparator->setChecked( m_internalSettings->drawTitleBarSeparator() );
144 
145         m_ui.shadowSize->setCurrentIndex( m_internalSettings->shadowSize() );
146         m_ui.shadowStrength->setValue( qRound(qreal(m_internalSettings->shadowStrength()*100)/255 ) );
147         m_ui.shadowColor->setColor( m_internalSettings->shadowColor() );
148 
149     }
150 
151     //_______________________________________________
updateChanged()152     void ConfigWidget::updateChanged()
153     {
154 
155         // check configuration
156         if( !m_internalSettings ) return;
157 
158         // track modifications
159         bool modified( false );
160 
161         if (m_ui.drawTitleBarSeparator->isChecked() != m_internalSettings->drawTitleBarSeparator()) modified = true;
162         if( m_ui.titleAlignment->currentIndex() != m_internalSettings->titleAlignment() ) modified = true;
163         else if( m_ui.buttonSize->currentIndex() != m_internalSettings->buttonSize() ) modified = true;
164         else if( m_ui.outlineCloseButton->isChecked() != m_internalSettings->outlineCloseButton() ) modified = true;
165         else if( m_ui.drawBorderOnMaximizedWindows->isChecked() !=  m_internalSettings->drawBorderOnMaximizedWindows() ) modified = true;
166         else if( m_ui.drawSizeGrip->isChecked() !=  m_internalSettings->drawSizeGrip() ) modified = true;
167         else if( m_ui.drawBackgroundGradient->isChecked() !=  m_internalSettings->drawBackgroundGradient() ) modified = true;
168 
169         // shadows
170         else if( m_ui.shadowSize->currentIndex() !=  m_internalSettings->shadowSize() ) modified = true;
171         else if( qRound( qreal(m_ui.shadowStrength->value()*255)/100 ) != m_internalSettings->shadowStrength() ) modified = true;
172         else if( m_ui.shadowColor->color() != m_internalSettings->shadowColor() ) modified = true;
173 
174         // exceptions
175         else if( m_ui.exceptions->isChanged() ) modified = true;
176 
177         setChanged( modified );
178 
179     }
180 
181     //_______________________________________________
setChanged(bool value)182     void ConfigWidget::setChanged( bool value )
183     {
184         emit changed( value );
185     }
186 
187 }
188