From cc753e1866850658db9d5eb3ea5399dfd07a112a Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Mon, 12 Jan 2026 18:35:59 +0100 Subject: [PATCH] Add ThemeManager It can listen to system changes and update the current theme, widgets can use it to get the current theme. --- common/themes/theme_manager.cpp | 50 +++++++++++++++++++++++++++++++++ common/themes/theme_manager.h | 37 ++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 common/themes/theme_manager.cpp create mode 100644 common/themes/theme_manager.h diff --git a/common/themes/theme_manager.cpp b/common/themes/theme_manager.cpp new file mode 100644 index 00000000..70c4d075 --- /dev/null +++ b/common/themes/theme_manager.cpp @@ -0,0 +1,50 @@ +#include "theme_manager.h" + +#include "theme.h" + +#include +#include + +ThemeManager::ThemeManager() +{ +} + +ThemeManager &ThemeManager::instance() +{ + static ThemeManager instance; + return instance; +} + +void ThemeManager::initialize() +{ + auto *styleHints = qGuiApp->styleHints(); + + auto colorScheme = styleHints->colorScheme(); + + // TODO: settings are needed to decide what theme to use + auto applyColorScheme = [this](Qt::ColorScheme scheme) { + setTheme(scheme == Qt::ColorScheme::Dark ? ThemeId::Dark : ThemeId::Light); + }; + + applyColorScheme(colorScheme); + + connect(styleHints, &QStyleHints::colorSchemeChanged, this, applyColorScheme, Qt::QueuedConnection); +} + +void ThemeManager::setTheme(ThemeId themeId) +{ + if (this->themeId == themeId) { + return; + } + + this->themeId = themeId; + + updateCurrentTheme(); + + emit themeChanged(); +} + +void ThemeManager::updateCurrentTheme() +{ + // TODO +} diff --git a/common/themes/theme_manager.h b/common/themes/theme_manager.h new file mode 100644 index 00000000..8bac2dad --- /dev/null +++ b/common/themes/theme_manager.h @@ -0,0 +1,37 @@ +#ifndef THEME_MANAGER_H +#define THEME_MANAGER_H + +#include "theme.h" +#include "theme_id.h" + +#include + +class ThemeManager : public QObject +{ + Q_OBJECT +public: + static ThemeManager &instance(); + + ThemeManager(const ThemeManager &) = delete; + ThemeManager &operator=(const ThemeManager &) = delete; + ThemeManager(ThemeManager &&) = delete; + ThemeManager &operator=(ThemeManager &&) = delete; + + void initialize(); + + void setTheme(ThemeId themeId); + + const Theme &getCurrentTheme() const { return currentTheme; } + +signals: + void themeChanged(); + +private: + explicit ThemeManager(); + ThemeId themeId = ThemeId::Classic; + Theme currentTheme; + + void updateCurrentTheme(); +}; + +#endif // THEME_MANAGER_H