Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qquickpalettecolorprovider.cpp
Go to the documentation of this file.
1
// Copyright (C) 2020 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
#
include
"qquickpalettecolorprovider_p.h"
5
6
#
include
<
QtQuick
/
private
/
qquickabstractpaletteprovider_p
.
h
>
7
#
include
<
QtGui
/
private
/
qpalette_p
.
h
>
8
9
QT_BEGIN_NAMESPACE
10
11
static
bool
notEq
(
const
QPalette &p1,
const
QPalette &p2)
12
{
13
return
p1.resolveMask() != p2.resolveMask() || p1 != p2;
14
}
15
16
static
QPalette
::
ColorGroup
adjustCg
(QPalette::ColorGroup group)
17
{
18
return
group == QPalette::All ? QPalette::Active : group;
19
}
20
21
class
DefaultPalettesProvider
:
public
QQuickAbstractPaletteProvider
22
{
23
public
:
24
QPalette
defaultPalette
()
const
override
{
static
QPalette p;
return
p; }
25
};
26
27
static
std
::
default_delete
<
const
QQuickAbstractPaletteProvider
>
defaultDeleter
() {
return
{}; }
28
29
QQuickPaletteColorProvider::QQuickPaletteColorProvider()
30
: m_paletteProvider(ProviderPtr(
new
DefaultPalettesProvider, defaultDeleter()))
31
{
32
}
33
34
const
QColor &QQuickPaletteColorProvider::color(QPalette::ColorGroup group, QPalette::ColorRole role)
const
35
{
36
return
m_resolvedPalette.color(adjustCg(group), role);
37
}
38
39
bool
QQuickPaletteColorProvider::setColor(QPalette::ColorGroup g, QPalette::ColorRole r, QColor c)
40
{
41
ensureRequestedPalette();
42
m_requestedPalette->setColor(g, r, c);
43
44
return
updateInheritedPalette();
45
}
46
47
bool
QQuickPaletteColorProvider::resetColor(QPalette::ColorGroup group, QPalette::ColorRole role)
48
{
49
if
(!m_requestedPalette.isAllocated())
50
return
false
;
51
52
QPalette::ResolveMask unsetResolveMask = 0;
53
54
if
(group == QPalette::Current)
55
group = m_requestedPalette->currentColorGroup();
56
57
if
(group == QPalette::All) {
58
for
(
int
g = QPalette::Active; g < QPalette::NColorGroups; ++g)
59
unsetResolveMask |= (QPalette::ResolveMask(1) << QPalettePrivate::bitPosition(QPalette::ColorGroup(g), role));
60
}
else
{
61
unsetResolveMask = (QPalette::ResolveMask(1) << QPalettePrivate::bitPosition(group, role));
62
}
63
64
m_requestedPalette->setResolveMask(m_requestedPalette->resolveMask() & ~unsetResolveMask);
65
66
return
updateInheritedPalette();
67
}
68
69
bool
QQuickPaletteColorProvider::resetColor(QPalette::ColorGroup group)
70
{
71
if
(!m_requestedPalette.isAllocated())
72
return
false
;
73
74
QPalette::ResolveMask unsetResolveMask = 0;
75
76
auto
getResolveMask = [] (QPalette::ColorGroup group) {
77
QPalette::ResolveMask mask = 0;
78
for
(
int
roleIndex = QPalette::WindowText; roleIndex < QPalette::NColorRoles; ++roleIndex) {
79
const
auto
cr = QPalette::ColorRole(roleIndex);
80
mask |= (QPalette::ResolveMask(1) << QPalettePrivate::bitPosition(group, cr));
81
}
82
return
mask;
83
};
84
85
if
(group == QPalette::Current)
86
group = m_requestedPalette->currentColorGroup();
87
88
if
(group == QPalette::All) {
89
for
(
int
g = QPalette::Active; g < QPalette::NColorGroups; ++g)
90
unsetResolveMask |= getResolveMask(QPalette::ColorGroup(g));
91
}
else
{
92
unsetResolveMask = getResolveMask(group);
93
}
94
95
m_requestedPalette->setResolveMask(m_requestedPalette->resolveMask() & ~unsetResolveMask);
96
97
return
updateInheritedPalette();
98
}
99
100
bool
QQuickPaletteColorProvider::fromQPalette(QPalette p)
101
{
102
m_requestedPalette.value() = std::move(p);
103
return
updateInheritedPalette();
104
}
105
106
QPalette QQuickPaletteColorProvider::palette()
const
107
{
108
return
m_resolvedPalette;
109
}
110
111
const
QQuickAbstractPaletteProvider *QQuickPaletteColorProvider::paletteProvider()
const
112
{
113
Q_ASSERT(m_paletteProvider);
114
return
m_paletteProvider.get();
115
}
116
117
void
QQuickPaletteColorProvider::setPaletteProvider(
const
QQuickAbstractPaletteProvider *paletteProvider)
118
{
119
static
const
auto
emptyDeleter = [](
auto
&&){};
120
m_paletteProvider = ProviderPtr(paletteProvider, emptyDeleter);
121
}
122
123
bool
QQuickPaletteColorProvider::copyColorGroup(QPalette::ColorGroup cg,
124
const
QQuickPaletteColorProvider &p)
125
{
126
ensureRequestedPalette();
127
128
auto
srcPalette = p.palette();
129
for
(
int
roleIndex = QPalette::WindowText; roleIndex < QPalette::NColorRoles; ++roleIndex) {
130
const
auto
cr = QPalette::ColorRole(roleIndex);
131
if
(srcPalette.isBrushSet(cg, cr)) {
132
m_requestedPalette->setBrush(cg, cr, srcPalette.brush(cg, cr));
133
}
134
}
135
136
return
updateInheritedPalette();
137
}
138
139
bool
QQuickPaletteColorProvider::reset()
140
{
141
return
fromQPalette(QPalette());
142
}
143
144
/*! \internal
145
Merge the given \a palette with the existing requested palette, remember
146
that it is the inherited palette (in case updateInheritedPalette() is
147
called later), and update the stored palette (to be returned from
148
\l palette()) if the result is different. Returns whether the stored
149
palette got changed.
150
*/
151
bool
QQuickPaletteColorProvider::inheritPalette(
const
QPalette &palette)
152
{
153
m_lastInheritedPalette.value() = palette;
154
return
doInheritPalette(palette);
155
}
156
157
/*! \internal
158
Merge the given \a palette with the existing requested palette, and update
159
the stored palette (to be returned from \l palette()) if the result is
160
different. Returns whether the stored palette got changed.
161
*/
162
bool
QQuickPaletteColorProvider::doInheritPalette(
const
QPalette &palette)
163
{
164
auto
inheritedMask = m_requestedPalette.isAllocated() ? m_requestedPalette->resolveMask() | palette.resolveMask()
165
: palette.resolveMask();
166
// If a palette was set on this item, it should always win over the palette to be inherited from.
167
QPalette parentPalette = m_requestedPalette.isAllocated() ? m_requestedPalette->resolve(palette) : palette;
168
parentPalette.setResolveMask(inheritedMask);
169
170
auto
tmpResolvedPalette = parentPalette.resolve(paletteProvider()->defaultPalette());
171
tmpResolvedPalette.setResolveMask(tmpResolvedPalette.resolveMask() | inheritedMask);
172
173
bool
changed = notEq(tmpResolvedPalette, m_resolvedPalette);
174
if
(changed)
175
std::swap(tmpResolvedPalette, m_resolvedPalette);
176
177
return
changed;
178
}
179
180
/*! \internal
181
Update the stored palette (to be returned from \l palette()) from the
182
parent palette. Returns whether the stored palette got changed.
183
*/
184
bool
QQuickPaletteColorProvider::updateInheritedPalette()
185
{
186
// Use last inherited palette as parentPalette's fallbackPalette: it's useful when parentPalette doesn't exist.
187
const
QPalette &p = m_lastInheritedPalette.isAllocated() ? m_lastInheritedPalette.value()
188
: paletteProvider()->defaultPalette();
189
return
doInheritPalette(paletteProvider()->parentPalette(p));
190
}
191
192
void
QQuickPaletteColorProvider::ensureRequestedPalette()
193
{
194
if
(m_requestedPalette.isAllocated())
195
return
;
196
197
m_requestedPalette.value() = QPalette();
198
}
199
200
QT_END_NAMESPACE
DefaultPalettesProvider
Definition
qquickpalettecolorprovider.cpp:22
DefaultPalettesProvider::defaultPalette
QPalette defaultPalette() const override
Definition
qquickpalettecolorprovider.cpp:24
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
defaultDeleter
static std::default_delete< const QQuickAbstractPaletteProvider > defaultDeleter()
Definition
qquickpalettecolorprovider.cpp:27
adjustCg
static QPalette::ColorGroup adjustCg(QPalette::ColorGroup group)
Definition
qquickpalettecolorprovider.cpp:16
notEq
static QT_BEGIN_NAMESPACE bool notEq(const QPalette &p1, const QPalette &p2)
Definition
qquickpalettecolorprovider.cpp:11
qtdeclarative
src
quick
items
qquickpalettecolorprovider.cpp
Generated on
for Qt by
1.18.0