From 398cef5f8fc452fb390445fae601f31d916d6777 Mon Sep 17 00:00:00 2001 From: weeman Date: Sun, 17 Aug 2025 13:01:26 +0200 Subject: [PATCH 1/2] Extract list of valid themes Signed-off-by: weeman --- src/UserSettingsPage.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp index 705a605b..3f348d61 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp @@ -25,6 +25,12 @@ #include "config/nheko.h" +QStringList themes{ + QStringLiteral("light"), + QStringLiteral("dark"), + QStringLiteral("system"), +}; + QSharedPointer UserSettings::instance_; UserSettings::UserSettings() @@ -640,7 +646,7 @@ UserSettings::setShowImage(ShowImage state) void UserSettings::setTheme(QString theme) { - if (theme == theme_) + if (theme == theme_ || !themes.contains(theme)) return; theme_ = theme; save(); @@ -1182,12 +1188,7 @@ UserSettingsModel::data(const QModelIndex &index, int role) const } else if (role == Value) { switch (index.row()) { case Theme: - return QStringList{ - QStringLiteral("light"), - QStringLiteral("dark"), - QStringLiteral("system"), - } - .indexOf(i->theme()); + return themes.indexOf(i->theme()); case ScaleFactor: return utils::scaleFactor(); case MessageHoverHighlight: @@ -1741,14 +1742,10 @@ UserSettingsModel::setData(const QModelIndex &index, const QVariant &value, int if (role == Value) { switch (index.row()) { case Theme: { - if (value == 0) { - i->setTheme("light"); - return true; - } else if (value == 1) { - i->setTheme("dark"); - return true; - } else if (value == 2) { - i->setTheme("system"); + auto idx = value.toInt(); + + if (idx >= 0 && idx < themes.size()) { + i->setTheme(themes[idx]); return true; } else return false; From ffaa12cc192fc6c14f6f9af6ce781cda63b7216a Mon Sep 17 00:00:00 2001 From: weeman Date: Sun, 17 Aug 2025 13:01:33 +0200 Subject: [PATCH 2/2] Add setTheme D-Bus API Signed-off-by: weeman --- src/dbus/NhekoDBusApi.cpp | 8 ++++++++ src/dbus/NhekoDBusApi.h | 3 +++ src/dbus/NhekoDBusBackend.cpp | 7 +++++++ src/dbus/NhekoDBusBackend.h | 2 ++ 4 files changed, 20 insertions(+) diff --git a/src/dbus/NhekoDBusApi.cpp b/src/dbus/NhekoDBusApi.cpp index c2c62eb7..1da550cf 100644 --- a/src/dbus/NhekoDBusApi.cpp +++ b/src/dbus/NhekoDBusApi.cpp @@ -170,6 +170,14 @@ setStatusMessage(const QString &message) interface.call(QDBus::NoBlock, QStringLiteral("setStatusMessage"), message); } +void +setTheme(const QString &theme) +{ + if (QDBusInterface interface{QStringLiteral(NHEKO_DBUS_SERVICE_NAME), QStringLiteral("/")}; + interface.isValid()) + interface.call(QDBus::NoBlock, QStringLiteral("setTheme"), theme); +} + } // nheko::dbus /** diff --git a/src/dbus/NhekoDBusApi.h b/src/dbus/NhekoDBusApi.h index 6acb2b65..74e6aeee 100644 --- a/src/dbus/NhekoDBusApi.h +++ b/src/dbus/NhekoDBusApi.h @@ -85,6 +85,9 @@ statusMessage(); //! Sets the user's status message (if supported by the homeserver). void setStatusMessage(const QString &message); +//! Sets the current theme (supported values: "light", "dark" or "system") +void +setTheme(const QString &theme); QDBusArgument & operator<<(QDBusArgument &arg, const RoomInfoItem &item); diff --git a/src/dbus/NhekoDBusBackend.cpp b/src/dbus/NhekoDBusBackend.cpp index 898286f8..9831d5e6 100644 --- a/src/dbus/NhekoDBusBackend.cpp +++ b/src/dbus/NhekoDBusBackend.cpp @@ -11,6 +11,7 @@ #include "Logging.h" #include "MainWindow.h" #include "MxcImageProvider.h" +#include "UserSettingsPage.h" #include "timeline/RoomlistModel.h" #include "timeline/TimelineModel.h" @@ -112,6 +113,12 @@ NhekoDBusBackend::setStatusMessage(const QString &message) ChatPage::instance()->setStatus(message); } +void +NhekoDBusBackend::setTheme(const QString &theme) +{ + UserSettings::instance()->setTheme(theme); +} + void NhekoDBusBackend::bringWindowToTop() const { diff --git a/src/dbus/NhekoDBusBackend.h b/src/dbus/NhekoDBusBackend.h index 79d396f8..66b239aa 100644 --- a/src/dbus/NhekoDBusBackend.h +++ b/src/dbus/NhekoDBusBackend.h @@ -40,6 +40,8 @@ public slots: Q_SCRIPTABLE QString statusMessage() const; //! Sets the user's status message. Q_SCRIPTABLE void setStatusMessage(const QString &message); + //! Sets the current theme (supported values: "light", "dark" or "system") + Q_SCRIPTABLE void setTheme(const QString &theme); private: void bringWindowToTop() const;