42 Q_DECLARE_PUBLIC(QStyleKitStyle)
66 const QWidget *widget =
nullptr;
76 return l
.model == r
.model && l.internalId == r.internalId
89 bool isValid()
const noexcept
90 {
return widget !=
nullptr && !std::holds_alternative<std::monostate>(id); }
91 friend bool operator==(
const SubElementKey &l,
const SubElementKey &r)
noexcept
92 {
return l.widget == r.widget && l.id == r.id; }
93 friend size_t qHash(
const SubElementKey &k, size_t seed = 0)
noexcept
95 if (
auto *c = std::get_if<ItemViewCell>(&k.id))
96 return qHashMulti(seed, k.widget, 1, c->model, c->internalId, c->row, c->column);
97 if (
auto *a = std::get_if<Action>(&k.id))
98 return qHashMulti(seed, k.widget, 2, a->action);
99 return qHashMulti(seed, k.widget, 0);
104 struct MetricsCacheKey
106 QQStyleKitReader::ControlType type;
109 friend bool operator==(MetricsCacheKey lhs, MetricsCacheKey rhs)
noexcept
110 {
return lhs.type == rhs.type && lhs.state == rhs.state; }
111 friend size_t qHash(MetricsCacheKey key, size_t seed = 0)
noexcept
112 {
return qHashMulti(seed, key.type, key.state); }
119 struct QQStyleKitResolved
121 const QQStyleKitReader *reader =
nullptr;
122 const ControlMetrics *metrics =
nullptr;
123 const QWidget *widget =
nullptr;
125 bool isValid()
const {
return reader && metrics; }
127 const QQStyleKitDelegateProperties *background()
const;
135 struct QQStyleKitLayoutResolved
137 const ControlMetrics *metrics =
nullptr;
138 const QQStyleKitControlProperties *staticProps =
nullptr;
141 bool isValid()
const {
return metrics; }
143 const QQStyleKitDelegateProperties *background()
const;
146 QFont font()
const {
return staticFont; }
150 template <
typename T>
153 decltype(
std::declval<T>().resolveMask()) resolveMask;
156 T reverted(T current) && {
157 oldWidgetValue.setResolveMask(oldWidgetValue.resolveMask() & resolveMask);
158 current.setResolveMask(current.resolveMask() & ~resolveMask);
159 current.resolve(oldWidgetValue);
160 current.setResolveMask(current.resolveMask() | oldWidgetValue.resolveMask());
166 QStyleKitStylePrivate();
171 QQStyleKitStyle *ensureDefaultStyle();
172 QQStyleKitStyle *effectiveStyle()
const;
174 void unsetStyleFont(QWidget *widget);
175 void setStyleFont(QWidget *widget,
const QFont &styleFont);
176 void refreshStyleFont(QWidget *widget);
178 void unsetStylePalette(QWidget *widget);
179 void setStylePalette(QWidget *widget,
const QPalette &stylePalette)
const;
180 void refreshStylePalette(QWidget *widget);
182 QQStyleKitReader *readerForWidget(
const QWidget *widget)
const;
183 void cleanupWidgetReader(
const QWidget *widget)
const;
184 void onWidgetDestroyed(QObject *w)
const;
186 QQStyleKitReader *ensureSharedReader()
const;
187 QQStyleKitReader *ensureSubElementReader()
const;
189 static SubElementKey subElementKeyForOption(
const QStyleOption *opt,
const QWidget *widget);
190 QQStyleKitReader *startSubElementTransition(
const SubElementKey &key,
191 QQStyleKitReader::ControlType type,
192 QQSK::State fromState, QQSK::State toState,
193 QQuickTransition *transition)
const;
194 void cleanupSubElements(
const QWidget *widget)
const;
195 void clearAllSubElements()
const;
197 QQSK::State resolvedStateFor(QQStyleKitReader::ControlType type, QStyle::State state,
198 const QWidget *widget =
nullptr)
const;
200 QQStyleKitResolved resolve(
const QWidget *w, QQStyleKitReader::ControlType type, QStyle::State state)
const;
201 QQStyleKitResolved resolveSubElement(
const QWidget *w,
const QStyleOption *opt,
202 QQStyleKitReader::ControlType type, QStyle::State state,
203 bool track =
true)
const;
205 QQStyleKitLayoutResolved resolveLayout(QQStyleKitReader::ControlType type,
206 QStyle::State state)
const;
208 const ControlMetrics &metricsFor(QQStyleKitReader::ControlType type, QQSK::State state)
const;
209 void clearMetricsCache();
211 ControlMetrics metricsForReader(QQStyleKitReader *reader)
const;
213 void drawControlIndicator(
const QQStyleKitDelegateProperties *indicator,
const QRectF &rect, QPainter *p)
const;
215 const QRect &rect,
const QString &text, uint textFlags,
217 Qt::Alignment defaultAlignment = Qt::AlignHCenter | Qt::AlignVCenter)
const;
218 void drawStyledItemRect(
const QQStyleKitDelegateProperties *,
const QRectF &rect, QPainter *p)
const;
219 void drawBackground(
const QQStyleKitDelegateProperties *,
const QRect &rect, QPainter *p)
const;
220 void drawStyledItemImage(
const QQStyleKitImageProperties *image,
const QRectF &rect,
221 qreal opacity, QPainter *p)
const;
223 QRect getAlignedRectInContainer(
const QRect &container,
const QSize &indicatorSize,
224 uint alignment,
const QMargins &padding,
225 const QMargins &indicatorMargins)
const;
227 QQmlEngine *qmlEngine =
nullptr;
228 QQStyleKitStyle *style =
nullptr;
229 QQStyleKitStyle *defaultStyle =
nullptr;
231 mutable QQStyleKitReader *sharedReader =
nullptr;
235 mutable QHash<
const QWidget *, QQStyleKitReader *> widgetReaders;
237 mutable QQStyleKitReader *subElementReader =
nullptr;
239 mutable QHash<SubElementKey, QQSK::State> subElementStates;
241 mutable QHash<SubElementKey, QQStyleKitReader *> subElementAnimationReaders;
242 static constexpr int kMaxSubElementAnimationReaders = 64;
243 static constexpr int kMaxSubElementStates = 1024;
245 mutable QHash<MetricsCacheKey, ControlMetrics> metricsCache;
249 QSet<
const QWidget *> bgFillDisabledWidgets;