Kirigami2

basictheme.cpp
1/*
2 * SPDX-FileCopyrightText: 2017 Marco Martin <mart@kde.org>
3 * SPDX-FileCopyrightText: 2021 Arjen Hiemstra <ahiemstra@heimr.nl>
4 *
5 * SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7
8#include "basictheme_p.h"
9#include "styleselector.h"
10
11#include <QFile>
12#include <QGuiApplication>
13
14#include "kirigamiplatform_logging.h"
15
16namespace Kirigami
17{
18namespace Platform
19{
20
21BasicThemeDefinition::BasicThemeDefinition(QObject *parent)
22 : QObject(parent)
23{
24 defaultFont = qGuiApp->font();
25
26 smallFont = qGuiApp->font();
27 smallFont.setPointSize(smallFont.pointSize() - 2);
28}
29
30void BasicThemeDefinition::syncToQml(PlatformTheme *object)
31{
32 auto item = qobject_cast<QQuickItem *>(object->parent());
33 if (item && qmlAttachedPropertiesObject<PlatformTheme>(item, false) == object) {
34 Q_EMIT sync(item);
35 }
36}
37
38BasicThemeInstance::BasicThemeInstance(QObject *parent)
39 : QObject(parent)
40{
41}
42
43BasicThemeDefinition &BasicThemeInstance::themeDefinition(QQmlEngine *engine)
44{
45 if (m_themeDefinition) {
46 return *m_themeDefinition;
47 }
48
49 auto themeUrl = StyleSelector::componentUrl(QStringLiteral("Theme.qml"));
50 QQmlComponent component(engine);
51 component.loadUrl(themeUrl);
52
53 if (!component.isError()) {
54 auto result = component.create();
55 if (auto themeDefinition = qobject_cast<BasicThemeDefinition *>(result)) {
56 m_themeDefinition.reset(themeDefinition);
57 } else {
58 const auto errors = component.errors();
59 for (auto error : errors) {
60 qCWarning(KirigamiPlatform) << error.toString();
61 }
62
63 qCWarning(KirigamiPlatform) << "Invalid Theme file, using default Basic theme.";
64 m_themeDefinition = std::make_unique<BasicThemeDefinition>();
65 }
66 } else {
67 qCDebug(KirigamiPlatform) << "No Theme file found, using default Basic theme";
68 m_themeDefinition = std::make_unique<BasicThemeDefinition>();
69 }
70
71 connect(m_themeDefinition.get(), &BasicThemeDefinition::changed, this, &BasicThemeInstance::onDefinitionChanged);
72
73 return *m_themeDefinition;
74}
75
76void BasicThemeInstance::onDefinitionChanged()
77{
78 for (auto watcher : std::as_const(watchers)) {
79 watcher->sync();
80 }
81}
82
83Q_GLOBAL_STATIC(BasicThemeInstance, basicThemeInstance)
84
85BasicTheme::BasicTheme(QObject *parent)
86 : PlatformTheme(parent)
87{
88 basicThemeInstance()->watchers.append(this);
89
90 sync();
91}
92
93BasicTheme::~BasicTheme()
94{
95 basicThemeInstance()->watchers.removeOne(this);
96}
97
98void BasicTheme::sync()
99{
100 PlatformThemeChangeTracker tracker{this};
101
102 auto &definition = basicThemeInstance()->themeDefinition(qmlEngine(parent()));
103
104 switch (colorSet()) {
105 case BasicTheme::Button:
106 setTextColor(tint(definition.buttonTextColor));
107 setBackgroundColor(tint(definition.buttonBackgroundColor));
108 setAlternateBackgroundColor(tint(definition.buttonAlternateBackgroundColor));
109 setHoverColor(tint(definition.buttonHoverColor));
110 setFocusColor(tint(definition.buttonFocusColor));
111 break;
112 case BasicTheme::View:
113 setTextColor(tint(definition.viewTextColor));
114 setBackgroundColor(tint(definition.viewBackgroundColor));
115 setAlternateBackgroundColor(tint(definition.viewAlternateBackgroundColor));
116 setHoverColor(tint(definition.viewHoverColor));
117 setFocusColor(tint(definition.viewFocusColor));
118 break;
119 case BasicTheme::Selection:
120 setTextColor(tint(definition.selectionTextColor));
121 setBackgroundColor(tint(definition.selectionBackgroundColor));
122 setAlternateBackgroundColor(tint(definition.selectionAlternateBackgroundColor));
123 setHoverColor(tint(definition.selectionHoverColor));
124 setFocusColor(tint(definition.selectionFocusColor));
125 break;
126 case BasicTheme::Tooltip:
127 setTextColor(tint(definition.tooltipTextColor));
128 setBackgroundColor(tint(definition.tooltipBackgroundColor));
129 setAlternateBackgroundColor(tint(definition.tooltipAlternateBackgroundColor));
130 setHoverColor(tint(definition.tooltipHoverColor));
131 setFocusColor(tint(definition.tooltipFocusColor));
132 break;
133 case BasicTheme::Complementary:
134 setTextColor(tint(definition.complementaryTextColor));
135 setBackgroundColor(tint(definition.complementaryBackgroundColor));
136 setAlternateBackgroundColor(tint(definition.complementaryAlternateBackgroundColor));
137 setHoverColor(tint(definition.complementaryHoverColor));
138 setFocusColor(tint(definition.complementaryFocusColor));
139 break;
140 case BasicTheme::Window:
141 default:
142 setTextColor(tint(definition.textColor));
143 setBackgroundColor(tint(definition.backgroundColor));
144 setAlternateBackgroundColor(tint(definition.alternateBackgroundColor));
145 setHoverColor(tint(definition.hoverColor));
146 setFocusColor(tint(definition.focusColor));
147 break;
148 }
149
150 setDisabledTextColor(tint(definition.disabledTextColor));
151 setHighlightColor(tint(definition.highlightColor));
152 setHighlightedTextColor(tint(definition.highlightedTextColor));
153 setActiveTextColor(tint(definition.activeTextColor));
154 setActiveBackgroundColor(tint(definition.activeBackgroundColor));
155 setLinkColor(tint(definition.linkColor));
156 setLinkBackgroundColor(tint(definition.linkBackgroundColor));
157 setVisitedLinkColor(tint(definition.visitedLinkColor));
158 setVisitedLinkBackgroundColor(tint(definition.visitedLinkBackgroundColor));
159 setNegativeTextColor(tint(definition.negativeTextColor));
160 setNegativeBackgroundColor(tint(definition.negativeBackgroundColor));
161 setNeutralTextColor(tint(definition.neutralTextColor));
162 setNeutralBackgroundColor(tint(definition.neutralBackgroundColor));
163 setPositiveTextColor(tint(definition.positiveTextColor));
164 setPositiveBackgroundColor(tint(definition.positiveBackgroundColor));
165
166 setDefaultFont(definition.defaultFont);
167 setSmallFont(definition.smallFont);
168}
169
170bool BasicTheme::event(QEvent *event)
171{
172 if (event->type() == PlatformThemeEvents::DataChangedEvent::type) {
173 sync();
174 }
175
176 if (event->type() == PlatformThemeEvents::ColorSetChangedEvent::type) {
177 sync();
178 }
179
180 if (event->type() == PlatformThemeEvents::ColorGroupChangedEvent::type) {
181 sync();
182 }
183
184 if (event->type() == PlatformThemeEvents::ColorChangedEvent::type) {
185 basicThemeInstance()->themeDefinition(qmlEngine(parent())).syncToQml(this);
186 }
187
188 if (event->type() == PlatformThemeEvents::FontChangedEvent::type) {
189 basicThemeInstance()->themeDefinition(qmlEngine(parent())).syncToQml(this);
190 }
191
192 return PlatformTheme::event(event);
193}
194
195QColor BasicTheme::tint(const QColor &color)
196{
197 if (QQuickItem *item = qobject_cast<QQuickItem *>(parent()); item && !item->isEnabled()) {
198 return QColor::fromHsvF(color.hueF(), color.saturationF() * 0.5, color.valueF() * 0.8);
199 }
200 switch (colorGroup()) {
201 case PlatformTheme::Inactive:
202 return QColor::fromHsvF(color.hueF(), color.saturationF() * 0.5, color.valueF());
203 case PlatformTheme::Disabled:
204 return QColor::fromHsvF(color.hueF(), color.saturationF() * 0.5, color.valueF() * 0.8);
205 default:
206 return color;
207 }
208}
209
210}
211}
212
213#include "moc_basictheme_p.cpp"
AKONADI_CALENDAR_EXPORT KCalendarCore::Event::Ptr event(const Akonadi::Item &item)
KGUIADDONS_EXPORT QColor tint(const QColor &base, const QColor &color, qreal amount=0.3)
void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options=Notify)
QColor fromHsvF(float h, float s, float v, float a)
float hueF() const const
float saturationF() const const
float valueF() const const
bool isEnabled() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Fri Oct 11 2024 12:13:25 by doxygen 1.12.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.