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