initialstart: Add dark mode switch

This commit is contained in:
Devin Lin 2023-11-08 23:22:14 -08:00
parent 7fd6a1a8a7
commit 0347ac1453
6 changed files with 82 additions and 0 deletions

View file

@ -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

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name="kdeglobals"/>
<group name="General">
<entry name="colorScheme" key="ColorScheme" type="String">
<label>Color scheme name</label>
<default>BreezeLight</default>
</entry>
<entry name="accentColor" key="AccentColor" type="Color">
<label>Accent color</label>
<default>transparent</default>
</entry>
<entry name="lastUsedCustomAccentColor" key="LastUsedCustomAccentColor" type="Color">
<label>The last used custom accent color before user switched to wallpaper generated color or default color</label>
<default>transparent</default>
</entry>
<entry name="accentColorFromWallpaper" key="accentColorFromWallpaper" type="Bool">
<label>Whether accent color from wallpaper should be applied</label>
<default>false</default>
</entry>
</group>
</kcfg>

View file

@ -0,0 +1,7 @@
File=colorssettings.kcfg
ClassName=ColorsSettings
Mutators=true
DefaultValueGetters=true
GenerateProperties=true
ParentInConstructor=true
Notifiers=true

View file

@ -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;
}
}
}
}
}
}
}

View file

@ -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<int> reply = m_brightnessInterface->brightness();

View file

@ -9,6 +9,7 @@
#include <kscreen/config.h>
#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;