File indexing completed on 2024-05-19 05:35:23

0001 /*
0002 SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0003 SPDX-FileCopyrightText: 2009 Matthew Woehlke <mw.triad@users.sourceforge.net>
0004 SPDX-FileCopyrightText: 2009 Long Huynh Huu <long.upcase@googlemail.com>
0005 SPDX-FileCopyrightText: 2003 Sandro Giessl <ceebx@users.sourceforge.net>
0006 
0007 originally based on the Keramik configuration dialog:
0008 SPDX-FileCopyrightText: 2003 Maksim Orlovich <maksim.orlovich@kdemail.net>
0009 
0010 SPDX-License-Identifier: MIT
0011 
0012 */
0013 
0014 #include "oxygenstyleconfig.h"
0015 #include "../oxygen.h"
0016 #include "config-liboxygen.h"
0017 #include "oxygenanimationconfigwidget.h"
0018 #include "oxygenstyleconfigdata.h"
0019 
0020 #include <QDBusConnection>
0021 #include <QDBusMessage>
0022 #include <QTextStream>
0023 
0024 #include <KConfigGroup>
0025 #include <KLocalizedString>
0026 #include <KSharedConfig>
0027 
0028 #define SCROLLBAR_DEFAULT_WIDTH 15
0029 #define SCROLLBAR_MINIMUM_WIDTH 10
0030 #define SCROLLBAR_MAXIMUM_WIDTH 30
0031 
0032 extern "C" {
0033 Q_DECL_EXPORT QWidget *allocate_kstyle_config(QWidget *parent)
0034 {
0035     return new Oxygen::StyleConfig(parent);
0036 }
0037 }
0038 
0039 namespace Oxygen
0040 {
0041 //__________________________________________________________________
0042 StyleConfig::StyleConfig(QWidget *parent)
0043     : QWidget(parent)
0044 {
0045     setupUi(this);
0046 
0047     // load setup from configData
0048     load();
0049 
0050     connect(_useBackgroundGradient, SIGNAL(toggled(bool)), SLOT(updateChanged()));
0051     connect(_toolBarDrawItemSeparator, SIGNAL(toggled(bool)), SLOT(updateChanged()));
0052     connect(_splitterProxyEnabled, SIGNAL(toggled(bool)), SLOT(updateChanged()));
0053     connect(_mnemonicsMode, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()));
0054     connect(_viewDrawFocusIndicator, SIGNAL(toggled(bool)), SLOT(updateChanged()));
0055     connect(_viewTriangularExpanderSize, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()));
0056     connect(_viewDrawTreeBranchLines, SIGNAL(toggled(bool)), SLOT(updateChanged()));
0057     connect(_scrollBarWidth, SIGNAL(valueChanged(int)), SLOT(updateChanged()));
0058     connect(_scrollBarAddLineButtons, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()));
0059     connect(_scrollBarSubLineButtons, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()));
0060     connect(_menuHighlightDark, SIGNAL(toggled(bool)), SLOT(updateChanged()));
0061     connect(_menuHighlightStrong, SIGNAL(toggled(bool)), SLOT(updateChanged()));
0062     connect(_menuHighlightSubtle, SIGNAL(toggled(bool)), SLOT(updateChanged()));
0063     connect(_windowDragMode, SIGNAL(currentIndexChanged(int)), SLOT(updateChanged()));
0064 
0065     connect(_animationConfigWidget, SIGNAL(changed(bool)), SLOT(updateChanged()));
0066     connect(_animationConfigWidget, SIGNAL(layoutChanged()), SLOT(updateLayout()));
0067 }
0068 
0069 //__________________________________________________________________
0070 void StyleConfig::save(void)
0071 {
0072     StyleConfigData::setUseBackgroundGradient(_useBackgroundGradient->isChecked());
0073     StyleConfigData::setToolBarDrawItemSeparator(_toolBarDrawItemSeparator->isChecked());
0074     StyleConfigData::setSplitterProxyEnabled(_splitterProxyEnabled->isChecked());
0075     StyleConfigData::setMnemonicsMode(_mnemonicsMode->currentIndex());
0076     StyleConfigData::setViewDrawFocusIndicator(_viewDrawFocusIndicator->isChecked());
0077     StyleConfigData::setViewTriangularExpanderSize(triangularExpanderSize());
0078     StyleConfigData::setViewDrawTreeBranchLines(_viewDrawTreeBranchLines->isChecked());
0079     StyleConfigData::setScrollBarWidth(_scrollBarWidth->value());
0080     StyleConfigData::setScrollBarAddLineButtons(_scrollBarAddLineButtons->currentIndex());
0081     StyleConfigData::setScrollBarSubLineButtons(_scrollBarSubLineButtons->currentIndex());
0082     StyleConfigData::setMenuHighlightMode(menuMode());
0083     StyleConfigData::setWindowDragMode(_windowDragMode->currentIndex());
0084     StyleConfigData::setWindowDragEnabled(_windowDragMode->currentIndex() != StyleConfigData::WD_NONE);
0085 
0086     _animationConfigWidget->save();
0087 
0088     StyleConfigData::self()->save();
0089 
0090     // emit dbus signal
0091     QDBusMessage message(
0092         QDBusMessage::createSignal(QStringLiteral("/OxygenStyle"), QStringLiteral("org.kde.Oxygen.Style"), QStringLiteral("reparseConfiguration")));
0093     QDBusConnection::sessionBus().send(message);
0094 }
0095 
0096 //__________________________________________________________________
0097 void StyleConfig::defaults(void)
0098 {
0099     StyleConfigData::self()->setDefaults();
0100     load();
0101 }
0102 
0103 //__________________________________________________________________
0104 void StyleConfig::reset(void)
0105 {
0106     // reparse configuration
0107     StyleConfigData::self()->load();
0108 
0109     load();
0110 }
0111 
0112 //__________________________________________________________________
0113 bool StyleConfig::event(QEvent *event)
0114 {
0115     const bool result(QWidget::event(event));
0116     switch (event->type()) {
0117     case QEvent::Show:
0118     case QEvent::ShowToParent:
0119 
0120         // explicitly update minimum size from hint
0121         // this is needed to automatically resize the window to fit animations tab
0122         setMinimumSize(minimumSizeHint());
0123         break;
0124 
0125     default:
0126         break;
0127     }
0128 
0129     return result;
0130 }
0131 
0132 //__________________________________________________________________
0133 void StyleConfig::updateLayout(void)
0134 {
0135     const int delta = _animationConfigWidget->minimumSizeHint().height() - _animationConfigWidget->size().height();
0136     window()->setMinimumSize(QSize(window()->minimumSizeHint().width(), window()->size().height() + delta));
0137 }
0138 
0139 //__________________________________________________________________
0140 void StyleConfig::updateChanged()
0141 {
0142     bool modified(false);
0143 
0144     // check if any value was modified
0145     if (_useBackgroundGradient->isChecked() != StyleConfigData::useBackgroundGradient())
0146         modified = true;
0147     if (_toolBarDrawItemSeparator->isChecked() != StyleConfigData::toolBarDrawItemSeparator())
0148         modified = true;
0149     else if (_mnemonicsMode->currentIndex() != StyleConfigData::mnemonicsMode())
0150         modified = true;
0151     else if (_viewDrawTreeBranchLines->isChecked() != StyleConfigData::viewDrawTreeBranchLines())
0152         modified = true;
0153     else if (_scrollBarWidth->value() != StyleConfigData::scrollBarWidth())
0154         modified = true;
0155     else if (_scrollBarAddLineButtons->currentIndex() != StyleConfigData::scrollBarAddLineButtons())
0156         modified = true;
0157     else if (_scrollBarSubLineButtons->currentIndex() != StyleConfigData::scrollBarSubLineButtons())
0158         modified = true;
0159     else if (_splitterProxyEnabled->isChecked() != StyleConfigData::splitterProxyEnabled())
0160         modified = true;
0161     else if (menuMode() != StyleConfigData::menuHighlightMode())
0162         modified = true;
0163     else if (_viewDrawFocusIndicator->isChecked() != StyleConfigData::viewDrawFocusIndicator())
0164         modified = true;
0165     else if (triangularExpanderSize() != StyleConfigData::viewTriangularExpanderSize())
0166         modified = true;
0167     else if (_animationConfigWidget && _animationConfigWidget->isChanged())
0168         modified = true;
0169     else if (_windowDragMode->currentIndex() != StyleConfigData::windowDragMode())
0170         modified = true;
0171 
0172     emit changed(modified);
0173 }
0174 
0175 //__________________________________________________________________
0176 void StyleConfig::load(void)
0177 {
0178     _useBackgroundGradient->setChecked(StyleConfigData::useBackgroundGradient());
0179     _toolBarDrawItemSeparator->setChecked(StyleConfigData::toolBarDrawItemSeparator());
0180     _mnemonicsMode->setCurrentIndex(StyleConfigData::mnemonicsMode());
0181     _splitterProxyEnabled->setChecked(StyleConfigData::splitterProxyEnabled());
0182     _viewDrawTreeBranchLines->setChecked(StyleConfigData::viewDrawTreeBranchLines());
0183 
0184     _scrollBarWidth->setValue(qMin(SCROLLBAR_MAXIMUM_WIDTH, qMax(SCROLLBAR_MINIMUM_WIDTH, StyleConfigData::scrollBarWidth())));
0185 
0186     _scrollBarAddLineButtons->setCurrentIndex(StyleConfigData::scrollBarAddLineButtons());
0187     _scrollBarSubLineButtons->setCurrentIndex(StyleConfigData::scrollBarSubLineButtons());
0188 
0189     // menu highlight
0190     _menuHighlightDark->setChecked(StyleConfigData::menuHighlightMode() == StyleConfigData::MM_DARK);
0191     _menuHighlightStrong->setChecked(StyleConfigData::menuHighlightMode() == StyleConfigData::MM_STRONG);
0192     _menuHighlightSubtle->setChecked(StyleConfigData::menuHighlightMode() == StyleConfigData::MM_SUBTLE);
0193 
0194     _windowDragMode->setCurrentIndex(StyleConfigData::windowDragMode());
0195 
0196     _viewDrawFocusIndicator->setChecked(StyleConfigData::viewDrawFocusIndicator());
0197     switch (StyleConfigData::viewTriangularExpanderSize()) {
0198     case StyleConfigData::TE_TINY:
0199         _viewTriangularExpanderSize->setCurrentIndex(0);
0200         break;
0201     case StyleConfigData::TE_SMALL:
0202     default:
0203         _viewTriangularExpanderSize->setCurrentIndex(1);
0204         break;
0205     case StyleConfigData::TE_NORMAL:
0206         _viewTriangularExpanderSize->setCurrentIndex(2);
0207         break;
0208     }
0209 
0210     // animation config widget
0211     if (_animationConfigWidget)
0212         _animationConfigWidget->load();
0213 }
0214 
0215 //____________________________________________________________
0216 int StyleConfig::menuMode(void) const
0217 {
0218     if (_menuHighlightDark->isChecked())
0219         return StyleConfigData::MM_DARK;
0220     else if (_menuHighlightSubtle->isChecked())
0221         return StyleConfigData::MM_SUBTLE;
0222     else
0223         return StyleConfigData::MM_STRONG;
0224 }
0225 
0226 //____________________________________________________________
0227 int StyleConfig::triangularExpanderSize(void) const
0228 {
0229     switch (_viewTriangularExpanderSize->currentIndex()) {
0230     case 0:
0231         return StyleConfigData::TE_TINY;
0232     case 1:
0233     default:
0234         return StyleConfigData::TE_SMALL;
0235     case 2:
0236         return StyleConfigData::TE_NORMAL;
0237     }
0238 }
0239 }