1 //////////////////////////////////////////////////////////////////////////////
2 // oxygenconfigurationui.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 "oxygenconfigwidget.h"
11 #include "oxygenexceptionlist.h"
12 
13 #include <QGroupBox>
14 #include <QIcon>
15 #include <QLabel>
16 #include <QLayout>
17 
18 #include <KLocalizedString>
19 
20 #include <QDBusConnection>
21 #include <QDBusMessage>
22 
23 namespace Oxygen
24 {
25 
26     //_________________________________________________________
ConfigWidget(QWidget * parent,const QVariantList & args)27     ConfigWidget::ConfigWidget( QWidget* parent, const QVariantList &args ):
28         KCModule(parent, args),
29         m_configuration( KSharedConfig::openConfig( QStringLiteral( "oxygenrc" ) ) ),
30         m_changed( false )
31     {
32 
33         m_ui.setupUi( this );
34 
35         // shadow configuration
36         m_ui.activeShadowConfiguration->setGroup( QPalette::Active );
37         m_ui.inactiveShadowConfiguration->setGroup( QPalette::Inactive );
38 
39         // track ui changes
40         connect( m_ui.titleAlignment, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
41         connect( m_ui.buttonSize, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()) );
42         connect( m_ui.drawBorderOnMaximizedWindows, SIGNAL(clicked()), SLOT(updateChanged()) );
43         connect( m_ui.drawSizeGrip, SIGNAL(clicked()), SLOT(updateChanged()) );
44         connect( m_ui.useWindowColors, SIGNAL(clicked()), SLOT(updateChanged()) );
45         connect( m_ui.animationConfigWidget, SIGNAL(changed(bool)), SLOT(updateChanged()) );
46 
47         // track exception changes
48         connect( m_ui.exceptions, SIGNAL(changed(bool)), SLOT(updateChanged()) );
49 
50         // track shadow configuration changes
51         connect( m_ui.activeShadowConfiguration, SIGNAL(changed(bool)), SLOT(updateChanged()) );
52         connect( m_ui.inactiveShadowConfiguration, SIGNAL(changed(bool)), SLOT(updateChanged()) );
53 
54     }
55 
56     //_________________________________________________________
load(void)57     void ConfigWidget::load( void )
58     {
59 
60         // create internal settings and load from rc files
61         m_internalSettings = InternalSettingsPtr( new InternalSettings() );
62         m_internalSettings->load();
63 
64         // assign to ui
65         m_ui.titleAlignment->setCurrentIndex( m_internalSettings->titleAlignment() );
66         m_ui.buttonSize->setCurrentIndex( m_internalSettings->buttonSize() );
67         m_ui.drawBorderOnMaximizedWindows->setChecked( m_internalSettings->drawBorderOnMaximizedWindows() );
68         m_ui.drawSizeGrip->setChecked( m_internalSettings->drawSizeGrip() );
69         m_ui.useWindowColors->setChecked( m_internalSettings->useWindowColors() );
70 
71         // load animations
72         m_ui.animationConfigWidget->setInternalSettings( m_internalSettings );
73         m_ui.animationConfigWidget->load();
74 
75         // load shadows
76         m_ui.activeShadowConfiguration->load();
77         m_ui.inactiveShadowConfiguration->load();
78 
79         // load exceptions
80         ExceptionList exceptions;
81         exceptions.readConfig( m_configuration );
82         m_ui.exceptions->setExceptions( exceptions.get() );
83 
84         setChanged( false );
85 
86     }
87 
88     //_________________________________________________________
save(void)89     void ConfigWidget::save( void )
90     {
91 
92         // create internal settings and load from rc files
93         m_internalSettings = InternalSettingsPtr( new InternalSettings() );
94         m_internalSettings->load();
95 
96         // apply modifications from ui
97         m_internalSettings->setTitleAlignment( m_ui.titleAlignment->currentIndex() );
98         m_internalSettings->setButtonSize( m_ui.buttonSize->currentIndex() );
99         m_internalSettings->setDrawBorderOnMaximizedWindows( m_ui.drawBorderOnMaximizedWindows->isChecked() );
100         m_internalSettings->setDrawSizeGrip( m_ui.drawSizeGrip->isChecked() );
101         m_internalSettings->setUseWindowColors( m_ui.useWindowColors->isChecked() );
102 
103         // save animations
104         m_ui.animationConfigWidget->setInternalSettings( m_internalSettings );
105         m_ui.animationConfigWidget->save();
106 
107         // save configuration
108         m_internalSettings->save();
109 
110         // save shadows
111         m_ui.activeShadowConfiguration->save();
112         m_ui.inactiveShadowConfiguration->save();
113 
114         // get list of exceptions and write
115         InternalSettingsList exceptions( m_ui.exceptions->exceptions() );
116         ExceptionList( exceptions ).writeConfig( m_configuration );
117 
118         // sync configuration
119         m_configuration->sync();
120         setChanged( false );
121 
122         // needed to tell kwin to reload when running from external kcmshell
123         {
124             QDBusMessage message = QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
125             QDBusConnection::sessionBus().send(message);
126         }
127 
128         // needed for oxygen style to reload shadows
129         {
130             QDBusMessage message( QDBusMessage::createSignal("/OxygenDecoration",  "org.kde.Oxygen.Style", "reparseConfiguration") );
131             QDBusConnection::sessionBus().send(message);
132         }
133 
134     }
135 
136     //_________________________________________________________
defaults(void)137     void ConfigWidget::defaults( void )
138     {
139 
140         // create internal settings and load from rc files
141         m_internalSettings = InternalSettingsPtr( new InternalSettings() );
142         m_ui.animationConfigWidget->setInternalSettings( m_internalSettings );
143         m_internalSettings->setDefaults();
144 
145         // assign to ui
146         m_ui.titleAlignment->setCurrentIndex( m_internalSettings->titleAlignment() );
147         m_ui.buttonSize->setCurrentIndex( m_internalSettings->buttonSize() );
148         m_ui.drawBorderOnMaximizedWindows->setChecked( m_internalSettings->drawBorderOnMaximizedWindows() );
149         m_ui.drawSizeGrip->setChecked( m_internalSettings->drawSizeGrip() );
150         m_ui.useWindowColors->setChecked( m_internalSettings->useWindowColors() );
151 
152         // load shadows
153         m_ui.activeShadowConfiguration->setDefaults();
154         m_ui.inactiveShadowConfiguration->setDefaults();
155 
156         // load animations
157         m_ui.animationConfigWidget->setInternalSettings( m_internalSettings );
158         m_ui.animationConfigWidget->load();
159 
160         setChanged( false );
161 
162     }
163 
164     //_______________________________________________
updateChanged(void)165     void ConfigWidget::updateChanged( void )
166     {
167 
168         // check configuration
169         if( !m_internalSettings ) return;
170 
171         // track modifications
172         bool modified( false );
173 
174         if( m_ui.titleAlignment->currentIndex() != m_internalSettings->titleAlignment() ) modified = true;
175         else if( m_ui.buttonSize->currentIndex() != m_internalSettings->buttonSize() ) modified = true;
176         else if( m_ui.drawBorderOnMaximizedWindows->isChecked() !=  m_internalSettings->drawBorderOnMaximizedWindows() ) modified = true;
177         else if( m_ui.drawSizeGrip->isChecked() !=  m_internalSettings->drawSizeGrip() ) modified = true;
178         else if( m_ui.useWindowColors->isChecked() !=  m_internalSettings->useWindowColors() ) modified = true;
179 
180         // animations
181         else if( m_ui.animationConfigWidget->isChanged() ) modified = true;
182 
183         // exceptions
184         else if( m_ui.exceptions->isChanged() ) modified = true;
185 
186         // shadow configurations
187         else if( m_ui.activeShadowConfiguration->isChanged() ) modified = true;
188         else if( m_ui.inactiveShadowConfiguration->isChanged() ) modified = true;
189 
190         setChanged( modified );
191 
192     }
193 }
194