Kirigami2

units.cpp
1/*
2 * SPDX-FileCopyrightText: 2020 Jonah BrĂ¼chert <jbb@kaidan.im>
3 * SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
4 *
5 * SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7
8#include "units.h"
9
10#include <QFont>
11#include <QFontMetrics>
12#include <QGuiApplication>
13#include <QQmlComponent>
14#include <QQmlEngine>
15#include <QQuickStyle>
16#include <QStyleHints>
17
18#include <chrono>
19#include <cmath>
20
21#include "kirigamiplatform_logging.h"
22#include "platformpluginfactory.h"
23
24namespace Kirigami
25{
26namespace Platform
27{
28
29class UnitsPrivate
30{
31 Q_DISABLE_COPY(UnitsPrivate)
32
33public:
34 explicit UnitsPrivate(Units *units)
35 // Cache font so we don't have to go through QVariant and property every time
36 : fontMetrics(QFontMetricsF(QGuiApplication::font()))
37 , gridUnit(std::ceil(fontMetrics.height()))
38 , smallSpacing(4)
39 , mediumSpacing(6)
40 , largeSpacing(8)
41 , veryLongDuration(400)
42 , longDuration(200)
43 , shortDuration(100)
44 , veryShortDuration(50)
45 , humanMoment(2000)
46 , toolTipDelay(700)
47 , iconSizes(new IconSizes(units))
48 {
49 }
50
51 // Font metrics used for Units.
52 // TextMetrics uses QFontMetricsF internally, so this should do the same
53 QFontMetricsF fontMetrics;
54
55 // units
56 int gridUnit;
57 int smallSpacing;
58 int mediumSpacing;
59 int largeSpacing;
60
61 // durations
62 int veryLongDuration;
63 int longDuration;
64 int shortDuration;
65 int veryShortDuration;
66 int humanMoment;
67 int toolTipDelay;
68
69 IconSizes *const iconSizes;
70
71 // To prevent overriding custom set units if the font changes
72 bool customUnitsSet = false;
73};
74
75Units::~Units() = default;
76
77Units::Units(QObject *parent)
78 : QObject(parent)
79 , d(std::make_unique<UnitsPrivate>(this))
80{
81 qGuiApp->installEventFilter(this);
82}
83
84int Units::gridUnit() const
85{
86 return d->gridUnit;
87}
88
89void Units::setGridUnit(int size)
90{
91 if (d->gridUnit == size) {
92 return;
93 }
94
95 d->gridUnit = size;
96 d->customUnitsSet = true;
97 Q_EMIT gridUnitChanged();
98}
99
100int Units::smallSpacing() const
101{
102 return d->smallSpacing;
103}
104
105void Units::setSmallSpacing(int size)
106{
107 if (d->smallSpacing == size) {
108 return;
109 }
110
111 d->smallSpacing = size;
112 d->customUnitsSet = true;
113 Q_EMIT smallSpacingChanged();
114}
115
116int Units::mediumSpacing() const
117{
118 return d->mediumSpacing;
119}
120
121void Units::setMediumSpacing(int size)
122{
123 if (d->mediumSpacing == size) {
124 return;
125 }
126
127 d->mediumSpacing = size;
128 d->customUnitsSet = true;
129 Q_EMIT mediumSpacingChanged();
130}
131
132int Units::largeSpacing() const
133{
134 return d->largeSpacing;
135}
136
137void Units::setLargeSpacing(int size)
138{
139 if (d->largeSpacing) {
140 return;
141 }
142
143 d->largeSpacing = size;
144 d->customUnitsSet = true;
145 Q_EMIT largeSpacingChanged();
146}
147
148int Units::veryLongDuration() const
149{
150 return d->veryLongDuration;
151}
152
153void Units::setVeryLongDuration(int duration)
154{
155 if (d->veryLongDuration == duration) {
156 return;
157 }
158
159 d->veryLongDuration = duration;
160 Q_EMIT veryLongDurationChanged();
161}
162
163int Units::longDuration() const
164{
165 return d->longDuration;
166}
167
168void Units::setLongDuration(int duration)
169{
170 if (d->longDuration == duration) {
171 return;
172 }
173
174 d->longDuration = duration;
175 Q_EMIT longDurationChanged();
176}
177
178int Units::shortDuration() const
179{
180 return d->shortDuration;
181}
182
183void Units::setShortDuration(int duration)
184{
185 if (d->shortDuration == duration) {
186 return;
187 }
188
189 d->shortDuration = duration;
190 Q_EMIT shortDurationChanged();
191}
192
193int Units::veryShortDuration() const
194{
195 return d->veryShortDuration;
196}
197
198void Units::setVeryShortDuration(int duration)
199{
200 if (d->veryShortDuration == duration) {
201 return;
202 }
203
204 d->veryShortDuration = duration;
205 Q_EMIT veryShortDurationChanged();
206}
207
208int Units::humanMoment() const
209{
210 return d->humanMoment;
211}
212
213void Units::setHumanMoment(int duration)
214{
215 if (d->humanMoment == duration) {
216 return;
217 }
218
219 d->humanMoment = duration;
220 Q_EMIT humanMomentChanged();
221}
222
223int Units::toolTipDelay() const
224{
225 return d->toolTipDelay;
226}
227
228void Units::setToolTipDelay(int delay)
229{
230 if (d->toolTipDelay == delay) {
231 return;
232 }
233
234 d->toolTipDelay = delay;
235 Q_EMIT toolTipDelayChanged();
236}
237
238Units *Units::create(QQmlEngine *qmlEngine, [[maybe_unused]] QJSEngine *jsEngine)
239{
240#ifndef KIRIGAMI_BUILD_TYPE_STATIC
241 const QString pluginName = qmlEngine->property("_kirigamiTheme").toString();
242
243 auto plugin = PlatformPluginFactory::findPlugin(pluginName);
244 if (!plugin && !pluginName.isEmpty()) {
245 plugin = PlatformPluginFactory::findPlugin();
246 }
247
248 if (plugin) {
249 return plugin->createUnits(qmlEngine);
250 }
251#endif
252 // Fall back to the default units implementation
253 return new Units(qmlEngine);
254}
255
256bool Units::eventFilter([[maybe_unused]] QObject *watched, QEvent *event)
257{
258 if (event->type() == QEvent::ApplicationFontChange) {
259 d->fontMetrics = QFontMetricsF(qGuiApp->font());
260
261 if (d->customUnitsSet) {
262 return false;
263 }
264
265 d->gridUnit = std::ceil(d->fontMetrics.height());
266 Q_EMIT gridUnitChanged();
267 Q_EMIT d->iconSizes->sizeForLabelsChanged();
268 }
269 return false;
270}
271
272IconSizes *Units::iconSizes() const
273{
274 return d->iconSizes;
275}
276
277IconSizes::IconSizes(Units *units)
278 : QObject(units)
279 , m_units(units)
280{
281}
282
283int IconSizes::roundedIconSize(int size) const
284{
285 if (size < 16) {
286 return size;
287 }
288
289 if (size < 22) {
290 return 16;
291 }
292
293 if (size < 32) {
294 return 22;
295 }
296
297 if (size < 48) {
298 return 32;
299 }
300
301 if (size < 64) {
302 return 48;
303 }
304
305 return size;
306}
307
308int IconSizes::sizeForLabels() const
309{
310 // gridUnit is the height of textMetrics
311 return roundedIconSize(m_units->d->fontMetrics.height());
312}
313
314int IconSizes::small() const
315{
316 return 16;
317}
318
319int IconSizes::smallMedium() const
320{
321 return 22;
322}
323
324int IconSizes::medium() const
325{
326 return 32;
327}
328
329int IconSizes::large() const
330{
331 return 48;
332}
333
334int IconSizes::huge() const
335{
336 return 64;
337}
338
339int IconSizes::enormous() const
340{
341 return 128;
342}
343}
344}
345
346#include "moc_units.cpp"
ApplicationFontChange
Q_EMITQ_EMIT
virtual bool event(QEvent *e)
virtual bool eventFilter(QObject *watched, QEvent *event)
void installEventFilter(QObject *filterObj)
QVariant property(const char *name) const const
bool isEmpty() const const
QString toString() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:18:46 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.