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 paletteData()->reset();
191template<
class I,
class Impl>
197template<
class I,
class Impl>
203template <
class Window>
204inline constexpr bool isRootWindow() {
return std::is_base_of_v<QWindow, Window>; }
206template<
class I,
class Impl>
209 if constexpr (!isRootWindow<I>()) {
216 m_palette = std::move(palette);
217 m_palette->setPaletteProvider(
this);
218 m_palette->inheritPalette(parentPalette(defaultPalette()));
224 I::connect(paletteData(), &QQuickPalette::changed, itemWithPalette(), &I::paletteChanged);
225 I::connect(paletteData(), &QQuickPalette::changed, itemWithPalette(), [
this]{ updateChildrenPalettes(toQPalette()); });
229template<
class Impl,
class I>
decltype(
auto)
getPrivateImpl(I &t) {
return Impl::get(&t); }
234 if constexpr (std::is_base_of_v<T, QQuickWindow>) {
235 return getPrivateImpl<QQuickWindowPrivate>(item);
236 }
else if constexpr (std::is_base_of_v<T, QQuickItem>) {
237 return getPrivateImpl<QQuickItemPrivate>(item);
243template<
class I,
class Impl>
246 if constexpr (!isRootWindow<I>()) {
247 if (
auto window = itemWithPalette()->window()) {
248 if (getPrivate(*window)->providesPalette()) {
249 return getPrivate(*window)->palette();
257template<
class I,
class Impl>
260 if constexpr (!isRootWindow<I>()) {
262 if (!std::is_base_of_v<QQuickPopup, I>) {
263 for (
auto parentItem = itemWithPalette()->parentItem(); parentItem;
264 parentItem = parentItem->parentItem()) {
267 if (parentItem && getPrivate(*parentItem)->providesPalette()) {
268 return getPrivate(*parentItem)->palette()->toQPalette();
273 if (
auto wp = windowPalette()) {
274 return wp->toQPalette();
278 return fallbackPalette;
284 if constexpr (isRootWindow<I>()) {
285 return item.contentItem();
286 }
else if constexpr (std::is_base_of_v<QQuickPopup, I>) {
293template<
class I,
class Impl>
299 palette()->inheritPalette(parentPalette);
302 updateChildrenPalettes(parentPalette);
306template<
class I,
class Impl>
309 if constexpr (!isRootWindow<I>()) {
311 const bool enabled = itemWithPalette()->isEnabled();
312 const auto window = itemWithPalette()->window();
313 const bool active = window ? window->isActive() :
true;
314 palette()->setCurrentGroup(enabled ? (active ? QPalette::Active : QPalette::Inactive)
315 : QPalette::Disabled);