Mercurial > projects > qtd
comparison demos/shared/arthurstyle.d @ 41:691e68637348
non-working deform example
author | maxter |
---|---|
date | Sun, 17 May 2009 12:41:14 +0000 |
parents | |
children | 4bbd9f3d9add |
comparison
equal
deleted
inserted
replaced
40:a5cc4ada07f5 | 41:691e68637348 |
---|---|
1 /**************************************************************************** | |
2 ** | |
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). | |
4 ** Contact: Qt Software Information (qt-info@nokia.com) | |
5 ** | |
6 ** This file is part of the demonstration applications of the Qt Toolkit. | |
7 ** | |
8 ** $QT_BEGIN_LICENSE:LGPL$ | |
9 ** Commercial Usage | |
10 ** Licensees holding valid Qt Commercial licenses may use this file in | |
11 ** accordance with the Qt Commercial License Agreement provided with the | |
12 ** Software or, alternatively, in accordance with the terms contained in | |
13 ** a written agreement between you and Nokia. | |
14 ** | |
15 ** GNU Lesser General Public License Usage | |
16 ** Alternatively, this file may be used under the terms of the GNU Lesser | |
17 ** General Public License version 2.1 as published by the Free Software | |
18 ** Foundation and appearing in the file LICENSE.LGPL included in the | |
19 ** packaging of this file. Please review the following information to | |
20 ** ensure the GNU Lesser General Public License version 2.1 requirements | |
21 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | |
22 ** | |
23 ** In addition, as a special exception, Nokia gives you certain | |
24 ** additional rights. These rights are described in the Nokia Qt LGPL | |
25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this | |
26 ** package. | |
27 ** | |
28 ** GNU General Public License Usage | |
29 ** Alternatively, this file may be used under the terms of the GNU | |
30 ** General Public License version 3.0 as published by the Free Software | |
31 ** Foundation and appearing in the file LICENSE.GPL included in the | |
32 ** packaging of this file. Please review the following information to | |
33 ** ensure the GNU General Public License version 3.0 requirements will be | |
34 ** met: http://www.gnu.org/copyleft/gpl.html. | |
35 ** | |
36 ** If you are unsure which license is appropriate for your use, please | |
37 ** contact the sales department at qt-sales@nokia.com. | |
38 ** $QT_END_LICENSE$ | |
39 ** | |
40 ****************************************************************************/ | |
41 | |
42 | |
43 //import arthurwidgets; | |
44 import | |
45 qt.gui.QLayout, | |
46 qt.gui.QWindowsStyle, | |
47 qt.gui.QPainter, | |
48 qt.gui.QPainterPath, | |
49 qt.gui.QPixmapCache, | |
50 qt.gui.QRadioButton, | |
51 qt.gui.QPushButton, | |
52 qt.gui.QGroupBox, | |
53 qt.gui.QLinearGradient, | |
54 qt.gui.QstyleOptionFrameV2, | |
55 qt.gui.QStyleOption; | |
56 | |
57 class ArthurStyle : QWindowsStyle | |
58 { | |
59 QPixmap cached(string img) | |
60 { | |
61 QPixmap pm = new QPixmap; | |
62 if (QPixmapCache.find(img, pm)) | |
63 return pm; | |
64 | |
65 pm = QPixmap.fromImage(new QImage(img), Qt.OrderedDither | Qt.OrderedAlphaDither); | |
66 if (pm.isNull) | |
67 return new QPixmap; | |
68 | |
69 QPixmapCache.insert(img, pm); | |
70 return pm; | |
71 } | |
72 | |
73 this() | |
74 { | |
75 //Q_INIT_RESOURCE(shared); | |
76 } | |
77 | |
78 | |
79 void drawHoverRect(QPainter painter, QRect r) | |
80 { | |
81 qreal h = r.height(); | |
82 qreal h2 = r.height() / 2.0; | |
83 QPainterPath path; | |
84 path.addRect(r.x() + h2, r.y() + 0, r.width() - h2 * 2, r.height()); | |
85 path.addEllipse(r.x(), r.y(), h, h); | |
86 path.addEllipse(r.x() + r.width() - h, r.y(), h, h); | |
87 path.setFillRule(Qt.WindingFill); | |
88 painter.setPen(Qt.NoPen); | |
89 painter.setBrush(new QColor(191, 215, 191)); | |
90 painter.setRenderHint(QPainter.Antialiasing); | |
91 painter.drawPath(path); | |
92 } | |
93 | |
94 | |
95 override void drawPrimitive(PrimitiveElement element, QStyleOption option, | |
96 QPainter painter, QWidget widget) | |
97 { | |
98 assert(option); | |
99 switch (element) | |
100 { | |
101 case PE_FrameFocusRect: | |
102 break; | |
103 | |
104 case PE_IndicatorRadioButton: | |
105 if (QStyleOptionButton button = cast(QStyleOptionButton)(option)) { | |
106 bool hover = (button.state & State_Enabled) && (button.state & State_MouseOver); | |
107 painter.save; | |
108 QPixmap radio; | |
109 if (hover) | |
110 drawHoverRect(painter, widget.rect); | |
111 | |
112 if (button.state & State_Sunken) | |
113 radio = cached(":res/images/radiobutton-on.png"); | |
114 else if (button.state & State_On) | |
115 radio = cached(":res/images/radiobutton_on.png"); | |
116 else | |
117 radio = cached(":res/images/radiobutton_off.png"); | |
118 painter.drawPixmap(button.rect.topLeft, radio); | |
119 | |
120 painter.restore(); | |
121 } | |
122 break; | |
123 | |
124 case PE_PanelButtonCommand: | |
125 if (QStyleOptionButton button = cast(QStyleOptionButton)(option)) { | |
126 bool hover = (button.state & State_Enabled) && (button.state & State_MouseOver); | |
127 | |
128 painter.save(); | |
129 QPushButton pushButton = cast(QPushButton)(widget); | |
130 assert(pushButton); | |
131 auto parent = pushButton.parentWidget; | |
132 if (parent && cast(QGroupBox)(parent)) { | |
133 auto lg = new QLinearGradient(0, 0, 0, parent.height); | |
134 lg.setColorAt(0, new QColor(224,224,224)); | |
135 lg.setColorAt(1, new QColor(255,255,255)); | |
136 painter.setPen(Qt.NoPen); | |
137 painter.setBrush(lg); | |
138 painter.setBrushOrigin(QPoint() - widget.mapToParent(QPoint(0,0))); | |
139 painter.drawRect(button.rect); | |
140 painter.setBrushOrigin(0, 0); | |
141 } | |
142 | |
143 bool down = (button.state & State_Sunken) || (button.state & State_On); | |
144 | |
145 QPixmap left, right, mid; | |
146 if (down) { | |
147 left = cached(":res/images/button_pressed_cap_left.png"); | |
148 right = cached(":res/images/button_pressed_cap_right.png"); | |
149 mid = cached(":res/images/button_pressed_stretch.png"); | |
150 } else { | |
151 left = cached(":res/images/button_normal_cap_left.png"); | |
152 right = cached(":res/images/button_normal_cap_right.png"); | |
153 mid = cached(":res/images/button_normal_stretch.png"); | |
154 } | |
155 painter.drawPixmap(button.rect.topLeft, left); | |
156 painter.drawTiledPixmap(new QRect(button.rect.x + left.width, | |
157 button.rect.y, | |
158 button.rect.width - left.width - right.width, | |
159 left.height), | |
160 mid); | |
161 painter.drawPixmap(button.rect.x + button.rect.width - right.width, | |
162 button.rect.y, | |
163 right); | |
164 if (hover) | |
165 painter.fillRect(widget.rect.adjusted(3,5,-3,-5), new QColor(31,127,31,63)); | |
166 painter.restore; | |
167 } | |
168 break; | |
169 | |
170 case PE_FrameGroupBox: | |
171 if (QStyleOptionFrameV2 group | |
172 = cast(QStyleOptionFrameV2)(option)) { | |
173 auto r = group.rect; | |
174 | |
175 painter.save(); | |
176 int radius = 14; | |
177 int radius2 = radius*2; | |
178 QPainterPath clipPath; | |
179 clipPath.moveTo(radius, 0); | |
180 clipPath.arcTo(r.right() - radius2, 0, radius2, radius2, 90, -90); | |
181 clipPath.arcTo(r.right() - radius2, r.bottom() - radius2, radius2, radius2, 0, -90); | |
182 clipPath.arcTo(r.left(), r.bottom() - radius2, radius2, radius2, 270, -90); | |
183 clipPath.arcTo(r.left(), r.top(), radius2, radius2, 180, -90); | |
184 painter.setClipPath(clipPath); | |
185 QPixmap titleStretch = cached(":res/images/title_stretch.png"); | |
186 QPixmap topLeft = cached(":res/images/groupframe_topleft.png"); | |
187 QPixmap topRight = cached(":res/images/groupframe_topright.png"); | |
188 QPixmap bottomLeft = cached(":res/images/groupframe_bottom_left.png"); | |
189 QPixmap bottomRight = cached(":res/images/groupframe_bottom_right.png"); | |
190 QPixmap leftStretch = cached(":res/images/groupframe_left_stretch.png"); | |
191 QPixmap topStretch = cached(":res/images/groupframe_top_stretch.png"); | |
192 QPixmap rightStretch = cached(":res/images/groupframe_right_stretch.png"); | |
193 QPixmap bottomStretch = cached(":res/images/groupframe_bottom_stretch.png"); | |
194 auto lg = new QLinearGradient(0, 0, 0, r.height()); | |
195 lg.setColorAt(0, new QColor(224,224,224)); | |
196 lg.setColorAt(1, new QColor(255,255,255)); | |
197 painter.setPen(Qt.NoPen); | |
198 painter.setBrush(lg); | |
199 painter.drawRect(r.adjusted(0, titleStretch.height()/2, 0, 0)); | |
200 painter.setClipping(false); | |
201 | |
202 int topFrameOffset = titleStretch.height()/2 - 2; | |
203 painter.drawPixmap(r.topLeft() + QPoint(0, topFrameOffset), topLeft); | |
204 painter.drawPixmap(r.topRight() - QPoint(topRight.width()-1, 0) | |
205 + QPoint(0, topFrameOffset), topRight); | |
206 painter.drawPixmap(r.bottomLeft() - QPoint(0, bottomLeft.height()-1), bottomLeft); | |
207 painter.drawPixmap(r.bottomRight() - QPoint(bottomRight.width()-1, | |
208 bottomRight.height()-1), bottomRight); | |
209 | |
210 QRect left = r; | |
211 left.setY(r.y() + topLeft.height() + topFrameOffset); | |
212 left.setWidth(leftStretch.width()); | |
213 left.setHeight(r.height() - topLeft.height() - bottomLeft.height() - topFrameOffset); | |
214 painter.drawTiledPixmap(left, leftStretch); | |
215 | |
216 QRect top = r; | |
217 top.setX(r.x() + topLeft.width()); | |
218 top.setY(r.y() + topFrameOffset); | |
219 top.setWidth(r.width() - topLeft.width() - topRight.width()); | |
220 top.setHeight(topLeft.height()); | |
221 painter.drawTiledPixmap(top, topStretch); | |
222 | |
223 QRect right = r; | |
224 right.setX(r.right() - rightStretch.width()+1); | |
225 right.setY(r.y() + topRight.height() + topFrameOffset); | |
226 right.setWidth(rightStretch.width()); | |
227 right.setHeight(r.height() - topRight.height() | |
228 - bottomRight.height() - topFrameOffset); | |
229 painter.drawTiledPixmap(right, rightStretch); | |
230 | |
231 QRect bottom = r; | |
232 bottom.setX(r.x() + bottomLeft.width()); | |
233 bottom.setY(r.bottom() - bottomStretch.height()+1); | |
234 bottom.setWidth(r.width() - bottomLeft.width() - bottomRight.width()); | |
235 bottom.setHeight(bottomLeft.height()); | |
236 painter.drawTiledPixmap(bottom, bottomStretch); | |
237 painter.restore(); | |
238 } | |
239 break; | |
240 | |
241 default: | |
242 QWindowsStyle.drawPrimitive(element, option, painter, widget); | |
243 break; | |
244 } | |
245 return; | |
246 } | |
247 | |
248 override void drawComplexControl(ComplexControl control, QStyleOptionComplex option, | |
249 QPainter painter, QWidget widget) | |
250 { | |
251 switch (control) { | |
252 case CC_Slider: | |
253 if (QStyleOptionSlider slider = cast(QStyleOptionSlider)(option)) { | |
254 QRect groove = subControlRect(CC_Slider, option, SC_SliderGroove, widget); | |
255 QRect handle = subControlRect(CC_Slider, option, SC_SliderHandle, widget); | |
256 | |
257 painter.save; | |
258 | |
259 bool hover = (slider.state & State_Enabled) && (slider.state & State_MouseOver); | |
260 if (hover) { | |
261 QRect moderated = widget.rect().adjusted(0, 4, 0, -4); | |
262 drawHoverRect(painter, moderated); | |
263 } | |
264 | |
265 if ((option.subControls & SC_SliderGroove) && groove.isValid()) { | |
266 QPixmap grv = cached(":res/images/slider_bar.png"); | |
267 painter.drawPixmap(new QRect(groove.x() + 5, groove.y(), | |
268 groove.width() - 10, grv.height()), | |
269 grv); | |
270 } | |
271 if ((option.subControls & SC_SliderHandle) && handle.isValid()) { | |
272 QPixmap hndl = cached(":res/images/slider_thumb_on.png"); | |
273 painter.drawPixmap(handle.topLeft(), hndl); | |
274 } | |
275 | |
276 painter.restore(); | |
277 } | |
278 break; | |
279 case CC_GroupBox: | |
280 if (QStyleOptionGroupBox groupBox | |
281 = cast(QStyleOptionGroupBox)(option)) { | |
282 auto groupBoxCopy = new QStyleOptionGroupBox(groupBox); | |
283 groupBoxCopy.setSubControls = groupBoxCopy.subControls & ~SC_GroupBoxLabel; | |
284 QWindowsStyle.drawComplexControl(control, groupBoxCopy, painter, widget); | |
285 | |
286 if (groupBox.subControls & SC_GroupBoxLabel) { | |
287 QRect r = groupBox.rect; | |
288 QPixmap titleLeft = cached(":res/images/title_cap_left.png"); | |
289 QPixmap titleRight = cached(":res/images/title_cap_right.png"); | |
290 QPixmap titleStretch = cached(":res/images/title_stretch.png"); | |
291 int txt_width = groupBox.fontMetrics.width(groupBox.text) + 20; | |
292 painter.drawPixmap(r.center().x() - txt_width/2, 0, titleLeft); | |
293 QRect tileRect = subControlRect(control, groupBox, SC_GroupBoxLabel, widget); | |
294 painter.drawTiledPixmap(tileRect, titleStretch); | |
295 painter.drawPixmap(tileRect.x() + tileRect.width(), 0, titleRight); | |
296 int opacity = 31; | |
297 painter.setPen(new QColor(0, 0, 0, opacity)); | |
298 painter.drawText(tileRect.translated(0, 1), | |
299 cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null); | |
300 painter.drawText(tileRect.translated(2, 1), | |
301 cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null); | |
302 painter.setPen(new QColor(0, 0, 0, opacity * 2)); | |
303 painter.drawText(tileRect.translated(1, 1), | |
304 cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null); | |
305 painter.setPen(new QColor(Qt.white)); | |
306 painter.drawText(tileRect, cast(int)(Qt.AlignVCenter | Qt.AlignHCenter), groupBox.text, null); | |
307 } | |
308 } | |
309 break; | |
310 default: | |
311 QWindowsStyle.drawComplexControl(control, option, painter, widget); | |
312 break; | |
313 } | |
314 return; | |
315 } | |
316 | |
317 override QRect subControlRect(QStyle_ComplexControl control, QStyleOptionComplex option, | |
318 int sc, QWidget widget = null) | |
319 { | |
320 QRect rect; | |
321 | |
322 auto subControl = cast(SubControl)sc; | |
323 | |
324 switch (control) { | |
325 default: | |
326 rect = QWindowsStyle.subControlRect(control, option, subControl, widget); | |
327 break; | |
328 case CC_GroupBox: | |
329 if (QStyleOptionGroupBox group | |
330 = cast(QStyleOptionGroupBox)(option)) { | |
331 switch (subControl) { | |
332 default: | |
333 rect = QWindowsStyle.subControlRect(control, option, subControl, widget); | |
334 break; | |
335 case SC_GroupBoxContents: | |
336 rect = QWindowsStyle.subControlRect(control, option, subControl, widget); | |
337 rect.adjust(0, -8, 0, 0); | |
338 break; | |
339 case SC_GroupBoxFrame: | |
340 rect = group.rect; | |
341 break; | |
342 case SC_GroupBoxLabel: | |
343 QPixmap titleLeft = cached(":res/images/title_cap_left.png"); | |
344 QPixmap titleRight = cached(":res/images/title_cap_right.png"); | |
345 QPixmap titleStretch = cached(":res/images/title_stretch.png"); | |
346 int txt_width = group.fontMetrics.width(group.text) + 20; | |
347 rect = new QRect(group.rect.center().x() - txt_width/2 + titleLeft.width(), 0, | |
348 txt_width - titleLeft.width() - titleRight.width(), | |
349 titleStretch.height()); | |
350 break; | |
351 } | |
352 } | |
353 break; | |
354 } | |
355 | |
356 if (control == CC_Slider && subControl == SC_SliderHandle) { | |
357 rect.setWidth(13); | |
358 rect.setHeight(27); | |
359 } else if (control == CC_Slider && subControl == SC_SliderGroove) { | |
360 rect.setHeight(9); | |
361 rect.moveTop(27/2 - 9/2); | |
362 } | |
363 return rect; | |
364 } | |
365 | |
366 override QSize sizeFromContents(ContentsType type, QStyleOption option, | |
367 QSize size, QWidget widget) | |
368 { | |
369 QSize newSize = QWindowsStyle.sizeFromContents(type, option, size, widget); | |
370 | |
371 switch (type) { | |
372 case CT_RadioButton: | |
373 newSize += QSize(20, 0); | |
374 break; | |
375 | |
376 case CT_PushButton: | |
377 newSize.setHeight(26); | |
378 break; | |
379 | |
380 case CT_Slider: | |
381 newSize.setHeight(27); | |
382 break; | |
383 | |
384 default: | |
385 break; | |
386 } | |
387 | |
388 return newSize; | |
389 } | |
390 | |
391 override int pixelMetric(PixelMetric pm, QStyleOption opt, QWidget widget) | |
392 { | |
393 if (pm == PM_SliderLength) | |
394 return 13; | |
395 return QWindowsStyle.pixelMetric(pm, opt, widget); | |
396 } | |
397 | |
398 override void polish(QWidget widget) | |
399 { | |
400 if (widget.layout() && cast(QGroupBox)(widget)) { | |
401 if (widget.findChildren!(QGroupBox).length == 0) { | |
402 widget.layout().setWidgetSpacing(0); // Why setSpacing was renamed to setWidgetSpacing? | |
403 widget.layout().setMargin(12); | |
404 } else { | |
405 widget.layout().setMargin(13); | |
406 } | |
407 } | |
408 | |
409 if (cast(QPushButton)(widget) | |
410 || cast(QRadioButton)(widget) | |
411 || cast(QSlider)(widget)) { | |
412 widget.setAttribute(Qt.WA_Hover); | |
413 } | |
414 | |
415 QPalette pal = widget.palette(); | |
416 if (widget.isWindow()) { | |
417 pal.setColor(QPalette.Window, new QColor(241, 241, 241)); | |
418 widget.setPalette(pal); | |
419 } | |
420 | |
421 } | |
422 | |
423 override void unpolish(QWidget widget) | |
424 { | |
425 if (cast(QPushButton)(widget) | |
426 || cast(QRadioButton)(widget) | |
427 || cast(QSlider)(widget)) { | |
428 widget.setAttribute(Qt.WA_Hover, false); | |
429 } | |
430 } | |
431 | |
432 override void polish(QPalette palette) | |
433 { | |
434 palette.setColor(QPalette.Window, new QColor(241, 241, 241)); | |
435 } | |
436 | |
437 override QRect subElementRect(SubElement element, QStyleOption option, QWidget widget) | |
438 { | |
439 QRect r; | |
440 switch(element) { | |
441 case SE_RadioButtonClickRect: | |
442 r = widget.rect(); | |
443 break; | |
444 case SE_RadioButtonContents: | |
445 r = widget.rect().adjusted(20, 0, 0, 0); | |
446 break; | |
447 default: | |
448 r = QWindowsStyle.subElementRect(element, option, widget); | |
449 break; | |
450 } | |
451 | |
452 if (cast(QRadioButton)(widget)) | |
453 r = r.adjusted(5, 0, -5, 0); | |
454 | |
455 return r; | |
456 } | |
457 } |