Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
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
5
6#include <QtQuick/private/qquickabstractpaletteprovider_p.h>
7#include <QtGui/private/qpalette_p.h>
8
10
11static bool notEq(const QPalette &p1, const QPalette &p2)
12{
13 return p1.resolveMask() != p2.resolveMask() || p1 != p2;
14}
15
16static QPalette::ColorGroup adjustCg(QPalette::ColorGroup group)
17{
18 return group == QPalette::All ? QPalette::Active : group;
19}
20
22{
23public:
24 QPalette defaultPalette() const override { static QPalette p; return p; }
25};
26
28
29QQuickPaletteColorProvider::QQuickPaletteColorProvider()
30 : m_paletteProvider(ProviderPtr(new DefaultPalettesProvider, defaultDeleter()))
31{
32}
33
34const QColor &QQuickPaletteColorProvider::color(QPalette::ColorGroup group, QPalette::ColorRole role) const
35{
36 return m_resolvedPalette.color(adjustCg(group), role);
37}
38
39bool 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
47bool 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
69bool 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
100bool QQuickPaletteColorProvider::fromQPalette(QPalette p)
101{
102 m_requestedPalette.value() = std::move(p);
103 return updateInheritedPalette();
104}
105
106QPalette QQuickPaletteColorProvider::palette() const
107{
108 return m_resolvedPalette;
109}
110
111const QQuickAbstractPaletteProvider *QQuickPaletteColorProvider::paletteProvider() const
112{
113 Q_ASSERT(m_paletteProvider);
114 return m_paletteProvider.get();
115}
116
117void QQuickPaletteColorProvider::setPaletteProvider(const QQuickAbstractPaletteProvider *paletteProvider)
118{
119 static const auto emptyDeleter = [](auto &&){};
120 m_paletteProvider = ProviderPtr(paletteProvider, emptyDeleter);
121}
122
123bool 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
139bool 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*/
151bool 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*/
162bool 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*/
184bool 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
192void QQuickPaletteColorProvider::ensureRequestedPalette()
193{
194 if (m_requestedPalette.isAllocated())
195 return;
196
197 m_requestedPalette.value() = QPalette();
198}
199
200QT_END_NAMESPACE
QPalette defaultPalette() const override
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)