Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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#include <QtGui/private/qpalette_p.h>
7
9
10static bool notEq(const QPalette &p1, const QPalette &p2)
11{
12 return p1.resolveMask() != p2.resolveMask() || p1 != p2;
13}
14
19
21{
22public:
23 QPalette defaultPalette() const override { static QPalette p; return p; }
24};
25
26static std::default_delete<const QQuickAbstractPaletteProvider> defaultDeleter() { return {}; }
27
32
34{
35 return m_resolvedPalette.color(adjustCg(group), role);
36}
37
39{
40 ensureRequestedPalette();
41 m_requestedPalette->setColor(g, r, c);
42
43 return updateInheritedPalette();
44}
45
47{
48 if (!m_requestedPalette.isAllocated())
49 return false;
50
51 QPalette::ResolveMask unsetResolveMask = 0;
52
54 group = m_requestedPalette->currentColorGroup();
55
56 if (group == QPalette::All) {
59 } else {
60 unsetResolveMask = (QPalette::ResolveMask(1) << QPalettePrivate::bitPosition(group, role));
61 }
62
63 m_requestedPalette->setResolveMask(m_requestedPalette->resolveMask() & ~unsetResolveMask);
64
65 return updateInheritedPalette();
66}
67
69{
70 if (!m_requestedPalette.isAllocated())
71 return false;
72
73 QPalette::ResolveMask unsetResolveMask = 0;
74
75 auto getResolveMask = [] (QPalette::ColorGroup group) {
77 for (int roleIndex = QPalette::WindowText; roleIndex < QPalette::NColorRoles; ++roleIndex) {
78 const auto cr = QPalette::ColorRole(roleIndex);
80 }
81 return mask;
82 };
83
85 group = m_requestedPalette->currentColorGroup();
86
87 if (group == QPalette::All) {
89 unsetResolveMask |= getResolveMask(QPalette::ColorGroup(g));
90 } else {
91 unsetResolveMask = getResolveMask(group);
92 }
93
94 m_requestedPalette->setResolveMask(m_requestedPalette->resolveMask() & ~unsetResolveMask);
95
96 return updateInheritedPalette();
97}
98
100{
101 m_requestedPalette.value() = std::move(p);
102 return updateInheritedPalette();
103}
104
106{
107 return m_resolvedPalette;
108}
109
111{
112 Q_ASSERT(m_paletteProvider);
113 return m_paletteProvider.get();
114}
115
117{
118 static const auto emptyDeleter = [](auto &&){};
119 m_paletteProvider = ProviderPtr(paletteProvider, emptyDeleter);
120}
121
124{
125 ensureRequestedPalette();
126
127 auto srcPalette = p.palette();
128 for (int roleIndex = QPalette::WindowText; roleIndex < QPalette::NColorRoles; ++roleIndex) {
129 const auto cr = QPalette::ColorRole(roleIndex);
130 if (srcPalette.isBrushSet(cg, cr)) {
131 m_requestedPalette->setBrush(cg, cr, srcPalette.brush(cg, cr));
132 }
133 }
134
135 return updateInheritedPalette();
136}
137
142
151{
152 m_lastInheritedPalette.value() = palette;
153 return doInheritPalette(palette);
154}
155
161bool QQuickPaletteColorProvider::doInheritPalette(const QPalette &palette)
162{
163 auto inheritedMask = m_requestedPalette.isAllocated() ? m_requestedPalette->resolveMask() | palette.resolveMask()
165 QPalette parentPalette = m_requestedPalette.isAllocated() ? m_requestedPalette->resolve(palette) : palette;
166 parentPalette.setResolveMask(inheritedMask);
167
168 auto tmpResolvedPalette = parentPalette.resolve(paletteProvider()->defaultPalette());
169 tmpResolvedPalette.setResolveMask(tmpResolvedPalette.resolveMask() | inheritedMask);
170
171 bool changed = notEq(tmpResolvedPalette, m_resolvedPalette);
172 if (changed)
173 std::swap(tmpResolvedPalette, m_resolvedPalette);
174
175 return changed;
176}
177
182bool QQuickPaletteColorProvider::updateInheritedPalette()
183{
184 // Use last inherited palette as parentPalette's fallbackPalette: it's useful when parentPalette doesn't exist.
185 const QPalette &p = m_lastInheritedPalette.isAllocated() ? m_lastInheritedPalette.value()
187 return doInheritPalette(paletteProvider()->parentPalette(p));
188}
189
190void QQuickPaletteColorProvider::ensureRequestedPalette()
191{
192 if (m_requestedPalette.isAllocated())
193 return;
194
195 m_requestedPalette.value() = QPalette();
196}
197
QPalette defaultPalette() const override
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
bool isAllocated() const
static constexpr QPalette::ResolveMask bitPosition(QPalette::ColorGroup colorGroup, QPalette::ColorRole colorRole)
Definition qpalette_p.h:57
The QPalette class contains color groups for each widget state.
Definition qpalette.h:19
quint64 ResolveMask
Definition qpalette.h:113
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:67
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:151
void setResolveMask(ResolveMask mask)
ResolveMask resolveMask() const
Definition qpalette.cpp:999
ColorGroup
\value Disabled \value Active \value Inactive \value Normal synonym for Active
Definition qpalette.h:49
@ Current
Definition qpalette.h:49
@ NColorGroups
Definition qpalette.h:49
QPalette resolve(const QPalette &other) const
Returns a new QPalette that is a union of this instance and other.
Definition qpalette.cpp:963
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:146
ColorGroup currentColorGroup() const
Returns the palette's current color group.
Definition qpalette.h:64
@ NColorRoles
Definition qpalette.h:60
@ WindowText
Definition qpalette.h:51
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 std::default_delete< const QQuickAbstractPaletteProvider > defaultDeleter()
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