Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qandroidstyle_p.h
Go to the documentation of this file.
1// Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QANDROIDSTYLE_P_H
6#define QANDROIDSTYLE_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists for the convenience
13// of qstylefactory.cpp. This header may change from version to version
14// without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtWidgets/private/qtwidgetsglobal_p.h>
20#include <QtWidgets/private/qfusionstyle_p.h>
21#include <QtCore/QList>
22#include <QtCore/QMargins>
23#include <QtCore/QHash>
24#include <QtCore/QVariantMap>
25
27
28class Q_WIDGETS_EXPORT QAndroidStyle : public QFusionStyle
29{
30 Q_OBJECT
31
32public:
33 enum ItemType
34 {
35 QC_UnknownType = -1,
36 QC_View,
37 QC_GroupBox,
38 QC_Button,
39 QC_Checkbox,
40 QC_RadioButton,
41 QC_Slider,
42 QC_Switch,
43 QC_EditText,
44 QC_Combobox,
45 QC_BusyIndicator,
46 QC_ProgressBar,
47 QC_Tab,
48 QC_TabButton,
49 QC_RatingIndicator,
50 QC_SearchBox,
51 QC_CustomControl=0xf00,
52 QC_ControlMask=0xfff
53 };
54
55 struct Android9PatchChunk
56 {
57 QList<int> xDivs;
58 QList<int> yDivs;
59 QList<int> colors;
60 };
61
62 struct AndroidItemStateInfo
63 {
64 AndroidItemStateInfo():state(0){}
65 int state;
66 QByteArray filePath;
67 QByteArray hashKey;
68 Android9PatchChunk chunkData;
69 QSize size;
70 QMargins padding;
71 };
72
73 enum AndroidDrawableType
74 {
75 Color,
76 Image,
77 Clip,
78 NinePatch,
79 Gradient,
80 State,
81 Layer
82 };
83
84 class AndroidDrawable
85 {
86 public:
87 AndroidDrawable(const QVariantMap &drawable, ItemType itemType);
88 virtual ~AndroidDrawable();
89 virtual void initPadding(const QVariantMap &drawable);
90 virtual AndroidDrawableType type() const = 0;
91 virtual void draw(QPainter *painter,const QStyleOption *opt) const = 0;
92 const QMargins &padding() const;
93 virtual QSize size() const;
94 static AndroidDrawable *fromMap(const QVariantMap &drawable, ItemType itemType);
95 static QMargins extractMargins(const QVariantMap &value);
96 virtual void setPaddingLeftToSizeWidth();
97 protected:
98 ItemType m_itemType;
99 QMargins m_padding;
100 };
101
102 class AndroidColorDrawable: public AndroidDrawable
103 {
104 public:
105 AndroidColorDrawable(const QVariantMap &drawable, ItemType itemType);
106 virtual AndroidDrawableType type() const;
107 virtual void draw(QPainter *painter,const QStyleOption *opt) const;
108
109 protected:
110 QColor m_color;
111 };
112
113 class AndroidImageDrawable: public AndroidDrawable
114 {
115 public:
116 AndroidImageDrawable(const QVariantMap &drawable, ItemType itemType);
117 virtual AndroidDrawableType type() const;
118 virtual void draw(QPainter *painter,const QStyleOption *opt) const;
119 virtual QSize size() const;
120
121 protected:
122 QString m_filePath;
123 mutable QString m_hashKey;
124 QSize m_size;
125 };
126
127 class Android9PatchDrawable: public AndroidImageDrawable
128 {
129 public:
130 Android9PatchDrawable(const QVariantMap &drawable, ItemType itemType);
131 virtual AndroidDrawableType type() const;
132 virtual void draw(QPainter *painter, const QStyleOption *opt) const;
133 private:
134 static int calculateStretch(int boundsLimit, int startingPoint,
135 int srcSpace, int numStrechyPixelsRemaining,
136 int numFixedPixelsRemaining);
137 void extractIntArray(const QVariantList &values, QList<int> &array);
138 private:
139 Android9PatchChunk m_chunkData;
140 };
141
142 class AndroidGradientDrawable: public AndroidDrawable
143 {
144 public:
145 enum GradientOrientation
146 {
147 TOP_BOTTOM,
148 TR_BL,
149 RIGHT_LEFT,
150 BR_TL,
151 BOTTOM_TOP,
152 BL_TR,
153 LEFT_RIGHT,
154 TL_BR
155 };
156
157 public:
158 AndroidGradientDrawable(const QVariantMap &drawable, ItemType itemType);
159 virtual AndroidDrawableType type() const;
160 virtual void draw(QPainter *painter, const QStyleOption *opt) const;
161 QSize size() const;
162 private:
163 mutable QLinearGradient m_gradient;
164 GradientOrientation m_orientation;
165 int m_radius;
166 };
167
168 class AndroidClipDrawable: public AndroidDrawable
169 {
170 public:
171 AndroidClipDrawable(const QVariantMap &drawable, ItemType itemType);
172 ~AndroidClipDrawable();
173 virtual AndroidDrawableType type() const;
174 virtual void setFactor(double factor, Qt::Orientation orientation);
175 virtual void draw(QPainter *painter, const QStyleOption *opt) const;
176
177 private:
178 double m_factor;
179 Qt::Orientation m_orientation;
180 const AndroidDrawable *m_drawable;
181 };
182
183 class AndroidStateDrawable: public AndroidDrawable
184 {
185 public:
186 AndroidStateDrawable(const QVariantMap &drawable, ItemType itemType);
187 ~AndroidStateDrawable();
188 virtual AndroidDrawableType type() const;
189 virtual void draw(QPainter *painter, const QStyleOption *opt) const;
190 inline const AndroidDrawable *bestAndroidStateMatch(const QStyleOption *opt) const;
191 static int extractState(const QVariantMap &value);
192 virtual void setPaddingLeftToSizeWidth();
193 QSize sizeImage(const QStyleOption *opt) const;
194 private:
195 typedef std::pair<int, const AndroidDrawable *> StateType;
196 QList<StateType> m_states;
197 };
198
199 class AndroidLayerDrawable: public AndroidDrawable
200 {
201 public:
202 AndroidLayerDrawable(const QVariantMap &drawable, QAndroidStyle::ItemType itemType);
203 ~AndroidLayerDrawable();
204 virtual AndroidDrawableType type() const;
205 virtual void setFactor(int id, double factor, Qt::Orientation orientation);
206 virtual void draw(QPainter *painter, const QStyleOption *opt) const;
207 AndroidDrawable *layer(int id) const;
208 QSize size() const;
209 private:
210 typedef std::pair<int, AndroidDrawable *> LayerType;
211 QList<LayerType> m_layers;
212 int m_id;
213 double m_factor;
214 Qt::Orientation m_orientation;
215 };
216
217 class AndroidControl
218 {
219 public:
220 AndroidControl(const QVariantMap &control, ItemType itemType);
221 virtual ~AndroidControl();
222 virtual void drawControl(const QStyleOption *opt, QPainter *p, const QWidget *w);
223 virtual QRect subElementRect(SubElement subElement,
224 const QStyleOption *option,
225 const QWidget *widget = nullptr) const;
226 virtual QRect subControlRect(const QStyleOptionComplex *option,
227 SubControl sc,
228 const QWidget *widget = nullptr) const;
229 virtual QSize sizeFromContents(const QStyleOption *opt,
230 const QSize &contentsSize,
231 const QWidget *w) const;
232 virtual QMargins padding();
233 virtual QSize size(const QStyleOption *option);
234 protected:
235 virtual const AndroidDrawable * backgroundDrawable() const;
236 const AndroidDrawable *m_background;
237 QSize m_minSize;
238 QSize m_maxSize;
239 };
240
241 class AndroidCompoundButtonControl : public AndroidControl
242 {
243 public:
244 AndroidCompoundButtonControl(const QVariantMap &control, ItemType itemType);
245 virtual ~AndroidCompoundButtonControl();
246 virtual void drawControl(const QStyleOption *opt, QPainter *p, const QWidget *w);
247 virtual QMargins padding();
248 virtual QSize size(const QStyleOption *option);
249 protected:
250 virtual const AndroidDrawable * backgroundDrawable() const;
251 const AndroidDrawable *m_button;
252 };
253
254 class AndroidProgressBarControl : public AndroidControl
255 {
256 public:
257 AndroidProgressBarControl(const QVariantMap &control, ItemType itemType);
258 virtual ~AndroidProgressBarControl();
259 virtual void drawControl(const QStyleOption *option, QPainter *p, const QWidget *w);
260 virtual QRect subElementRect(SubElement subElement,
261 const QStyleOption *option,
262 const QWidget *widget = nullptr) const;
263
264 QSize sizeFromContents(const QStyleOption *opt,
265 const QSize &contentsSize,
266 const QWidget *w) const;
267 protected:
268 AndroidDrawable *m_progressDrawable;
269 AndroidDrawable *m_indeterminateDrawable;
270 int m_secondaryProgress_id;
271 int m_progressId;
272 };
273
274 class AndroidSeekBarControl : public AndroidProgressBarControl
275 {
276 public:
277 AndroidSeekBarControl(const QVariantMap &control, ItemType itemType);
278 virtual ~AndroidSeekBarControl();
279 virtual void drawControl(const QStyleOption *option, QPainter *p, const QWidget *w);
280 QSize sizeFromContents(const QStyleOption *opt,
281 const QSize &contentsSize, const QWidget *w) const;
282 QRect subControlRect(const QStyleOptionComplex *option, SubControl sc,
283 const QWidget *widget = nullptr) const;
284 private:
285 AndroidDrawable *m_seekBarThumb;
286 };
287
288 class AndroidSpinnerControl : public AndroidControl
289 {
290 public:
291 AndroidSpinnerControl(const QVariantMap &control, ItemType itemType);
292 virtual ~AndroidSpinnerControl(){}
293 virtual QRect subControlRect(const QStyleOptionComplex *option,
294 SubControl sc,
295 const QWidget *widget = nullptr) const;
296 };
297
298 typedef QList<AndroidItemStateInfo *> AndroidItemStateInfoList;
299
300public:
301 QAndroidStyle();
302 ~QAndroidStyle();
303
304 virtual void drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p,
305 const QWidget *w = nullptr) const;
306
307 virtual void drawControl(QStyle::ControlElement element, const QStyleOption *opt, QPainter *p,
308 const QWidget *w = nullptr) const;
309
310 virtual QRect subElementRect(SubElement subElement, const QStyleOption *option,
311 const QWidget *widget = nullptr) const;
312 virtual void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p,
313 const QWidget *widget = nullptr) const;
314 virtual SubControl hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt,
315 const QPoint &pt, const QWidget *widget = nullptr) const;
316 virtual QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt,
317 SubControl sc, const QWidget *widget = nullptr) const;
318
319 virtual int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr,
320 const QWidget *widget = nullptr) const;
321
322 virtual QSize sizeFromContents(ContentsType ct, const QStyleOption *opt,
323 const QSize &contentsSize, const QWidget *w = nullptr) const;
324
325 virtual QPixmap standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt = nullptr,
326 const QWidget *widget = nullptr) const;
327
328 virtual QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
329 const QStyleOption *opt) const;
330
331 int styleHint(StyleHint hint, const QStyleOption *option = nullptr, const QWidget *widget = nullptr,
332 QStyleHintReturn *returnData = nullptr) const;
333
334 virtual QPalette standardPalette() const;
335 void polish(QWidget *widget);
336 void unpolish(QWidget *widget);
337
338private:
339 Q_DISABLE_COPY_MOVE(QAndroidStyle)
340 static ItemType qtControl(QStyle::ComplexControl control);
341 static ItemType qtControl(QStyle::ContentsType contentsType);
342 static ItemType qtControl(QStyle::ControlElement controlElement);
343 static ItemType qtControl(QStyle::PrimitiveElement primitiveElement);
344 static ItemType qtControl(QStyle::SubElement subElement);
345 static ItemType qtControl(const QString &android);
346
347private:
348 typedef QHash<int, AndroidControl *> AndroidControlsHash;
349 AndroidControlsHash m_androidControlsHash;
350 QPalette m_standardPalette;
351 AndroidCompoundButtonControl *checkBoxControl;
352};
353
354QT_END_NAMESPACE
355
356#endif // QANDROIDSTYLE_P_H