From 0347ac1453476c20aab1c5c11b759431618dea13 Mon Sep 17 00:00:00 2001 From: Devin Lin Date: Wed, 8 Nov 2023 23:22:14 -0800 Subject: [PATCH] initialstart: Add dark mode switch --- initialstart/modules/prepare/CMakeLists.txt | 2 ++ .../modules/prepare/colorssettings.kcfg | 25 +++++++++++++++++++ .../modules/prepare/colorssettings.kcfgc | 7 ++++++ .../prepare/package/contents/ui/main.qml | 18 +++++++++++++ initialstart/modules/prepare/prepareutil.cpp | 22 ++++++++++++++++ initialstart/modules/prepare/prepareutil.h | 8 ++++++ 6 files changed, 82 insertions(+) create mode 100644 initialstart/modules/prepare/colorssettings.kcfg create mode 100644 initialstart/modules/prepare/colorssettings.kcfgc diff --git a/initialstart/modules/prepare/CMakeLists.txt b/initialstart/modules/prepare/CMakeLists.txt index 875e2a90..7c6226ab 100644 --- a/initialstart/modules/prepare/CMakeLists.txt +++ b/initialstart/modules/prepare/CMakeLists.txt @@ -9,6 +9,8 @@ set(prepareplugin_SRCS ${DBUS_SRCS} ) +kconfig_add_kcfg_files(prepareplugin_SRCS colorssettings.kcfgc GENERATE_MOC) + add_library(prepareplugin ${prepareplugin_SRCS}) target_link_libraries(prepareplugin diff --git a/initialstart/modules/prepare/colorssettings.kcfg b/initialstart/modules/prepare/colorssettings.kcfg new file mode 100644 index 00000000..700d803d --- /dev/null +++ b/initialstart/modules/prepare/colorssettings.kcfg @@ -0,0 +1,25 @@ + + + + + + + BreezeLight + + + + transparent + + + + transparent + + + + false + + + diff --git a/initialstart/modules/prepare/colorssettings.kcfgc b/initialstart/modules/prepare/colorssettings.kcfgc new file mode 100644 index 00000000..8de459b1 --- /dev/null +++ b/initialstart/modules/prepare/colorssettings.kcfgc @@ -0,0 +1,7 @@ +File=colorssettings.kcfg +ClassName=ColorsSettings +Mutators=true +DefaultValueGetters=true +GenerateProperties=true +ParentInConstructor=true +Notifiers=true diff --git a/initialstart/modules/prepare/package/contents/ui/main.qml b/initialstart/modules/prepare/package/contents/ui/main.qml index bb30374d..794610e3 100644 --- a/initialstart/modules/prepare/package/contents/ui/main.qml +++ b/initialstart/modules/prepare/package/contents/ui/main.qml @@ -113,6 +113,24 @@ Item { onCurrentValueChanged: Prepare.PrepareUtil.scaling = parseInt(currentValue.substring(0, currentValue.length - 1)); } } + + FormCard.FormCard { + id: darkThemeCard + maximumWidth: root.cardWidth + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + + FormCard.FormSwitchDelegate { + id: darkThemeSwitch + text: i18n("Dark Theme") + checked: Prepare.PrepareUtil.usingDarkTheme + onCheckedChanged: { + if (checked !== Prepare.PrepareUtil.usingDarkTheme) { + Prepare.PrepareUtil.usingDarkTheme = checked; + } + } + } + } } } } diff --git a/initialstart/modules/prepare/prepareutil.cpp b/initialstart/modules/prepare/prepareutil.cpp index 09c802d9..7686d8cd 100644 --- a/initialstart/modules/prepare/prepareutil.cpp +++ b/initialstart/modules/prepare/prepareutil.cpp @@ -13,6 +13,7 @@ PrepareUtil::PrepareUtil(QObject *parent) : QObject{parent} + , m_colorsSettings{new ColorsSettings(this)} { m_brightnessInterface = new org::kde::Solid::PowerManagement::Actions::BrightnessControl(QStringLiteral("org.kde.Solid.PowerManagement"), @@ -57,6 +58,9 @@ PrepareUtil::PrepareUtil(QObject *parent) connect(m_brightnessInterfaceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, [this]() -> void { Q_EMIT brightnessAvailableChanged(); }); + + // set property initially + m_usingDarkTheme = m_colorsSettings->colorScheme() == "BreezeDark"; } int PrepareUtil::scaling() const @@ -109,6 +113,24 @@ bool PrepareUtil::brightnessAvailable() const return m_brightnessInterface->isValid(); } +bool PrepareUtil::usingDarkTheme() const +{ + return m_usingDarkTheme; +} + +void PrepareUtil::setUsingDarkTheme(bool usingDarkTheme) +{ + // use plasma-apply-colorscheme since it has logic for notifying the shell of changes + if (usingDarkTheme) { + QProcess::execute("plasma-apply-colorscheme", {QStringLiteral("BreezeDark")}); + } else { + QProcess::execute("plasma-apply-colorscheme", {QStringLiteral("BreezeLight")}); + } + + m_usingDarkTheme = usingDarkTheme; + Q_EMIT usingDarkThemeChanged(); +} + void PrepareUtil::fetchBrightness() { QDBusPendingReply reply = m_brightnessInterface->brightness(); diff --git a/initialstart/modules/prepare/prepareutil.h b/initialstart/modules/prepare/prepareutil.h index b4b0781a..e42170ed 100644 --- a/initialstart/modules/prepare/prepareutil.h +++ b/initialstart/modules/prepare/prepareutil.h @@ -9,6 +9,7 @@ #include #include "brightnesscontrolinterface.h" +#include "colorssettings.h" class PrepareUtil : public QObject { @@ -18,6 +19,7 @@ class PrepareUtil : public QObject Q_PROPERTY(int brightness READ brightness WRITE setBrightness NOTIFY brightnessChanged); Q_PROPERTY(int maxBrightness READ maxBrightness NOTIFY maxBrightnessChanged) Q_PROPERTY(bool brightnessAvailable READ brightnessAvailable NOTIFY brightnessAvailableChanged) + Q_PROPERTY(bool usingDarkTheme READ usingDarkTheme WRITE setUsingDarkTheme NOTIFY usingDarkThemeChanged) public: PrepareUtil(QObject *parent = nullptr); @@ -34,11 +36,15 @@ public: bool brightnessAvailable() const; + bool usingDarkTheme() const; + void setUsingDarkTheme(bool usingDarkTheme); + Q_SIGNALS: void scalingChanged(); void brightnessChanged(); void maxBrightnessChanged(); void brightnessAvailableChanged(); + void usingDarkThemeChanged(); private Q_SLOTS: void fetchBrightness(); @@ -48,7 +54,9 @@ private: int m_scaling; int m_brightness; int m_maxBrightness; + bool m_usingDarkTheme; + ColorsSettings *m_colorsSettings; KScreen::ConfigPtr m_config; org::kde::Solid::PowerManagement::Actions::BrightnessControl *m_brightnessInterface; QDBusServiceWatcher *m_brightnessInterfaceWatcher;