Krita Source Code Documentation
Loading...
Searching...
No Matches
KisTheme.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#include "KisTheme.h"
7#include <QApplication>
9#include <lager/state.hpp>
10
11namespace {
12auto getForeground = [](KColorScheme::ForegroundRole id) { return lager::lenses::getset(
13 [id](const KColorScheme &value) -> QColor {
14 return value.foreground(id).color();
15 }, [id](KColorScheme value, const QColor &color) -> KColorScheme {return value;}
16 );
17};
18
19auto getBackground = [](KColorScheme::BackgroundRole id) { return lager::lenses::getset(
20 [id](const KColorScheme &value) -> QColor {
21 return value.background(id).color();
22 }, [id](KColorScheme value, const QColor &color) -> KColorScheme {return value;}
23 );
24};
25
26auto getDecorations = [](KColorScheme::DecorationRole id) { return lager::lenses::getset(
27 [id](const KColorScheme &value) -> QColor {
28 return value.decoration(id).color();
29 }, [id](KColorScheme value, const QColor &color) -> KColorScheme {return value;}
30 );
31};
32
33auto getShade = [](KColorScheme::ShadeRole id) { return lager::lenses::getset(
34 [id](const KColorScheme &value) -> QColor {
35 return value.shade(id);
36 }, [id](KColorScheme value, const QColor &color) -> KColorScheme {return value;}
37 );
38};
39}
40
41
43 : QObject(parent)
44 , m_set(_set)
45 , m_active(KColorScheme(QPalette::Active, m_set))
46 , m_inactive(KColorScheme(QPalette::Inactive, m_set))
47 , m_disabled(KColorScheme(QPalette::Disabled, m_set))
48 , scheme(lager::make_state(KColorScheme(QPalette::Active, _set), lager::automatic_tag{}))
49 , LAGER_QT(textColor) {scheme.zoom(getForeground(KColorScheme::NormalText))}
50 , LAGER_QT(disabledTextColor) {scheme.zoom(getForeground(KColorScheme::InactiveText))}
51 , LAGER_QT(activeTextColor) {scheme.zoom(getForeground(KColorScheme::ActiveText))}
52 , LAGER_QT(linkColor) {scheme.zoom(getForeground(KColorScheme::LinkText))}
53 , LAGER_QT(visitedLinkColor) {scheme.zoom(getForeground(KColorScheme::VisitedText))}
54 , LAGER_QT(negativeTextColor) {scheme.zoom(getForeground(KColorScheme::NegativeText))}
55 , LAGER_QT(neutralTextColor) {scheme.zoom(getForeground(KColorScheme::NeutralText))}
56 , LAGER_QT(positiveTextColor) {scheme.zoom(getForeground(KColorScheme::PositiveText))}
57 , LAGER_QT(backgroundColor) {scheme.zoom(getBackground(KColorScheme::NormalBackground))}
58 , LAGER_QT(activeBackgroundColor) {scheme.zoom(getBackground(KColorScheme::ActiveBackground))}
59 , LAGER_QT(linkBackgroundColor) {scheme.zoom(getBackground(KColorScheme::LinkBackground))}
60 , LAGER_QT(visitedLinkBackgroundColor) {scheme.zoom(getBackground(KColorScheme::VisitedBackground))}
61 , LAGER_QT(negativeBackgroundColor) {scheme.zoom(getBackground(KColorScheme::NegativeBackground))}
62 , LAGER_QT(neutralBackgroundColor) {scheme.zoom(getBackground(KColorScheme::NeutralBackground))}
63 , LAGER_QT(positiveBackgroundColor) {scheme.zoom(getBackground(KColorScheme::PositiveBackground))}
64 , LAGER_QT(alternateBackgroundColor) {scheme.zoom(getBackground(KColorScheme::AlternateBackground))}
65 , LAGER_QT(focusColor) {scheme.zoom(getDecorations(KColorScheme::FocusColor))}
66 , LAGER_QT(hoverColor) {scheme.zoom(getDecorations(KColorScheme::HoverColor))}
67 , LAGER_QT(lightShadeColor) {scheme.zoom(getShade(KColorScheme::LightShade))}
68 , LAGER_QT(midLightShadeColor) {scheme.zoom(getShade(KColorScheme::MidlightShade))}
69 , LAGER_QT(midShadeColor) {scheme.zoom(getShade(KColorScheme::MidShade))}
70 , LAGER_QT(darkShadeColor) {scheme.zoom(getShade(KColorScheme::DarkShade))}
71 , LAGER_QT(shadowShadeColor) {scheme.zoom(getShade(KColorScheme::ShadowShade))}
72{
73 connect(this, SIGNAL(stateChanged()), this, SLOT(updateState()));
74 lager::watch(scheme, std::bind(&KisThemeColorGroup::schemeChanged, this));
75}
76
80
81void KisThemeColorGroup::updateColorScheme(const QString filename)
82{
83 KSharedConfigPtr config = KSharedConfig::openConfig(filename);
84 m_active = KColorScheme(QPalette::Active, m_set, config);
85 m_inactive = KColorScheme(QPalette::Inactive, m_set, config);
86 m_disabled = KColorScheme(QPalette::Disabled, m_set, config);
87
89}
90
92{
93 if (m_state == QPalette::ColorGroup(newState)) return;
94 m_state = QPalette::ColorGroup(newState);
95 Q_EMIT stateChanged();
96}
97
99{
100 return int(m_state);
101}
102
104{
105 if (m_state == QPalette::Inactive) {
106 scheme.set(m_inactive);
107 } else if (m_state == QPalette::Disabled) {
108 scheme.set(m_disabled);
109 } else {
110 scheme.set(m_active);
111 }
112}
113
114KisTheme::KisTheme(QObject *parent)
115 : QObject(parent)
116 , viewModel(KisThemeColorGroup(KColorScheme::View, this))
117 , windowModel(KisThemeColorGroup(KColorScheme::Window, this))
118 , buttonModel(KisThemeColorGroup(KColorScheme::Button, this))
119 , selectionModel(KisThemeColorGroup(KColorScheme::Selection, this))
120 , tooltipModel(KisThemeColorGroup(KColorScheme::Tooltip, this))
121{
122 connect(KisConfigNotifier::instance(), SIGNAL(signalColorThemeChanged(QString)), this, SLOT(slotUpdateThemes()));
123
124 connect(&viewModel, SIGNAL(schemeChanged()), this, SIGNAL(viewChanged()));
125 connect(&windowModel, SIGNAL(schemeChanged()), this, SIGNAL(windowChanged()));
126 connect(&buttonModel, SIGNAL(schemeChanged()), this, SIGNAL(buttonChanged()));
127 connect(&selectionModel, SIGNAL(schemeChanged()), this, SIGNAL(selectionChanged()));
128 connect(&tooltipModel, SIGNAL(schemeChanged()), this, SIGNAL(tooltipChanged()));
129 slotUpdateThemes();
130}
131
133{
134 return &this->viewModel;
135}
136
138{
139 return &this->windowModel;
140}
141
143{
144 return &this->buttonModel;
145}
146
151
153{
154 return &this->tooltipModel;
155}
156
158{
159 const QString filename = qApp->property("KDE_COLOR_SCHEME_PATH").toString();
160
166}
167
168
float value(const T *src, size_t ch)
LAGER_QT(disabledTextColor)
Definition KisTheme.cpp:50
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
static KisConfigNotifier * instance()
KColorScheme::ColorSet m_set
Definition KisTheme.h:78
KisThemeColorGroup(KColorScheme::ColorSet _set=KColorScheme::View, QObject *parent=nullptr)
Definition KisTheme.cpp:42
void setState(int newState)
Definition KisTheme.cpp:91
KColorScheme m_active
Definition KisTheme.h:81
QPalette::ColorGroup m_state
Definition KisTheme.h:79
lager::cursor< KColorScheme > scheme
Definition KisTheme.h:28
KColorScheme m_disabled
Definition KisTheme.h:83
void updateColorScheme(const QString filename)
Definition KisTheme.cpp:81
KColorScheme m_inactive
Definition KisTheme.h:82
KisThemeColorGroup tooltipModel
Definition KisTheme.h:111
NOTIFY viewChanged()) Q_PROPERTY(KisThemeColorGroup *window READ window() NOTIFY windowChanged()) Q_PROPERTY(KisThemeColorGroup *button READ button() NOTIFY buttonChanged()) Q_PROPERTY(KisThemeColorGroup *selection READ selection() NOTIFY selectionChanged()) Q_PROPERTY(KisThemeColorGroup *tooltip READ tooltip() NOTIFY tooltipChanged()) public KisThemeColorGrou viewModel)
Definition KisTheme.h:97
KisThemeColorGroup buttonModel
Definition KisTheme.h:109
KisThemeColorGroup * window()
Definition KisTheme.cpp:137
KisThemeColorGroup * button()
Definition KisTheme.cpp:142
KisThemeColorGroup selectionModel
Definition KisTheme.h:110
KisThemeColorGroup windowModel
Definition KisTheme.h:108
KisThemeColorGroup * selection()
Definition KisTheme.cpp:147
KisThemeColorGroup * view
Definition KisTheme.h:97
KisThemeColorGroup * tooltip()
Definition KisTheme.cpp:152
void slotUpdateThemes()
Definition KisTheme.cpp:157
Definition View.h:25