128 void registerPalette(PalettePtr palette);
130 bool isValidPalette(
const QQuickPalette *palette)
const;
132 QQuickPalette *windowPalette()
const;
137 const I *itemWithPalette()
const;
138 I *itemWithPalette();
140 QQuickPalette *paletteData()
const;
142 QPalette toQPalette()
const;
145 PalettePtr m_palette;
148template<
class I,
class Impl>
154 const_cast<Self*>(
this)->registerPalette(std::make_unique<QQuickPalette>());
155 Q_EMIT
const_cast<Self*>(
this)->itemWithPalette()->paletteCreated();
158 return paletteData();
161template<
class I,
class Impl>
165 qWarning(
"Palette cannot be null.");
169 if (providesPalette() && paletteData() == palette) {
170 qWarning(
"Self assignment makes no sense.");
177template<
class I,
class Impl>
180 if (isValidPalette(p)) {
181 palette()->fromQPalette(p->toQPalette());
185template<
class I,
class Impl>
188 if (providesPalette())
189 paletteData()->reset();
192template<
class I,
class Impl>
198template<
class I,
class Impl>
204template <
class Window>
205inline constexpr bool isRootWindow() {
return std::is_base_of_v<QWindow, Window>; }
207template<
class I,
class Impl>
210 if constexpr (!isRootWindow<I>()) {
217 m_palette = std::move(palette);
218 m_palette->setPaletteProvider(
this);
219 m_palette->inheritPalette(parentPalette(defaultPalette()));
225 I::connect(paletteData(), &QQuickPalette::changed, itemWithPalette(), &I::paletteChanged);
226 I::connect(paletteData(), &QQuickPalette::changed, itemWithPalette(), [
this]{ updateChildrenPalettes(toQPalette()); });
230template<
class Impl,
class I>
decltype(
auto)
getPrivateImpl(I &t) {
return Impl::get(&t); }
235 if constexpr (std::is_base_of_v<T, QQuickWindow>) {
236 return getPrivateImpl<QQuickWindowPrivate>(item);
237 }
else if constexpr (std::is_base_of_v<T, QQuickItem>) {
238 return getPrivateImpl<QQuickItemPrivate>(item);
244template<
class I,
class Impl>
247 if constexpr (!isRootWindow<I>()) {
248 if (
auto window = itemWithPalette()->window()) {
249 if (getPrivate(*window)->providesPalette()) {
250 return getPrivate(*window)->palette();
258template<
class I,
class Impl>
261 if constexpr (!isRootWindow<I>()) {
263 if (!std::is_base_of_v<QQuickPopup, I>) {
264 for (
auto parentItem = itemWithPalette()->parentItem(); parentItem;
265 parentItem = parentItem->parentItem()) {
268 if (parentItem && getPrivate(*parentItem)->providesPalette()) {
269 return getPrivate(*parentItem)->palette()->toQPalette();
274 if (
auto wp = windowPalette()) {
275 return wp->toQPalette();
279 return fallbackPalette;
285 if constexpr (isRootWindow<I>()) {
286 return item.contentItem();
287 }
else if constexpr (std::is_base_of_v<QQuickPopup, I>) {
294template<
class I,
class Impl>
300 palette()->inheritPalette(parentPalette);
303 updateChildrenPalettes(parentPalette);
307template<
class I,
class Impl>
310 if constexpr (!isRootWindow<I>()) {
312 const bool enabled = itemWithPalette()->isEnabled();
313 const auto window = itemWithPalette()->window();
314 const bool active = window ? window->isActive() :
true;
315 palette()->setCurrentGroup(enabled ? (active ? QPalette::Active : QPalette::Inactive)
316 : QPalette::Disabled);