6#include <QtQuick/private/qquickabstractpaletteprovider_p.h>
7#include <QtGui/private/qpalette_p.h>
11static bool notEq(
const QPalette &p1,
const QPalette &p2)
13 return p1.resolveMask() != p2.resolveMask() || p1 != p2;
18 return group == QPalette::All ? QPalette::Active : group;
29QQuickPaletteColorProvider::QQuickPaletteColorProvider()
30 : m_paletteProvider(ProviderPtr(
new DefaultPalettesProvider, defaultDeleter()))
34const QColor &QQuickPaletteColorProvider::color(QPalette::ColorGroup group, QPalette::ColorRole role)
const
36 return m_resolvedPalette.color(adjustCg(group), role);
39bool QQuickPaletteColorProvider::setColor(QPalette::ColorGroup g, QPalette::ColorRole r, QColor c)
41 ensureRequestedPalette();
42 m_requestedPalette->setColor(g, r, c);
44 return updateInheritedPalette();
47bool QQuickPaletteColorProvider::resetColor(QPalette::ColorGroup group, QPalette::ColorRole role)
49 if (!m_requestedPalette.isAllocated())
52 QPalette::ResolveMask unsetResolveMask = 0;
54 if (group == QPalette::Current)
55 group = m_requestedPalette->currentColorGroup();
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));
61 unsetResolveMask = (QPalette::ResolveMask(1) << QPalettePrivate::bitPosition(group, role));
64 m_requestedPalette->setResolveMask(m_requestedPalette->resolveMask() & ~unsetResolveMask);
66 return updateInheritedPalette();
69bool QQuickPaletteColorProvider::resetColor(QPalette::ColorGroup group)
71 if (!m_requestedPalette.isAllocated())
74 QPalette::ResolveMask unsetResolveMask = 0;
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));
85 if (group == QPalette::Current)
86 group = m_requestedPalette->currentColorGroup();
88 if (group == QPalette::All) {
89 for (
int g = QPalette::Active; g < QPalette::NColorGroups; ++g)
90 unsetResolveMask |= getResolveMask(QPalette::ColorGroup(g));
92 unsetResolveMask = getResolveMask(group);
95 m_requestedPalette->setResolveMask(m_requestedPalette->resolveMask() & ~unsetResolveMask);
97 return updateInheritedPalette();
100bool QQuickPaletteColorProvider::fromQPalette(QPalette p)
102 m_requestedPalette.value() = std::move(p);
103 return updateInheritedPalette();
106QPalette QQuickPaletteColorProvider::palette()
const
108 return m_resolvedPalette;
111const QQuickAbstractPaletteProvider *QQuickPaletteColorProvider::paletteProvider()
const
113 Q_ASSERT(m_paletteProvider);
114 return m_paletteProvider.get();
117void QQuickPaletteColorProvider::setPaletteProvider(
const QQuickAbstractPaletteProvider *paletteProvider)
119 static const auto emptyDeleter = [](
auto &&){};
120 m_paletteProvider = ProviderPtr(paletteProvider, emptyDeleter);
123bool QQuickPaletteColorProvider::copyColorGroup(QPalette::ColorGroup cg,
124 const QQuickPaletteColorProvider &p)
126 ensureRequestedPalette();
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));
136 return updateInheritedPalette();
139bool QQuickPaletteColorProvider::reset()
141 return fromQPalette(QPalette());
145
146
147
148
149
150
151bool QQuickPaletteColorProvider::inheritPalette(
const QPalette &palette)
153 m_lastInheritedPalette.value() = palette;
154 return doInheritPalette(palette);
158
159
160
161
162bool QQuickPaletteColorProvider::doInheritPalette(
const QPalette &palette)
164 auto inheritedMask = m_requestedPalette.isAllocated() ? m_requestedPalette->resolveMask() | palette.resolveMask()
165 : palette.resolveMask();
167 QPalette parentPalette = m_requestedPalette.isAllocated() ? m_requestedPalette->resolve(palette) : palette;
168 parentPalette.setResolveMask(inheritedMask);
170 auto tmpResolvedPalette = parentPalette.resolve(paletteProvider()->defaultPalette());
171 tmpResolvedPalette.setResolveMask(tmpResolvedPalette.resolveMask() | inheritedMask);
173 bool changed = notEq(tmpResolvedPalette, m_resolvedPalette);
175 std::swap(tmpResolvedPalette, m_resolvedPalette);
181
182
183
184bool QQuickPaletteColorProvider::updateInheritedPalette()
187 const QPalette &p = m_lastInheritedPalette.isAllocated() ? m_lastInheritedPalette.value()
188 : paletteProvider()->defaultPalette();
189 return doInheritPalette(paletteProvider()->parentPalette(p));
192void QQuickPaletteColorProvider::ensureRequestedPalette()
194 if (m_requestedPalette.isAllocated())
197 m_requestedPalette.value() = QPalette();
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)