1 | // Copyright (C) 2016 The Qt Company Ltd. |
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | |
4 | /* This is the default Qt style sheet. |
5 | |
6 | IMPORTANT: This style sheet is primarily meant for defining feature |
7 | capabilities of styles. Do NOT add default styling rules here. When in |
8 | doubt ask the stylesheet maintainer. |
9 | |
10 | The stylesheet in here used to be in a CSS file, but was moved here to |
11 | avoid parsing overhead. |
12 | */ |
13 | |
14 | #include "qstylesheetstyle_p.h" |
15 | #if QT_CONFIG(cssparser) |
16 | #include "private/qcssparser_p.h" |
17 | #endif |
18 | |
19 | #ifndef QT_NO_STYLE_STYLESHEET |
20 | |
21 | QT_BEGIN_NAMESPACE |
22 | |
23 | using namespace Qt::StringLiterals; |
24 | using namespace QCss; |
25 | |
26 | // This is the class name of the selector. |
27 | // Use an empty string where you would use '*' in CSS. |
28 | // Ex. QHeaderView |
29 | |
30 | #define SET_ELEMENT_NAME(x) \ |
31 | bSelector.elementName = (x) |
32 | |
33 | // This acts as both pseudo state and sub control. The first parameter is the |
34 | // string name, and the second is the PseudoClass_* constant. |
35 | // The sub control specifier is always the first, and has the type |
36 | // PseudoClass_Unknown. |
37 | // If there is no PseudoClass_Unknown as the first pseudo, it is assumed to be |
38 | // a pseudo state. |
39 | // Ex. QComboBox::drop-down:enabled |
40 | // ^ ^ |
41 | |
42 | #define ADD_PSEUDO(x, y) \ |
43 | pseudo.type = (y); \ |
44 | pseudo.name = (x); \ |
45 | bSelector.pseudos << pseudo |
46 | |
47 | // This is attributes. The third parameter is AttributeSelector::* |
48 | // Ex. QComboBox[style="QWindowsVistaStyle"] |
49 | // ^ ^ |
50 | |
51 | #define ADD_ATTRIBUTE_SELECTOR(x, y, z) \ |
52 | attr.name = (x); \ |
53 | attr.value = (y); \ |
54 | attr.valueMatchCriterium = (z); \ |
55 | bSelector.attributeSelectors << attr |
56 | |
57 | // Adds the current basic selector to the rule. |
58 | // Several basic selectors behave as AND (space in CSS). |
59 | |
60 | #define ADD_BASIC_SELECTOR \ |
61 | selector.basicSelectors << bSelector; \ |
62 | bSelector.ids.clear(); \ |
63 | bSelector.pseudos.clear(); \ |
64 | bSelector.attributeSelectors.clear() |
65 | |
66 | // Adds the current selector to the rule. |
67 | // Several selectors behave as OR (comma in CSS). |
68 | |
69 | #define ADD_SELECTOR \ |
70 | styleRule.selectors << selector; \ |
71 | selector.basicSelectors.clear() |
72 | |
73 | // Sets the name of a property. |
74 | // Ex. background: red; |
75 | // ^ |
76 | |
77 | #define SET_PROPERTY(x, y) \ |
78 | decl.d->property = (x); \ |
79 | decl.d->propertyId = (y) |
80 | |
81 | // Adds a value to the current property. |
82 | // The first parameter should be Value::KnownIdentifier if the value can be |
83 | // found among the Value_* constants, in which case the second should be that |
84 | // constant. Otherwise the first parameter is Value::Identifier and the second |
85 | // is a string. |
86 | // Adding more values is the same as separating by spaces in CSS. |
87 | // Ex. border: 2px solid black; |
88 | // ^ ^ ^ |
89 | |
90 | #define ADD_VALUE(x, y) \ |
91 | value.type = (x); \ |
92 | value.variant = (y); \ |
93 | decl.d->values << value |
94 | |
95 | // Adds the current declaration to the rule. |
96 | // Ex. border: 2px solid black; |
97 | // \----------------------/ |
98 | |
99 | #define ADD_DECLARATION \ |
100 | styleRule.declarations << decl; \ |
101 | decl.d.detach(); \ |
102 | decl.d->values.clear() |
103 | |
104 | // Adds the rule to the stylesheet. |
105 | // Use at the end of every CSS block. |
106 | |
107 | #define ADD_STYLE_RULE \ |
108 | sheet.styleRules << styleRule; \ |
109 | styleRule.selectors.clear(); \ |
110 | styleRule.declarations.clear() |
111 | |
112 | StyleSheet QStyleSheetStyle::getDefaultStyleSheet() const |
113 | { |
114 | StyleSheet sheet; |
115 | StyleRule styleRule; |
116 | BasicSelector bSelector; |
117 | Selector selector; |
118 | Declaration decl; |
119 | QCss::Value value; |
120 | Pseudo pseudo; |
121 | AttributeSelector attr; |
122 | |
123 | // pixmap based style doesn't support any features |
124 | bool styleIsPixmapBased = baseStyle()->inherits(classname: "QMacStyle" ) |
125 | || (baseStyle()->inherits(classname: "QWindowsVistaStyle" ) |
126 | && !baseStyle()->inherits(classname: "QWindows11Style" )); |
127 | |
128 | |
129 | /*QLineEdit { |
130 | -qt-background-role: base; |
131 | border: native; |
132 | -qt-style-features: background-color; |
133 | }*/ |
134 | { |
135 | SET_ELEMENT_NAME("QLineEdit"_L1 ); |
136 | ADD_BASIC_SELECTOR; |
137 | ADD_SELECTOR; |
138 | |
139 | SET_PROPERTY("-qt-background-role"_L1 , QtBackgroundRole); |
140 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Base); |
141 | ADD_DECLARATION; |
142 | |
143 | SET_PROPERTY("border"_L1 , Border); |
144 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Native); |
145 | ADD_DECLARATION; |
146 | |
147 | SET_PROPERTY("-qt-style-features"_L1 , QtStyleFeatures); |
148 | ADD_VALUE(QCss::Value::Identifier, QString::fromLatin1("background-color" )); |
149 | ADD_DECLARATION; |
150 | |
151 | ADD_STYLE_RULE; |
152 | } |
153 | |
154 | /*QLineEdit:no-frame { |
155 | border: none; |
156 | }*/ |
157 | { |
158 | SET_ELEMENT_NAME("QLineEdit"_L1 ); |
159 | ADD_PSEUDO("no-frame"_L1 , PseudoClass_Frameless); |
160 | ADD_BASIC_SELECTOR; |
161 | ADD_SELECTOR; |
162 | |
163 | SET_PROPERTY("border"_L1 , Border); |
164 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_None); |
165 | ADD_DECLARATION; |
166 | |
167 | ADD_STYLE_RULE; |
168 | } |
169 | |
170 | /*QFrame { |
171 | border: native; |
172 | }*/ |
173 | { |
174 | SET_ELEMENT_NAME("QFrame"_L1 ); |
175 | ADD_BASIC_SELECTOR; |
176 | ADD_SELECTOR; |
177 | |
178 | SET_PROPERTY("border"_L1 , Border); |
179 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Native); |
180 | ADD_DECLARATION; |
181 | |
182 | ADD_STYLE_RULE; |
183 | } |
184 | |
185 | /*QLabel, QToolBox { |
186 | background: none; |
187 | border-image: none; |
188 | }*/ |
189 | { |
190 | SET_ELEMENT_NAME("QLabel"_L1 ); |
191 | ADD_BASIC_SELECTOR; |
192 | ADD_SELECTOR; |
193 | |
194 | SET_ELEMENT_NAME("QToolBox"_L1 ); |
195 | ADD_BASIC_SELECTOR; |
196 | ADD_SELECTOR; |
197 | |
198 | SET_PROPERTY("background"_L1 , Background); |
199 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_None); |
200 | ADD_DECLARATION; |
201 | |
202 | SET_PROPERTY("border-image"_L1 , BorderImage); |
203 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_None); |
204 | ADD_DECLARATION; |
205 | |
206 | ADD_STYLE_RULE; |
207 | } |
208 | |
209 | /*QGroupBox { |
210 | border: native; |
211 | }*/ |
212 | { |
213 | SET_ELEMENT_NAME("QGroupBox"_L1 ); |
214 | ADD_BASIC_SELECTOR; |
215 | ADD_SELECTOR; |
216 | |
217 | SET_PROPERTY("border"_L1 , Border); |
218 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Native); |
219 | ADD_DECLARATION; |
220 | |
221 | ADD_STYLE_RULE; |
222 | } |
223 | |
224 | |
225 | /*QToolTip { |
226 | -qt-background-role: window; |
227 | border: native; |
228 | }*/ |
229 | { |
230 | SET_ELEMENT_NAME("QToolTip"_L1 ); |
231 | ADD_BASIC_SELECTOR; |
232 | ADD_SELECTOR; |
233 | |
234 | SET_PROPERTY("-qt-background-role"_L1 , QtBackgroundRole); |
235 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Window); |
236 | ADD_DECLARATION; |
237 | |
238 | SET_PROPERTY("border"_L1 , Border); |
239 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Native); |
240 | ADD_DECLARATION; |
241 | |
242 | ADD_STYLE_RULE; |
243 | } |
244 | |
245 | /*QPushButton, QToolButton { |
246 | border-style: native; |
247 | -qt-style-features: background-color; //only for not pixmap based styles |
248 | }*/ |
249 | { |
250 | SET_ELEMENT_NAME("QPushButton"_L1 ); |
251 | ADD_BASIC_SELECTOR; |
252 | ADD_SELECTOR; |
253 | |
254 | SET_ELEMENT_NAME("QToolButton"_L1 ); |
255 | ADD_BASIC_SELECTOR; |
256 | ADD_SELECTOR; |
257 | |
258 | SET_PROPERTY("border-style"_L1 , BorderStyles); |
259 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Native); |
260 | ADD_DECLARATION; |
261 | |
262 | if (!styleIsPixmapBased) { |
263 | SET_PROPERTY("-qt-style-features"_L1 , QtStyleFeatures); |
264 | ADD_VALUE(QCss::Value::Identifier, QString::fromLatin1("background-color" )); |
265 | ADD_DECLARATION; |
266 | } |
267 | |
268 | |
269 | ADD_STYLE_RULE; |
270 | } |
271 | |
272 | |
273 | /*QComboBox { |
274 | border: native; |
275 | -qt-style-features: background-color background-gradient; //only for not pixmap based styles |
276 | -qt-background-role: base; |
277 | }*/ |
278 | |
279 | { |
280 | SET_ELEMENT_NAME("QComboBox"_L1 ); |
281 | ADD_BASIC_SELECTOR; |
282 | ADD_SELECTOR; |
283 | |
284 | SET_PROPERTY("border"_L1 , Border); |
285 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Native); |
286 | ADD_DECLARATION; |
287 | |
288 | if (!styleIsPixmapBased) { |
289 | SET_PROPERTY("-qt-style-features"_L1 , QtStyleFeatures); |
290 | ADD_VALUE(QCss::Value::Identifier, QString::fromLatin1("background-color" )); |
291 | ADD_VALUE(QCss::Value::Identifier, QString::fromLatin1("background-gradient" )); |
292 | ADD_DECLARATION; |
293 | } |
294 | |
295 | SET_PROPERTY("-qt-background-role"_L1 , QtBackgroundRole); |
296 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Base); |
297 | ADD_DECLARATION; |
298 | |
299 | ADD_STYLE_RULE; |
300 | } |
301 | |
302 | /*QComboBox[style="QPlastiqueStyle"][readOnly="true"], |
303 | QComboBox[style="QFusionStyle"][readOnly="true"], |
304 | QComboBox[style="QCleanlooksStyle"][readOnly="true"] |
305 | { |
306 | -qt-background-role: button; |
307 | }*/ |
308 | if (baseStyle()->inherits(classname: "QPlastiqueStyle" ) || baseStyle()->inherits(classname: "QCleanlooksStyle" ) || baseStyle()->inherits(classname: "QFusionStyle" )) |
309 | { |
310 | SET_ELEMENT_NAME("QComboBox"_L1 ); |
311 | ADD_ATTRIBUTE_SELECTOR("readOnly"_L1 , "true"_L1 , AttributeSelector::MatchEqual); |
312 | ADD_BASIC_SELECTOR; |
313 | ADD_SELECTOR; |
314 | |
315 | SET_PROPERTY("-qt-background-role"_L1 , QtBackgroundRole); |
316 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Button); |
317 | ADD_DECLARATION; |
318 | |
319 | ADD_STYLE_RULE; |
320 | } |
321 | |
322 | /*QAbstractSpinBox { |
323 | border: native; |
324 | -qt-style-features: background-color; |
325 | -qt-background-role: base; |
326 | }*/ |
327 | { |
328 | SET_ELEMENT_NAME("QAbstractSpinBox"_L1 ); |
329 | ADD_BASIC_SELECTOR; |
330 | ADD_SELECTOR; |
331 | |
332 | SET_PROPERTY("border"_L1 , Border); |
333 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Native); |
334 | ADD_DECLARATION; |
335 | |
336 | SET_PROPERTY("-qt-style-features"_L1 , QtStyleFeatures); |
337 | ADD_VALUE(QCss::Value::Identifier, QString::fromLatin1("background-color" )); |
338 | ADD_DECLARATION; |
339 | |
340 | SET_PROPERTY("-qt-background-role"_L1 , QtBackgroundRole); |
341 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Base); |
342 | ADD_DECLARATION; |
343 | |
344 | ADD_STYLE_RULE; |
345 | } |
346 | |
347 | /*QMenu { |
348 | -qt-background-role: window; |
349 | }*/ |
350 | { |
351 | SET_ELEMENT_NAME("QMenu"_L1 ); |
352 | ADD_BASIC_SELECTOR; |
353 | ADD_SELECTOR; |
354 | |
355 | SET_PROPERTY("-qt-background-role"_L1 , QtBackgroundRole); |
356 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Window); |
357 | ADD_DECLARATION; |
358 | |
359 | ADD_STYLE_RULE; |
360 | } |
361 | /*QMenu::item { |
362 | -qt-style-features: background-color; |
363 | }*/ |
364 | if (!styleIsPixmapBased) { |
365 | SET_ELEMENT_NAME("QMenu"_L1 ); |
366 | ADD_PSEUDO("item"_L1 , PseudoClass_Unknown); |
367 | ADD_BASIC_SELECTOR; |
368 | ADD_SELECTOR; |
369 | |
370 | SET_PROPERTY("-qt-style-features"_L1 , QtStyleFeatures); |
371 | ADD_VALUE(QCss::Value::Identifier, QString::fromLatin1("background-color" )); |
372 | ADD_DECLARATION; |
373 | |
374 | ADD_STYLE_RULE; |
375 | } |
376 | |
377 | /*QHeaderView { |
378 | -qt-background-role: window; |
379 | }*/ |
380 | { |
381 | SET_ELEMENT_NAME("QHeaderView"_L1 ); |
382 | ADD_BASIC_SELECTOR; |
383 | ADD_SELECTOR; |
384 | |
385 | SET_PROPERTY("-qt-background-role"_L1 , QtBackgroundRole); |
386 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Window); |
387 | ADD_DECLARATION; |
388 | |
389 | ADD_STYLE_RULE; |
390 | } |
391 | |
392 | /*QTableCornerButton::section, QHeaderView::section { |
393 | -qt-background-role: button; |
394 | -qt-style-features: background-color; //if style is not pixmap based |
395 | border: native; |
396 | }*/ |
397 | { |
398 | SET_ELEMENT_NAME("QTableCornerButton"_L1 ); |
399 | ADD_PSEUDO("section"_L1 , PseudoClass_Unknown); |
400 | ADD_BASIC_SELECTOR; |
401 | ADD_SELECTOR; |
402 | |
403 | SET_ELEMENT_NAME("QHeaderView"_L1 ); |
404 | ADD_PSEUDO("section"_L1 , PseudoClass_Unknown); |
405 | ADD_BASIC_SELECTOR; |
406 | ADD_SELECTOR; |
407 | |
408 | SET_PROPERTY("-qt-background-role"_L1 , QtBackgroundRole); |
409 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Button); |
410 | ADD_DECLARATION; |
411 | |
412 | if (!styleIsPixmapBased) { |
413 | SET_PROPERTY("-qt-style-features"_L1 , QtStyleFeatures); |
414 | ADD_VALUE(QCss::Value::Identifier, QString::fromLatin1("background-color" )); |
415 | ADD_DECLARATION; |
416 | } |
417 | |
418 | SET_PROPERTY("border"_L1 , Border); |
419 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Native); |
420 | ADD_DECLARATION; |
421 | |
422 | ADD_STYLE_RULE; |
423 | } |
424 | |
425 | /*QProgressBar { |
426 | -qt-background-role: base; |
427 | }*/ |
428 | { |
429 | SET_ELEMENT_NAME("QProgressBar"_L1 ); |
430 | ADD_BASIC_SELECTOR; |
431 | ADD_SELECTOR; |
432 | |
433 | SET_PROPERTY("-qt-background-role"_L1 , QtBackgroundRole); |
434 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Base); |
435 | ADD_DECLARATION; |
436 | |
437 | ADD_STYLE_RULE; |
438 | } |
439 | |
440 | /*QScrollBar { |
441 | -qt-background-role: window; |
442 | }*/ |
443 | { |
444 | SET_ELEMENT_NAME("QScrollBar"_L1 ); |
445 | ADD_BASIC_SELECTOR; |
446 | ADD_SELECTOR; |
447 | |
448 | SET_PROPERTY("-qt-background-role"_L1 , QtBackgroundRole); |
449 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Window); |
450 | ADD_DECLARATION; |
451 | |
452 | ADD_STYLE_RULE; |
453 | } |
454 | |
455 | /*QDockWidget { |
456 | border: native; |
457 | }*/ |
458 | { |
459 | SET_ELEMENT_NAME("QDockWidget"_L1 ); |
460 | ADD_BASIC_SELECTOR; |
461 | ADD_SELECTOR; |
462 | |
463 | SET_PROPERTY("border"_L1 , Border); |
464 | ADD_VALUE(QCss::Value::KnownIdentifier, Value_Native); |
465 | ADD_DECLARATION; |
466 | |
467 | ADD_STYLE_RULE; |
468 | } |
469 | |
470 | sheet.origin = StyleSheetOrigin_UserAgent; |
471 | sheet.buildIndexes(); |
472 | return sheet; |
473 | } |
474 | |
475 | #endif // #ifndef QT_NO_STYLE_STYLESHEET |
476 | |
477 | QT_END_NAMESPACE |
478 | |