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

0001 /* This file is part of the KDE project
0002     SPDX-FileCopyrightText: 2016 René J.V. Bertin <rjvbertin@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "oxygenstylechooser.h"
0008 
0009 #ifdef Q_OS_WIN
0010 #include <QSysInfo>
0011 #endif
0012 #include <QAction>
0013 #include <QActionGroup>
0014 #include <QApplication>
0015 #include <QDebug>
0016 #include <QIcon>
0017 #include <QString>
0018 #include <QStyle>
0019 #include <QStyleFactory>
0020 
0021 #include <KConfigGroup>
0022 #include <KLocalizedString>
0023 #include <KSharedConfig>
0024 
0025 WidgetStyleChooser::WidgetStyleChooser(QWidget *parent)
0026     : QPushButton(parent)
0027     , m_widgetStyle(QString())
0028 {
0029 }
0030 
0031 KActionMenu *WidgetStyleChooser::createStyleSelectionMenu(const QString &text, const QString &selectedStyleName)
0032 {
0033     QIcon icon = QIcon::fromTheme(QStringLiteral("preferences-desktop-theme"));
0034     KActionMenu *stylesAction = new KActionMenu(icon, text, this);
0035     setText(text);
0036     if (!icon.isNull()) {
0037         setIcon(icon);
0038     }
0039     stylesAction->setToolTip(i18n("Select the application widget style"));
0040     stylesAction->setStatusTip(stylesAction->toolTip());
0041     QActionGroup *stylesGroup = new QActionGroup(stylesAction);
0042 
0043     QStringList availableStyles = QStyleFactory::keys();
0044     QString desktopStyle = QApplication::style()->objectName();
0045 
0046     m_widgetStyle = selectedStyleName;
0047     bool setStyle = false;
0048     if (m_widgetStyle.isEmpty()) {
0049         m_widgetStyle = desktopStyle;
0050     } else if (selectedStyleName.compare(desktopStyle, Qt::CaseInsensitive)) {
0051         setStyle = true;
0052     }
0053 
0054     for (const QString &style : std::as_const(availableStyles)) {
0055         QAction *a = new QAction(style, stylesGroup);
0056         a->setCheckable(true);
0057         a->setData(style);
0058         if (m_widgetStyle.compare(style, Qt::CaseInsensitive) == 0) {
0059             a->setChecked(true);
0060             if (setStyle) {
0061                 // selectedStyleName was not empty and the
0062                 // the style exists: activate it.
0063                 activateStyle(style);
0064             }
0065         }
0066         stylesAction->addAction(a);
0067     }
0068     connect(stylesGroup, &QActionGroup::triggered, this, [&](QAction *a) {
0069         activateStyle(a->data().toString());
0070     });
0071 
0072     setMenu(stylesAction->menu());
0073 
0074     return stylesAction;
0075 }
0076 
0077 QString WidgetStyleChooser::currentStyle() const
0078 {
0079     return m_widgetStyle;
0080 }
0081 
0082 void WidgetStyleChooser::activateStyle(const QString &styleName)
0083 {
0084     m_widgetStyle = styleName;
0085     QApplication::setStyle(QStyleFactory::create(m_widgetStyle));
0086 }