3#ifndef QQUICKPALETTEPROVIDERPRIVATEBASE_H
4#define QQUICKPALETTEPROVIDERPRIVATEBASE_H
17#include <QtQuick/private/qquickpalette_p.h>
18#include <QtQuick/private/qquickabstractpaletteprovider_p.h>
19#include <QtGui/qwindow.h>
20#include <QtQml/private/qlazilyallocated_p.h>
42template <
class I,
class Impl>
45 static_assert(std::is_base_of<QObject, I>{},
"The interface class must inherit QObject");
124 using PalettePtr = std::unique_ptr<QQuickPalette>;
127 void registerPalette(PalettePtr
palette);
136 const I *itemWithPalette()
const;
137 I *itemWithPalette();
144 PalettePtr m_palette;
147template<
class I,
class Impl>
150 if (!providesPalette()) {
153 const_cast<Self*
>(
this)->registerPalette(std::make_unique<QQuickPalette>());
154 Q_EMIT const_cast<Self*
>(
this)->itemWithPalette()->paletteCreated();
157 return paletteData();
160template<
class I,
class Impl>
164 qWarning(
"Palette cannot be null.");
168 if (providesPalette() && paletteData() ==
palette) {
169 qWarning(
"Self assignment makes no sense.");
176template<
class I,
class Impl>
179 if (isValidPalette(
p)) {
180 palette()->fromQPalette(
p->toQPalette());
184template<
class I,
class Impl>
187 paletteData()->reset();
190template<
class I,
class Impl>
196template<
class I,
class Impl>
202template <
class Window>
203inline constexpr bool isRootWindow() {
return std::is_base_of_v<QWindow, Window>; }
205template<
class I,
class Impl>
208 if constexpr (!isRootWindow<I>()) {
210 if (!providesPalette()) {
215 m_palette = std::move(
palette);
216 m_palette->setPaletteProvider(
this);
217 m_palette->inheritPalette(parentPalette(defaultPalette()));
219 setCurrentColorGroup();
233 if constexpr (std::is_same_v<T, QQuickWindow>) {
234 return getPrivateImpl<QQuickWindowPrivate>(
item);
235 }
else if constexpr (std::is_same_v<T, QQuickItem>) {
236 return getPrivateImpl<QQuickItemPrivate>(
item);
242template<
class I,
class Impl>
245 if constexpr (!isRootWindow<I>()) {
246 if (
auto window = itemWithPalette()->window()) {
256template<
class I,
class Impl>
259 if constexpr (!isRootWindow<I>()) {
260 for (
auto parentItem = itemWithPalette()->parentItem(); parentItem;
261 parentItem = parentItem->parentItem()) {
264 if (parentItem &&
getPrivate(*parentItem)->providesPalette()) {
265 return getPrivate(*parentItem)->palette()->toQPalette();
269 if (
auto wp = windowPalette()) {
270 return wp->toQPalette();
274 return fallbackPalette;
280 if constexpr (isRootWindow<I>()) {
281 return item.contentItem();
282 }
else if constexpr (std::is_same_v<QQuickPopup, I>) {
289template<
class I,
class Impl>
292 if (providesPalette()) {
295 palette()->inheritPalette(parentPalette);
298 updateChildrenPalettes(parentPalette);
302template<
class I,
class Impl>
305 if constexpr (!isRootWindow<I>()) {
306 if (providesPalette()) {
307 const bool enabled = itemWithPalette()->isEnabled();
308 const auto window = itemWithPalette()->window();
316template<
class I,
class Impl>
319 if constexpr (std::is_same_v<QQuickWindow, I> && std::is_same_v<QQuickWindowPrivate, Impl>) {
326 Q_UNREACHABLE_RETURN();
328 if (
auto root =
rootItem(*itemWithPalette())) {
329 for (
auto &&
child : root->childItems()) {
331 getPrivate(*child)->inheritPalette(parentPalette);
338template<
class I,
class Impl>
343 if constexpr (!isRootWindow<I>()) {
345 I::connect(itemWithPalette(), &I::parentChanged , [
this]() { inheritPalette(parentPalette(defaultPalette())); });
346 I::connect(itemWithPalette(), &I::windowChanged , [
this]() { inheritPalette(parentPalette(defaultPalette())); });
347 I::connect(itemWithPalette(), &I::enabledChanged, [
this]() { setCurrentColorGroup(); });
351template<
class I,
class Impl>
354 static_assert(std::is_base_of<QObjectData, Impl>{},
355 "The Impl class must inherit QObjectData");
357 return static_cast<const I*
>(
static_cast<const Impl*
>(
this)->q_ptr);
360template<
class I,
class Impl>
363 return const_cast<I*
>(
const_cast<const Self*
>(
this)->itemWithPalette());
366template<
class I,
class Impl>
369 Q_ASSERT(m_palette);
return m_palette.get();
372template<
class I,
class Impl>
375 return palette()->toQPalette();
The QPalette class contains color groups for each widget state.
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
void inheritPalette(const QPalette &parentPalette)
virtual bool providesPalette() const
virtual void updateChildrenPalettes(const QPalette &parentPalette)
virtual QQuickPalette * palette() const
virtual ~QQuickPaletteProviderPrivateBase()=default
void setCurrentColorGroup()
virtual void resetPalette()
QPalette parentPalette(const QPalette &fallbackPalette) const override
QPalette defaultPalette() const override
virtual void setPalette(QQuickPalette *p)
Contains color groups for each QML item state. \inmodule QtQuick.
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
Combined button and popup list for selecting options.
GLenum GLenum GLsizei const GLuint GLboolean enabled
const QQuickItem * rootItem(const I &item)
decltype(auto) getPrivate(T &item)
constexpr bool isRootWindow()
decltype(auto) getPrivateImpl(I &t)