Qt 6.x
The Qt SDK
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
4
5#include <QtQuick/private/qquickabstractpaletteprovider_p.h>
6
8
9static bool notEq(const QPalette &p1, const QPalette &p2)
10{
11 return p1.resolveMask() != p2.resolveMask() || p1 != p2;
12}
13
15{
17}
18
19// Begin copy from qpalette.cpp
21{
22 Q_ASSERT(colorGroup < QPalette::NColorGroups);
23 // Exclude NoRole; that bit is used for AccentColor
24 return (qToUnderlying(QPalette::NColorRoles) - 1) * qToUnderlying(colorGroup);
25}
26
27// TODO: Share the function by private interface in qtbase
29 QPalette::ColorRole colorRole)
30{
31 // Map AccentColor into NoRole for resolving purposes
32 if (colorRole == QPalette::AccentColor)
33 colorRole = QPalette::NoRole;
34
35 return colorRole + colorRoleOffset(colorGroup);
36}
37
40 < sizeof(QPalette::ResolveMask) * CHAR_BIT,
41 "The resolve mask type is not wide enough to fit the entire bit mask.");
42// End copy from qpalette.cpp
43
45{
46public:
47 QPalette defaultPalette() const override { static QPalette p; return p; }
48};
49
50static std::default_delete<const QQuickAbstractPaletteProvider> defaultDeleter() { return {}; }
51
53 : m_paletteProvider(ProviderPtr(new DefaultPalettesProvider, defaultDeleter()))
54{
55}
56
58{
59 return m_resolvedPalette.color(adjustCg(group), role);
60}
61
63{
64 ensureRequestedPalette();
65 m_requestedPalette->setColor(g, r, c);
66
67 return updateInheritedPalette();
68}
69
71{
72 if (!m_requestedPalette.isAllocated())
73 return false;
74
75 QPalette::ResolveMask unsetResolveMask = 0;
76
78 group = m_requestedPalette->currentColorGroup();
79
80 if (group == QPalette::All) {
82 unsetResolveMask |= (QPalette::ResolveMask(1) << bitPosition(QPalette::ColorGroup(g), role));
83 } else {
84 unsetResolveMask = (QPalette::ResolveMask(1) << bitPosition(group, role));
85 }
86
87 m_requestedPalette->setResolveMask(m_requestedPalette->resolveMask() & ~unsetResolveMask);
88
89 return updateInheritedPalette();
90}
91
93{
94 if (!m_requestedPalette.isAllocated())
95 return false;
96
97 QPalette::ResolveMask unsetResolveMask = 0;
98
99 auto getResolveMask = [] (QPalette::ColorGroup group) {
101 for (int roleIndex = QPalette::WindowText; roleIndex < QPalette::NColorRoles; ++roleIndex) {
102 const auto cr = QPalette::ColorRole(roleIndex);
104 }
105 return mask;
106 };
107
109 group = m_requestedPalette->currentColorGroup();
110
111 if (group == QPalette::All) {
113 unsetResolveMask |= getResolveMask(QPalette::ColorGroup(g));
114 } else {
115 unsetResolveMask = getResolveMask(group);
116 }
117
118 m_requestedPalette->setResolveMask(m_requestedPalette->resolveMask() & ~unsetResolveMask);
119
120 return updateInheritedPalette();
121}
122
124{
125 m_requestedPalette.value() = std::move(p);
126 return updateInheritedPalette();
127}
128
130{
131 return m_resolvedPalette;
132}
133
135{
136 Q_ASSERT(m_paletteProvider);
137 return m_paletteProvider.get();
138}
139
141{
142 static const auto emptyDeleter = [](auto &&){};
143 m_paletteProvider = ProviderPtr(paletteProvider, emptyDeleter);
144}
145
148{
149 ensureRequestedPalette();
150
151 auto srcPalette = p.palette();
152 for (int roleIndex = QPalette::WindowText; roleIndex < QPalette::NColorRoles; ++roleIndex) {
153 const auto cr = QPalette::ColorRole(roleIndex);
154 if (srcPalette.isBrushSet(cg, cr)) {
155 m_requestedPalette->setBrush(cg, cr, srcPalette.brush(cg, cr));
156 }
157 }
158
159 return updateInheritedPalette();
160}
161
163{
164 return fromQPalette(QPalette());
165}
166
175{
176 m_lastInheritedPalette.value() = palette;
177 return doInheritPalette(palette);
178}
179
185bool QQuickPaletteColorProvider::doInheritPalette(const QPalette &palette)
186{
187 auto inheritedMask = m_requestedPalette.isAllocated() ? m_requestedPalette->resolveMask() | palette.resolveMask()
189 QPalette parentPalette = m_requestedPalette.isAllocated() ? m_requestedPalette->resolve(palette) : palette;
190 parentPalette.setResolveMask(inheritedMask);
191
192 auto tmpResolvedPalette = parentPalette.resolve(paletteProvider()->defaultPalette());
193 tmpResolvedPalette.setResolveMask(tmpResolvedPalette.resolveMask() | inheritedMask);
194
195 bool changed = notEq(tmpResolvedPalette, m_resolvedPalette);
196 if (changed)
197 std::swap(tmpResolvedPalette, m_resolvedPalette);
198
199 return changed;
200}
201
206bool QQuickPaletteColorProvider::updateInheritedPalette()
207{
208 // Use last inherited palette as parentPalette's fallbackPalette: it's useful when parentPalette doesn't exist.
209 const QPalette &p = m_lastInheritedPalette.isAllocated() ? m_lastInheritedPalette.value()
211 return doInheritPalette(paletteProvider()->parentPalette(p));
212}
213
214void QQuickPaletteColorProvider::ensureRequestedPalette()
215{
216 if (m_requestedPalette.isAllocated())
217 return;
218
219 m_requestedPalette.value() = QPalette();
220}
221
QPalette defaultPalette() const override
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
bool isAllocated() const
The QPalette class contains color groups for each widget state.
Definition qpalette.h:19
quint64 ResolveMask
Definition qpalette.h:112
const QColor & color(ColorGroup cg, ColorRole cr) const
Returns the color in the specified color group, used for the given color role.
Definition qpalette.h:66
void setBrush(ColorRole cr, const QBrush &brush)
Sets the brush for the given color role to the specified brush for all groups in the palette.
Definition qpalette.h:150
void setResolveMask(ResolveMask mask)
ResolveMask resolveMask() const
ColorGroup
\value Disabled \value Active \value Inactive \value Normal synonym for Active
Definition qpalette.h:48
@ Current
Definition qpalette.h:48
@ NColorGroups
Definition qpalette.h:48
QPalette resolve(const QPalette &other) const
Returns a new QPalette that is a union of this instance and other.
void setColor(ColorGroup cg, ColorRole cr, const QColor &color)
Sets the color in the specified color group, used for the given color role, to the specified solid co...
Definition qpalette.h:145
ColorGroup currentColorGroup() const
Returns the palette's current color group.
Definition qpalette.h:63
@ NColorRoles
Definition qpalette.h:59
@ WindowText
Definition qpalette.h:50
@ AccentColor
Definition qpalette.h:58
virtual QPalette defaultPalette() const =0
const QQuickAbstractPaletteProvider * paletteProvider() const
bool copyColorGroup(QPalette::ColorGroup cg, const QQuickPaletteColorProvider &p)
void setPaletteProvider(const QQuickAbstractPaletteProvider *paletteProvider)
bool resetColor(QPalette::ColorGroup group, QPalette::ColorRole role)
bool inheritPalette(const QPalette &palette)
bool setColor(QPalette::ColorGroup group, QPalette::ColorRole role, QColor color)
const QColor & color(QPalette::ColorGroup group, QPalette::ColorRole role) const
QPixmap p2
QPixmap p1
[0]
Combined button and popup list for selecting options.
GLboolean r
[2]
GLboolean GLuint group
GLboolean GLboolean g
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
const GLubyte * c
GLfloat GLfloat p
[1]
static constexpr QPalette::ResolveMask bitPosition(QPalette::ColorGroup colorGroup, QPalette::ColorRole colorRole)
Definition qpalette.cpp:23
static constexpr QPalette::ResolveMask bitPosition(QPalette::ColorGroup colorGroup, QPalette::ColorRole colorRole)
static std::default_delete< const QQuickAbstractPaletteProvider > defaultDeleter()
static constexpr QPalette::ResolveMask colorRoleOffset(QPalette::ColorGroup colorGroup)
static QPalette::ColorGroup adjustCg(QPalette::ColorGroup group)
static QT_BEGIN_NAMESPACE bool notEq(const QPalette &p1, const QPalette &p2)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
constexpr std::underlying_type_t< Enum > qToUnderlying(Enum e) noexcept