-rw-r--r-- | library/lightstyle.cpp | 1284 |
1 files changed, 1284 insertions, 0 deletions
diff --git a/library/lightstyle.cpp b/library/lightstyle.cpp new file mode 100644 index 0000000..f18bdca --- a/dev/null +++ b/library/lightstyle.cpp | |||
@@ -0,0 +1,1284 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of Qtopia Environment. | ||
5 | ** | ||
6 | ** This file may be distributed and/or modified under the terms of the | ||
7 | ** GNU General Public License version 2 as published by the Free Software | ||
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | ||
9 | ** packaging of this file. | ||
10 | ** | ||
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||
13 | ** | ||
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
15 | ** | ||
16 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
17 | ** not clear to you. | ||
18 | ** | ||
19 | **********************************************************************/ | ||
20 | #include "lightstyle.h" | ||
21 | |||
22 | #if QT_VERSION < 300 | ||
23 | |||
24 | #define INCLUDE_MENUITEM_DEF | ||
25 | #include "qmenubar.h" | ||
26 | #include "qapplication.h" | ||
27 | #include "qpainter.h" | ||
28 | #include "qpalette.h" | ||
29 | #include "qframe.h" | ||
30 | #include "qpushbutton.h" | ||
31 | #include "qdrawutil.h" | ||
32 | #include "qscrollbar.h" | ||
33 | #include "qtabbar.h" | ||
34 | #include "qguardedptr.h" | ||
35 | #include "qlayout.h" | ||
36 | #include "qlineedit.h" | ||
37 | |||
38 | |||
39 | class LightStylePrivate | ||
40 | { | ||
41 | public: | ||
42 | LightStylePrivate() | ||
43 | : hoverWidget(0), ref(1), savePalette(0) | ||
44 | { | ||
45 | } | ||
46 | |||
47 | QGuardedPtr<QWidget> hoverWidget; | ||
48 | QPalette oldPalette, hoverPalette; | ||
49 | int ref; | ||
50 | QPoint mousePos; | ||
51 | QPalette *savePalette; | ||
52 | }; | ||
53 | |||
54 | |||
55 | static LightStylePrivate *singleton = 0; | ||
56 | |||
57 | |||
58 | LightStyle::LightStyle() | ||
59 | : QWindowsStyle() | ||
60 | { | ||
61 | if (! singleton) { | ||
62 | singleton = new LightStylePrivate; | ||
63 | |||
64 | QPalette pal = QApplication::palette(); | ||
65 | singleton->oldPalette = pal; | ||
66 | |||
67 | QColor bg = pal.color(QPalette::Active, QColorGroup::Background); | ||
68 | QColor prelight; | ||
69 | |||
70 | if ( (bg.red() + bg.green() + bg.blue()) / 3 > 128) | ||
71 | prelight = pal.color(QPalette::Active, | ||
72 | QColorGroup::Background).light(110); | ||
73 | else | ||
74 | prelight = pal.color(QPalette::Active, | ||
75 | QColorGroup::Background).light(120); | ||
76 | |||
77 | QColorGroup active2(pal.color(QPalette::Active, | ||
78 | QColorGroup::Foreground), // foreground | ||
79 | prelight, // button | ||
80 | prelight.light(), // light | ||
81 | prelight.dark(), // dark | ||
82 | prelight.dark(120), // mid | ||
83 | pal.color(QPalette::Active, | ||
84 | QColorGroup::Text), // text | ||
85 | pal.color(QPalette::Active, | ||
86 | QColorGroup::BrightText), // bright text | ||
87 | pal.color(QPalette::Active, | ||
88 | QColorGroup::Base), // base | ||
89 | bg); // background | ||
90 | active2.setColor(QColorGroup::Highlight, | ||
91 | pal.color(QPalette::Active, QColorGroup::Highlight)); | ||
92 | |||
93 | singleton->hoverPalette = pal; | ||
94 | singleton->hoverPalette.setActive(active2); | ||
95 | singleton->hoverPalette.setInactive(active2); | ||
96 | } else | ||
97 | singleton->ref++; | ||
98 | } | ||
99 | |||
100 | |||
101 | LightStyle::~LightStyle() | ||
102 | { | ||
103 | if (singleton && singleton->ref-- <= 0) { | ||
104 | delete singleton; | ||
105 | singleton = 0; | ||
106 | } | ||
107 | } | ||
108 | |||
109 | |||
110 | QSize LightStyle::scrollBarExtent() const | ||
111 | { | ||
112 | return QSize(12 + defaultFrameWidth(), 12 + defaultFrameWidth()); | ||
113 | } | ||
114 | |||
115 | |||
116 | int LightStyle::buttonDefaultIndicatorWidth() const | ||
117 | { | ||
118 | return 2; | ||
119 | } | ||
120 | |||
121 | |||
122 | int LightStyle::sliderThickness() const | ||
123 | { | ||
124 | return 16; | ||
125 | } | ||
126 | |||
127 | int LightStyle::sliderLength() const | ||
128 | { | ||
129 | return 13; | ||
130 | } | ||
131 | |||
132 | |||
133 | int LightStyle::buttonMargin() const | ||
134 | { | ||
135 | return 4; | ||
136 | } | ||
137 | |||
138 | |||
139 | QSize LightStyle::exclusiveIndicatorSize() const | ||
140 | { | ||
141 | return QSize(13, 13); | ||
142 | } | ||
143 | |||
144 | |||
145 | int LightStyle::defaultFrameWidth() const | ||
146 | { | ||
147 | return 2; | ||
148 | } | ||
149 | |||
150 | |||
151 | QSize LightStyle::indicatorSize() const | ||
152 | { | ||
153 | return QSize(13, 13); | ||
154 | } | ||
155 | |||
156 | |||
157 | void LightStyle::polish(QWidget *widget) | ||
158 | { | ||
159 | if (widget->inherits("QPushButton")) | ||
160 | widget->installEventFilter(this); | ||
161 | |||
162 | #if QT_VERSION >= 300 | ||
163 | if (widget->inherits("QLineEdit")) { | ||
164 | QLineEdit *lineedit = (QLineEdit *) widget; | ||
165 | lineedit->setFrameShape(QFrame::StyledPanel); | ||
166 | lineedit->setLineWidth(2); | ||
167 | } | ||
168 | #endif | ||
169 | |||
170 | QWindowsStyle::polish(widget); | ||
171 | } | ||
172 | |||
173 | |||
174 | void LightStyle::unPolish(QWidget *widget) | ||
175 | { | ||
176 | if (widget->inherits("QPushButton")) | ||
177 | widget->removeEventFilter(this); | ||
178 | |||
179 | #if QT_VERSION >= 300 | ||
180 | if (widget->inherits("QLineEdit")) { | ||
181 | QLineEdit *lineedit = (QLineEdit *) widget; | ||
182 | lineedit->setLineWidth(1); | ||
183 | lineedit->setFrameShape(QFrame::WinPanel); | ||
184 | } | ||
185 | #endif | ||
186 | |||
187 | QWindowsStyle::unPolish(widget); | ||
188 | } | ||
189 | |||
190 | |||
191 | void LightStyle::polish(QApplication *app) | ||
192 | { | ||
193 | QPalette pal = app->palette(); | ||
194 | |||
195 | QColorGroup active(pal.color(QPalette::Active, | ||
196 | QColorGroup::Foreground), // foreground | ||
197 | pal.color(QPalette::Active, | ||
198 | QColorGroup::Button), // button | ||
199 | pal.color(QPalette::Active, | ||
200 | QColorGroup::Background).light(), // light | ||
201 | pal.color(QPalette::Active, | ||
202 | QColorGroup::Background).dark(175), // dark | ||
203 | pal.color(QPalette::Active, | ||
204 | QColorGroup::Background).dark(110), // mid | ||
205 | pal.color(QPalette::Active, | ||
206 | QColorGroup::Text), // text | ||
207 | pal.color(QPalette::Active, | ||
208 | QColorGroup::BrightText), // bright text | ||
209 | pal.color(QPalette::Active, | ||
210 | QColorGroup::Base), // base | ||
211 | pal.color(QPalette::Active, | ||
212 | QColorGroup::Background)), // background | ||
213 | |||
214 | |||
215 | disabled(pal.color(QPalette::Disabled, | ||
216 | QColorGroup::Foreground), // foreground | ||
217 | pal.color(QPalette::Disabled, | ||
218 | QColorGroup::Button), // button | ||
219 | pal.color(QPalette::Disabled, | ||
220 | QColorGroup::Background).light(), // light | ||
221 | pal.color(QPalette::Disabled, | ||
222 | QColorGroup::Background).dark(), // dark | ||
223 | pal.color(QPalette::Disabled, | ||
224 | QColorGroup::Background).dark(110), // mid | ||
225 | pal.color(QPalette::Disabled, | ||
226 | QColorGroup::Text), // text | ||
227 | pal.color(QPalette::Disabled, | ||
228 | QColorGroup::BrightText), // bright text | ||
229 | pal.color(QPalette::Disabled, | ||
230 | QColorGroup::Base), // base | ||
231 | pal.color(QPalette::Disabled, | ||
232 | QColorGroup::Background)); // background | ||
233 | |||
234 | active.setColor(QColorGroup::Highlight, | ||
235 | pal.color(QPalette::Active, QColorGroup::Highlight)); | ||
236 | disabled.setColor(QColorGroup::Highlight, | ||
237 | pal.color(QPalette::Disabled, QColorGroup::Highlight)); | ||
238 | |||
239 | active.setColor(QColorGroup::HighlightedText, | ||
240 | pal.color(QPalette::Active, QColorGroup::HighlightedText)); | ||
241 | disabled.setColor(QColorGroup::HighlightedText, | ||
242 | pal.color(QPalette::Disabled, QColorGroup::HighlightedText)); | ||
243 | |||
244 | pal.setActive(active); | ||
245 | pal.setInactive(active); | ||
246 | pal.setDisabled(disabled); | ||
247 | |||
248 | singleton->oldPalette = pal; | ||
249 | |||
250 | QColor bg = pal.color(QPalette::Active, QColorGroup::Background); | ||
251 | QColor prelight; | ||
252 | |||
253 | if ( (bg.red() + bg.green() + bg.blue()) / 3 > 128) | ||
254 | prelight = pal.color(QPalette::Active, | ||
255 | QColorGroup::Background).light(110); | ||
256 | else | ||
257 | prelight = pal.color(QPalette::Active, | ||
258 | QColorGroup::Background).light(120); | ||
259 | |||
260 | QColorGroup active2(pal.color(QPalette::Active, | ||
261 | QColorGroup::Foreground), // foreground | ||
262 | prelight, // button | ||
263 | prelight.light(), // light | ||
264 | prelight.dark(), // dark | ||
265 | prelight.dark(120), // mid | ||
266 | pal.color(QPalette::Active, | ||
267 | QColorGroup::Text), // text | ||
268 | pal.color(QPalette::Active, | ||
269 | QColorGroup::BrightText), // bright text | ||
270 | pal.color(QPalette::Active, | ||
271 | QColorGroup::Base), // base | ||
272 | bg); // background | ||
273 | active2.setColor(QColorGroup::Highlight, | ||
274 | pal.color(QPalette::Active, QColorGroup::Highlight)); | ||
275 | |||
276 | singleton->hoverPalette = pal; | ||
277 | singleton->hoverPalette.setActive(active2); | ||
278 | singleton->hoverPalette.setInactive(active2); | ||
279 | |||
280 | app->setPalette(pal); | ||
281 | } | ||
282 | |||
283 | |||
284 | void LightStyle::unPolish(QApplication *app) | ||
285 | { | ||
286 | app->setPalette(singleton->oldPalette); | ||
287 | } | ||
288 | |||
289 | |||
290 | void LightStyle::polishPopupMenu(QPopupMenu *menu) | ||
291 | { | ||
292 | menu->setMouseTracking(TRUE); | ||
293 | } | ||
294 | |||
295 | |||
296 | void LightStyle::drawPushButton(QPushButton *button, QPainter *p) | ||
297 | { | ||
298 | int x1, y1, x2, y2; | ||
299 | button->rect().coords(&x1, &y1, &x2, &y2); | ||
300 | |||
301 | if (button->isDefault()) { | ||
302 | p->save(); | ||
303 | p->setPen(button->palette().active().color(QColorGroup::Highlight)); | ||
304 | p->setBrush(button->palette().active().brush(QColorGroup::Highlight)); | ||
305 | p->drawRoundRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1, 15, 15); | ||
306 | p->restore(); | ||
307 | } | ||
308 | |||
309 | if (button->isDefault() || button->autoDefault()) { | ||
310 | x1 += buttonDefaultIndicatorWidth(); | ||
311 | y1 += buttonDefaultIndicatorWidth(); | ||
312 | x2 -= buttonDefaultIndicatorWidth(); | ||
313 | y2 -= buttonDefaultIndicatorWidth(); | ||
314 | |||
315 | if (button->isDefault()) { | ||
316 | QPointArray pa(8); | ||
317 | pa.setPoint(0, x1 + 2, y1 ); | ||
318 | pa.setPoint(1, x2 - 1, y1 ); | ||
319 | pa.setPoint(2, x2 + 1, y1 + 2); | ||
320 | pa.setPoint(3, x2 + 1, y2 - 2); | ||
321 | pa.setPoint(4, x2 - 2, y2 + 1); | ||
322 | pa.setPoint(5, x1 + 2, y2 + 1); | ||
323 | pa.setPoint(6, x1, y2 - 1); | ||
324 | pa.setPoint(7, x1, y1 + 2); | ||
325 | QRegion r(pa); | ||
326 | p->setClipRegion(r); | ||
327 | } | ||
328 | } | ||
329 | |||
330 | QBrush fill; | ||
331 | if (button->isDown() || button->isOn()) | ||
332 | fill = button->colorGroup().brush(QColorGroup::Mid); | ||
333 | else | ||
334 | fill = button->colorGroup().brush(QColorGroup::Button); | ||
335 | |||
336 | if ( !button->isFlat() || button->isOn() || button->isDown() ) | ||
337 | drawButton(p, x1, y1, x2 - x1 + 1, y2 - y1 + 1, | ||
338 | button->colorGroup(), button->isOn() || button->isDown(), &fill); | ||
339 | } | ||
340 | |||
341 | |||
342 | void LightStyle::drawButton(QPainter *p, int x, int y, int w, int h, | ||
343 | const QColorGroup &g, | ||
344 | bool sunken, const QBrush *fill) | ||
345 | { | ||
346 | p->save(); | ||
347 | if ( fill ) | ||
348 | p->fillRect(x + 2, y + 2, w - 4, h - 4, *fill); | ||
349 | else | ||
350 | p->fillRect(x + 2, y + 2, w - 4, h - 4, | ||
351 | QBrush(sunken ? g.mid() : g.button())); | ||
352 | |||
353 | // frame | ||
354 | p->setPen(g.dark()); | ||
355 | p->drawLine(x, y + 2, x, y + h - 3); // left | ||
356 | p->drawLine(x + 2, y, x + w - 3, y); // top | ||
357 | p->drawLine(x + w - 1, y + 2, x + w - 1, y + h - 3); // right | ||
358 | p->drawLine(x + 2, y + h - 1, x + w - 3, y + h - 1); // bottom | ||
359 | p->drawPoint(x + 1, y + 1); | ||
360 | p->drawPoint(x + 1, y + h - 2); | ||
361 | p->drawPoint(x + w - 2, y + 1); | ||
362 | p->drawPoint(x + w - 2, y + h - 2); | ||
363 | |||
364 | // bevel | ||
365 | if (sunken) | ||
366 | p->setPen(g.mid()); | ||
367 | else | ||
368 | p->setPen(g.light()); | ||
369 | |||
370 | p->drawLine(x + 1, y + 2, x + 1, y + h - 3); // left | ||
371 | p->drawLine(x + 2, y + 1, x + w - 3, y + 1); // top | ||
372 | |||
373 | if (sunken) | ||
374 | p->setPen(g.light()); | ||
375 | else | ||
376 | p->setPen(g.mid()); | ||
377 | |||
378 | p->drawLine(x + w - 2, y + 2, x + w - 2, y + h - 3); // right + 1 | ||
379 | p->drawLine(x + 2, y + h - 2, x + w - 3, y + h - 2); // bottom + 1 | ||
380 | |||
381 | p->restore(); | ||
382 | } | ||
383 | |||
384 | |||
385 | void LightStyle::drawBevelButton(QPainter *p, int x, int y, int w, int h, | ||
386 | const QColorGroup &g, | ||
387 | bool sunken, const QBrush *fill) | ||
388 | { | ||
389 | drawButton(p, x, y, w, h, g, sunken, fill); | ||
390 | } | ||
391 | |||
392 | |||
393 | void LightStyle::getButtonShift(int &x, int &y) const | ||
394 | { | ||
395 | x = y = 0; | ||
396 | } | ||
397 | |||
398 | |||
399 | void LightStyle::drawComboButton(QPainter *p, int x, int y, int w, int h, | ||
400 | const QColorGroup &g, bool, | ||
401 | bool editable, bool, | ||
402 | const QBrush *fill) | ||
403 | { | ||
404 | drawButton(p, x, y, w, h, g, FALSE, fill); | ||
405 | |||
406 | if (editable) { | ||
407 | QRect r = comboButtonRect(x, y, w, h); | ||
408 | qDrawShadePanel(p, r.x() - 1, r.y() - 1, | ||
409 | r.width() + defaultFrameWidth(), | ||
410 | r.height() + defaultFrameWidth(), | ||
411 | g, TRUE); | ||
412 | } | ||
413 | |||
414 | int indent = ((y + h) / 2) - 3; | ||
415 | int xpos = x; | ||
416 | |||
417 | #if QT_VERSION >= 300 | ||
418 | if( QApplication::reverseLayout() ) | ||
419 | xpos += indent; | ||
420 | else | ||
421 | #endif | ||
422 | xpos += w - indent - 5; | ||
423 | |||
424 | drawArrow(p, Qt::DownArrow, TRUE, xpos, indent, 5, 5, g, TRUE, fill); | ||
425 | } | ||
426 | |||
427 | |||
428 | QRect LightStyle::comboButtonRect( int x, int y, int w, int h ) const | ||
429 | { | ||
430 | QRect r(x + 3, y + 3, w - 6, h - 6); | ||
431 | int indent = ((y + h) / 2) - 3; | ||
432 | r.setRight(r.right() - indent - 10); | ||
433 | |||
434 | #if QT_VERSION >= 300 | ||
435 | if( QApplication::reverseLayout() ) | ||
436 | r.moveBy( indent + 10, 0 ); | ||
437 | #endif | ||
438 | |||
439 | return r; | ||
440 | } | ||
441 | |||
442 | |||
443 | QRect LightStyle::comboButtonFocusRect(int x, int y, int w, int h ) const | ||
444 | { | ||
445 | return comboButtonRect(x, y, w, h); | ||
446 | } | ||
447 | |||
448 | |||
449 | void LightStyle::drawPanel(QPainter *p, int x, int y, int w, int h, | ||
450 | const QColorGroup &g, bool sunken, | ||
451 | int lw, const QBrush *fill) | ||
452 | { | ||
453 | if (lw >= 2) { | ||
454 | if ( fill ) | ||
455 | p->fillRect(x + 2, y + 2, w - 4, h - 4, *fill); | ||
456 | |||
457 | QPen oldpen = p->pen(); | ||
458 | |||
459 | // frame | ||
460 | p->setPen(g.dark()); | ||
461 | p->drawLine(x, y + 2, x, y + h - 3); // left | ||
462 | p->drawLine(x + 2, y, x + w - 3, y); // top | ||
463 | p->drawLine(x + w - 1, y + 2, x + w - 1, y + h - 3); // right | ||
464 | p->drawLine(x + 2, y + h - 1, x + w - 3, y + h - 1); // bottom | ||
465 | p->drawPoint(x + 1, y + 1); | ||
466 | p->drawPoint(x + 1, y + h - 2); | ||
467 | p->drawPoint(x + w - 2, y + 1); | ||
468 | p->drawPoint(x + w - 2, y + h - 2); | ||
469 | |||
470 | // bevel | ||
471 | if (sunken) | ||
472 | p->setPen(g.mid()); | ||
473 | else | ||
474 | p->setPen(g.light()); | ||
475 | |||
476 | p->drawLine(x + 1, y + 2, x + 1, y + h - 3); // left | ||
477 | p->drawLine(x + 2, y + 1, x + w - 3, y + 1); // top | ||
478 | |||
479 | if (sunken) | ||
480 | p->setPen(g.light()); | ||
481 | else | ||
482 | p->setPen(g.mid()); | ||
483 | |||
484 | p->drawLine(x + w - 2, y + 2, x + w - 2, y + h - 3); // right + 1 | ||
485 | p->drawLine(x + 2, y + h - 2, x + w - 3, y + h - 2); // bottom + 1 | ||
486 | |||
487 | // corners | ||
488 | p->setPen(g.background()); | ||
489 | p->drawLine(x, y, x + 1, y); | ||
490 | p->drawLine(x, y + h - 1, x + 1, y + h - 1); | ||
491 | p->drawLine(x + w - 2, y, x + w - 1, y); | ||
492 | p->drawLine(x + w - 2, y + h - 1, x + w - 1, y + h - 1); | ||
493 | p->drawPoint(x, y + 1); | ||
494 | p->drawPoint(x, y + h - 2); | ||
495 | p->drawPoint(x + w - 1, y + 1); | ||
496 | p->drawPoint(x + w - 1, y + h - 2); | ||
497 | |||
498 | p->setPen(oldpen); | ||
499 | } else | ||
500 | qDrawShadePanel(p, x, y, w, h, g, sunken, lw, fill); | ||
501 | } | ||
502 | |||
503 | |||
504 | void LightStyle::drawIndicator(QPainter *p, int x, int y ,int w, int h, | ||
505 | const QColorGroup &g, int state, | ||
506 | bool down, bool) | ||
507 | { | ||
508 | drawButton(p, x, y, w, h, g, TRUE, | ||
509 | &g.brush(down ? QColorGroup::Mid : QColorGroup::Base)); | ||
510 | |||
511 | p->save(); | ||
512 | |||
513 | p->setPen(g.foreground()); | ||
514 | if (state == QButton::NoChange) { | ||
515 | p->drawLine(x + 3, y + h / 2, x + w - 4, y + h / 2); | ||
516 | p->drawLine(x + 3, y + 1 + h / 2, x + w - 4, y + 1 + h / 2); | ||
517 | p->drawLine(x + 3, y - 1 + h / 2, x + w - 4, y - 1 + h / 2); | ||
518 | } else if (state == QButton::On) { | ||
519 | p->drawLine(x + 4, y + 3, x + w - 4, y + h - 5); | ||
520 | p->drawLine(x + 3, y + 3, x + w - 4, y + h - 4); | ||
521 | p->drawLine(x + 3, y + 4, x + w - 5, y + h - 4); | ||
522 | p->drawLine(x + 3, y + h - 5, x + w - 5, y + 3); | ||
523 | p->drawLine(x + 3, y + h - 4, x + w - 4, y + 3); | ||
524 | p->drawLine(x + 4, y + h - 4, x + w - 4, y + 4); | ||
525 | } | ||
526 | |||
527 | p->restore(); | ||
528 | } | ||
529 | |||
530 | |||
531 | void LightStyle::drawExclusiveIndicator(QPainter *p, int x, int y, int w, int h, | ||
532 | const QColorGroup &g, bool on, | ||
533 | bool down, bool) | ||
534 | { | ||
535 | p->save(); | ||
536 | |||
537 | p->fillRect(x, y, w, h, g.brush(QColorGroup::Background)); | ||
538 | |||
539 | p->setPen(g.dark()); | ||
540 | p->drawArc(x, y, w, h, 0, 16*360); | ||
541 | p->setPen(g.mid()); | ||
542 | p->drawArc(x + 1, y + 1, w - 2, h - 2, 45*16, 180*16); | ||
543 | p->setPen(g.light()); | ||
544 | p->drawArc(x + 1, y + 1, w - 2, h - 2, 235*16, 180*16); | ||
545 | |||
546 | p->setPen(down ? g.mid() : g.base()); | ||
547 | p->setBrush(down ? g.mid() : g.base()); | ||
548 | p->drawEllipse(x + 2, y + 2, w - 4, h - 4); | ||
549 | |||
550 | if (on) { | ||
551 | p->setBrush(g.foreground()); | ||
552 | p->drawEllipse(x + 3, y + 3, w - x - 6, h - y - 6); | ||
553 | } | ||
554 | |||
555 | p->restore(); | ||
556 | } | ||
557 | |||
558 | |||
559 | |||
560 | #if 1 | ||
561 | //copied from QPE style | ||
562 | void LightStyle::drawTab( QPainter *p, const QTabBar *tb, QTab *t, bool selected ) | ||
563 | { | ||
564 | #if 0 | ||
565 | //We can't do this, because QTabBar::focusInEvent redraws the | ||
566 | // tab label with the default font. | ||
567 | QFont f = tb->font(); | ||
568 | f.setBold( selected ); | ||
569 | p->setFont( f ); | ||
570 | #endif | ||
571 | QRect r( t->rect() ); | ||
572 | if ( tb->shape() == QTabBar::RoundedAbove ) { | ||
573 | p->setPen( tb->colorGroup().light() ); | ||
574 | p->drawLine( r.left(), r.bottom(), r.right(), r.bottom() ); | ||
575 | if ( r.left() == 0 ) | ||
576 | p->drawPoint( tb->rect().bottomLeft() ); | ||
577 | else { | ||
578 | p->setPen( tb->colorGroup().light() ); | ||
579 | p->drawLine( r.left(), r.bottom(), r.right(), r.bottom() ); | ||
580 | } | ||
581 | |||
582 | if ( selected ) { | ||
583 | p->setPen( tb->colorGroup().background() ); | ||
584 | p->drawLine( r.left()+2, r.top()+1, r.right()-2, r.top()+1 ); | ||
585 | p->fillRect( QRect( r.left()+1, r.top()+2, r.width()-2, r.height()-2), | ||
586 | tb->colorGroup().brush( QColorGroup::Background )); | ||
587 | |||
588 | } else { | ||
589 | r.setRect( r.left() + 2, r.top() + 2, | ||
590 | r.width() - 4, r.height() - 2 ); | ||
591 | p->setPen( tb->colorGroup().button() ); | ||
592 | p->drawLine( r.left()+2, r.top()+1, r.right()-2, r.top()+1 ); | ||
593 | p->fillRect( QRect( r.left()+1, r.top()+2, r.width()-2, r.height()-3), | ||
594 | tb->colorGroup().brush( QColorGroup::Button )); | ||
595 | //do shading; will not work for pixmap brushes | ||
596 | QColor bg = tb->colorGroup().button(); | ||
597 | // int h,s,v; | ||
598 | // bg.hsv( &h, &s, &v ); | ||
599 | int n = r.height()/2; | ||
600 | int dark = 100; | ||
601 | for ( int i = 1; i < n; i++ ) { | ||
602 | dark = (dark * (100+(i*15)/n) )/100; | ||
603 | p->setPen( bg.dark( dark ) ); | ||
604 | int y = r.bottom()-n+i; | ||
605 | int x1 = r.left()+1; | ||
606 | int x2 = r.right()-1; | ||
607 | p->drawLine( x1, y, x2, y ); | ||
608 | } | ||
609 | |||
610 | } | ||
611 | |||
612 | p->setPen( tb->colorGroup().light() ); | ||
613 | p->drawLine( r.left(), r.bottom()-1, r.left(), r.top() + 2 ); | ||
614 | p->drawPoint( r.left()+1, r.top() + 1 ); | ||
615 | p->drawLine( r.left()+2, r.top(), | ||
616 | r.right() - 2, r.top() ); | ||
617 | |||
618 | p->setPen( tb->colorGroup().dark() ); | ||
619 | p->drawPoint( r.right() - 1, r.top() + 1 ); | ||
620 | p->drawLine( r.right(), r.top() + 2, r.right(), r.bottom() - 1); | ||
621 | } else if ( tb->shape() == QTabBar::RoundedBelow ) { | ||
622 | if ( selected ) { | ||
623 | p->setPen( tb->colorGroup().background() ); | ||
624 | p->drawLine( r.left()+2, r.bottom()-1, r.right()-2, r.bottom()-1 ); | ||
625 | p->fillRect( QRect( r.left()+1, r.top(), r.width()-2, r.height()-2), | ||
626 | tb->palette().normal().brush( QColorGroup::Background )); | ||
627 | } else { | ||
628 | p->setPen( tb->colorGroup().dark() ); | ||
629 | p->drawLine( r.left(), r.top(), | ||
630 | r.right(), r.top() ); | ||
631 | r.setRect( r.left() + 2, r.top(), | ||
632 | r.width() - 4, r.height() - 2 ); | ||
633 | p->setPen( tb->colorGroup().button() ); | ||
634 | p->drawLine( r.left()+2, r.bottom()-1, r.right()-2, r.bottom()-1 ); | ||
635 | p->fillRect( QRect( r.left()+1, r.top()+1, r.width()-2, r.height()-3), | ||
636 | tb->palette().normal().brush( QColorGroup::Button )); | ||
637 | } | ||
638 | |||
639 | p->setPen( tb->colorGroup().dark() ); | ||
640 | p->drawLine( r.right(), r.top(), | ||
641 | r.right(), r.bottom() - 2 ); | ||
642 | p->drawPoint( r.right() - 1, r.bottom() - 1 ); | ||
643 | p->drawLine( r.right() - 2, r.bottom(), | ||
644 | r.left() + 2, r.bottom() ); | ||
645 | |||
646 | p->setPen( tb->colorGroup().light() ); | ||
647 | p->drawLine( r.left(), r.top()+1, | ||
648 | r.left(), r.bottom() - 2 ); | ||
649 | p->drawPoint( r.left() + 1, r.bottom() - 1 ); | ||
650 | if ( r.left() == 0 ) | ||
651 | p->drawPoint( tb->rect().topLeft() ); | ||
652 | |||
653 | } else { | ||
654 | QCommonStyle::drawTab( p, tb, t, selected ); | ||
655 | } | ||
656 | } | ||
657 | |||
658 | #else | ||
659 | |||
660 | void LightStyle::drawTab(QPainter *p, const QTabBar *tabbar, QTab *tab, | ||
661 | bool selected) | ||
662 | { | ||
663 | p->save(); | ||
664 | |||
665 | QColorGroup g = tabbar->colorGroup(); | ||
666 | QRect fr(tab->r); | ||
667 | fr.setLeft(fr.left() + 2); | ||
668 | |||
669 | if (! selected) { | ||
670 | if (tabbar->shape() == QTabBar::RoundedAbove || | ||
671 | tabbar->shape() == QTabBar::TriangularAbove) { | ||
672 | |||
673 | fr.setTop(fr.top() + 2); | ||
674 | } else { | ||
675 | fr.setBottom(fr.bottom() - 2); | ||
676 | } | ||
677 | } | ||
678 | |||
679 | QRegion tabr(tab->r); | ||
680 | |||
681 | QPointArray cliptri(4); | ||
682 | cliptri.setPoint(0, fr.left(), fr.top()); | ||
683 | cliptri.setPoint(1, fr.left(), fr.top() + 5); | ||
684 | cliptri.setPoint(2, fr.left() + 5, fr.top()); | ||
685 | cliptri.setPoint(3, fr.left(), fr.top()); | ||
686 | QRegion trir(cliptri); | ||
687 | p->setClipRegion(tabr - trir); | ||
688 | |||
689 | p->setPen( NoPen ); | ||
690 | p->setBrush(g.brush(selected ? QColorGroup::Background : QColorGroup::Mid)); | ||
691 | |||
692 | fr.setWidth(fr.width() - 1); | ||
693 | p->drawRect(fr.left() + 1, fr.top() + 1, fr.width() - 2, fr.height() - 2); | ||
694 | |||
695 | if (tabbar->shape() == QTabBar::RoundedAbove) { | ||
696 | // "rounded" tabs on top | ||
697 | fr.setBottom(fr.bottom() - 1); | ||
698 | |||
699 | p->setPen(g.dark()); | ||
700 | p->drawLine(fr.left(), fr.top() + 5, fr.left(), fr.bottom() - 1); | ||
701 | p->drawLine(fr.left(), fr.top() + 5, fr.left() + 5, fr.top()); | ||
702 | p->drawLine(fr.left() + 5, fr.top(), fr.right() - 1, fr.top()); | ||
703 | p->drawLine(fr.right(), fr.top() + 1, fr.right(), fr.bottom() - 1); | ||
704 | |||
705 | if (selected) { | ||
706 | p->drawLine(fr.right(), fr.bottom(), fr.right() + 2, fr.bottom()); | ||
707 | p->drawPoint(fr.left(), fr.bottom()); | ||
708 | } else | ||
709 | p->drawLine(fr.left(), fr.bottom(), fr.right() + 2, fr.bottom()); | ||
710 | |||
711 | if (fr.left() == 2) { | ||
712 | p->drawPoint(fr.left() - 1, fr.bottom() + 1); | ||
713 | p->drawPoint(fr.left() - 2, fr.bottom() + 2); | ||
714 | } | ||
715 | |||
716 | if (selected) { | ||
717 | p->setPen(g.mid()); | ||
718 | p->drawLine(fr.right() - 1, fr.top() + 1, fr.right() - 1, fr.bottom() - 2); | ||
719 | } | ||
720 | |||
721 | p->setPen(g.light()); p->setPen(red); | ||
722 | p->drawLine(fr.left() + 1, fr.top() + 6, fr.left() + 1, | ||
723 | fr.bottom() - (selected ? 0 : 1)); | ||
724 | p->drawLine(fr.left() + 1, fr.top() + 5, fr.left() + 5, fr.top() + 1); | ||
725 | p->drawLine(fr.left() + 6, fr.top() + 1, fr.right() - 3, fr.top() + 1); | ||
726 | if (selected) { | ||
727 | p->drawLine(fr.right() + 1, fr.bottom() + 1, | ||
728 | fr.right() + 2, fr.bottom() + 1); | ||
729 | p->drawLine(fr.left(), fr.bottom() + 1, fr.left() + 1, fr.bottom() + 1); | ||
730 | } else | ||
731 | p->drawLine(fr.left(), fr.bottom() + 1, | ||
732 | fr.right() + 2, fr.bottom() + 1); | ||
733 | } else if (tabbar->shape() == QTabBar::RoundedBelow) { | ||
734 | // "rounded" tabs on bottom | ||
735 | fr.setTop(fr.top() + 1); | ||
736 | |||
737 | p->setPen(g.dark()); | ||
738 | p->drawLine(fr.left(), fr.top(), fr.left(), fr.bottom() - 1); | ||
739 | p->drawLine(fr.left() + 1, fr.bottom(), fr.right() - 1, fr.bottom()); | ||
740 | p->drawLine(fr.right(), fr.top(), fr.right(), fr.bottom() - 1); | ||
741 | |||
742 | if (! selected) | ||
743 | p->drawLine(fr.left(), fr.top(), fr.right() + 3, fr.top()); | ||
744 | else | ||
745 | p->drawLine(fr.right(), fr.top(), fr.right() + 3, fr.top()); | ||
746 | |||
747 | p->setPen(g.mid()); | ||
748 | if (selected) | ||
749 | p->drawLine(fr.right() - 1, fr.top() + 1, fr.right() - 1, fr.bottom() - 1); | ||
750 | else | ||
751 | p->drawLine(fr.left(), fr.top() - 1, fr.right() + 3, fr.top() - 1); | ||
752 | |||
753 | p->setPen(g.light()); | ||
754 | p->drawLine(fr.left() + 1, fr.top() + (selected ? -1 : 2), | ||
755 | fr.left() + 1, fr.bottom() - 1); | ||
756 | |||
757 | } else { | ||
758 | // triangular drawing code | ||
759 | QCommonStyle::drawTab(p, tabbar, tab, selected); | ||
760 | } | ||
761 | |||
762 | p->restore(); | ||
763 | } | ||
764 | #endif | ||
765 | |||
766 | void LightStyle::drawSlider(QPainter *p, int x, int y, int w, int h, | ||
767 | const QColorGroup &g, Qt::Orientation orientation, | ||
768 | bool above, bool below) | ||
769 | { | ||
770 | drawButton(p, x, y, w, h, g, FALSE, &g.brush(QColorGroup::Button)); | ||
771 | |||
772 | if (orientation == Horizontal) { | ||
773 | if (above && below) { | ||
774 | drawArrow(p, Qt::UpArrow, FALSE, x + 1, y + 1, w, h / 2, g, TRUE); | ||
775 | drawArrow(p, Qt::DownArrow, FALSE, x + 1, y + (h / 2) - 1, | ||
776 | w, h / 2, g, TRUE); | ||
777 | } else | ||
778 | drawArrow(p, (above) ? Qt::UpArrow : Qt::DownArrow, | ||
779 | FALSE, x + 1, y, w, h, g, TRUE); | ||
780 | } else { | ||
781 | if (above && below) { | ||
782 | drawArrow(p, Qt::LeftArrow, FALSE, x + 1, y, w / 2, h, g, TRUE); | ||
783 | drawArrow(p, Qt::RightArrow, FALSE, x + (w / 2) - 2, y, w / 2, h, g, TRUE); | ||
784 | } else | ||
785 | drawArrow(p, (above) ? Qt::LeftArrow : Qt::RightArrow, | ||
786 | FALSE, x, y, w, h, g, TRUE); | ||
787 | } | ||
788 | } | ||
789 | |||
790 | |||
791 | void LightStyle::drawSliderGroove(QPainter *p, int x, int y, int w, int h, | ||
792 | const QColorGroup& g, QCOORD c, | ||
793 | Qt::Orientation orientation) | ||
794 | { | ||
795 | if (orientation == Horizontal) | ||
796 | drawButton(p, x, y+c - 3, w, 6, g, TRUE, &g.brush(QColorGroup::Mid)); | ||
797 | else | ||
798 | drawButton(p, x+c - 3, y, 6, h, g, TRUE, &g.brush(QColorGroup::Mid)); | ||
799 | } | ||
800 | |||
801 | |||
802 | void LightStyle::scrollBarMetrics(const QScrollBar *scrollbar, | ||
803 | int &sliderMin, int &sliderMax, | ||
804 | int &sliderLength, int &buttonDim) const | ||
805 | { | ||
806 | int maxLength; | ||
807 | int length = ((scrollbar->orientation() == Horizontal) ? | ||
808 | scrollbar->width() : scrollbar->height()); | ||
809 | int extent = ((scrollbar->orientation() == Horizontal) ? | ||
810 | scrollbar->height() : scrollbar->width()); | ||
811 | extent--; | ||
812 | |||
813 | if (length > (extent + defaultFrameWidth() - 1) * 2 + defaultFrameWidth()) | ||
814 | buttonDim = extent - defaultFrameWidth(); | ||
815 | else | ||
816 | buttonDim = (length - defaultFrameWidth()) / 2 - 1; | ||
817 | |||
818 | sliderMin = buttonDim; | ||
819 | maxLength = length - buttonDim * 3; | ||
820 | |||
821 | if (scrollbar->maxValue() != scrollbar->minValue()) { | ||
822 | uint range = scrollbar->maxValue() - scrollbar->minValue(); | ||
823 | sliderLength = (scrollbar->pageStep() * maxLength) / | ||
824 | (range + scrollbar->pageStep()); | ||
825 | |||
826 | if (sliderLength < buttonDim || range > INT_MAX / 2) | ||
827 | sliderLength = buttonDim; | ||
828 | if (sliderLength > maxLength) | ||
829 | sliderLength = maxLength; | ||
830 | } else | ||
831 | sliderLength = maxLength; | ||
832 | |||
833 | sliderMax = sliderMin + maxLength - sliderLength; | ||
834 | } | ||
835 | |||
836 | |||
837 | QStyle::ScrollControl LightStyle::scrollBarPointOver(const QScrollBar *scrollbar, | ||
838 | int sliderStart, const QPoint &p) | ||
839 | { | ||
840 | if (! scrollbar->rect().contains(p)) | ||
841 | return NoScroll; | ||
842 | |||
843 | int sliderMin, sliderMax, sliderLength, buttonDim, pos; | ||
844 | scrollBarMetrics( scrollbar, sliderMin, sliderMax, sliderLength, buttonDim ); | ||
845 | |||
846 | if (scrollbar->orientation() == Horizontal) | ||
847 | pos = p.x(); | ||
848 | else | ||
849 | pos = p.y(); | ||
850 | |||
851 | if (pos < buttonDim) | ||
852 | return SubLine; | ||
853 | if (pos < sliderStart) | ||
854 | return SubPage; | ||
855 | if (pos < sliderStart + sliderLength) | ||
856 | return Slider; | ||
857 | if (pos < sliderMax + sliderLength) | ||
858 | return AddPage; | ||
859 | if (pos < sliderMax + sliderLength + buttonDim) | ||
860 | return SubLine; | ||
861 | return AddLine; | ||
862 | } | ||
863 | |||
864 | |||
865 | |||
866 | void LightStyle::drawScrollBarControls( QPainter* p, const QScrollBar* scrollbar, | ||
867 | int sliderStart, uint controls, | ||
868 | uint activeControl ) | ||
869 | { | ||
870 | QColorGroup g = scrollbar->colorGroup(); | ||
871 | |||
872 | int sliderMin, sliderMax, sliderLength, buttonDim; | ||
873 | scrollBarMetrics( scrollbar, sliderMin, sliderMax, sliderLength, buttonDim ); | ||
874 | |||
875 | if (sliderStart > sliderMax) { // sanity check | ||
876 | sliderStart = sliderMax; | ||
877 | } | ||
878 | |||
879 | QRect addR, subR, subR2, addPageR, subPageR, sliderR; | ||
880 | int length = ((scrollbar->orientation() == Horizontal) ? | ||
881 | scrollbar->width() : scrollbar->height()); | ||
882 | int extent = ((scrollbar->orientation() == Horizontal) ? | ||
883 | scrollbar->height() : scrollbar->width()); | ||
884 | |||
885 | |||
886 | int fudge = 3; //####disgusting hack | ||
887 | |||
888 | if (scrollbar->orientation() == Horizontal) { | ||
889 | subR.setRect(0, defaultFrameWidth(), | ||
890 | buttonDim + fudge, buttonDim); | ||
891 | subR2.setRect(length - (buttonDim * 2), defaultFrameWidth() , | ||
892 | buttonDim, buttonDim); | ||
893 | addR.setRect(length - buttonDim, defaultFrameWidth(), | ||
894 | buttonDim, buttonDim); | ||
895 | } else { | ||
896 | subR.setRect(defaultFrameWidth() + 1, 0, | ||
897 | buttonDim, buttonDim + fudge); | ||
898 | subR2.setRect(defaultFrameWidth() + 1, length - (buttonDim * 2), | ||
899 | buttonDim, buttonDim); | ||
900 | addR.setRect(defaultFrameWidth() + 1, length - buttonDim, | ||
901 | buttonDim, buttonDim); | ||
902 | } | ||
903 | |||
904 | int sliderEnd = sliderStart + sliderLength; | ||
905 | int sliderW = extent - defaultFrameWidth() - 1; | ||
906 | if (scrollbar->orientation() == Horizontal) { | ||
907 | subPageR.setRect( subR.right() + 1, defaultFrameWidth(), | ||
908 | sliderStart - subR.right() - 1 , sliderW ); | ||
909 | addPageR.setRect( sliderEnd, defaultFrameWidth(), | ||
910 | subR2.left() - sliderEnd, sliderW ); | ||
911 | sliderR.setRect( sliderStart, defaultFrameWidth(), sliderLength, sliderW ); | ||
912 | } else { | ||
913 | subPageR.setRect( defaultFrameWidth(), subR.bottom() + 1, | ||
914 | sliderW, sliderStart - subR.bottom() - 1 ); | ||
915 | addPageR.setRect( defaultFrameWidth(), sliderEnd, | ||
916 | sliderW, subR2.top() - sliderEnd ); | ||
917 | sliderR .setRect( defaultFrameWidth(), sliderStart, | ||
918 | sliderW, sliderLength ); | ||
919 | } | ||
920 | |||
921 | if ( controls == ( AddLine | SubLine | AddPage | SubPage | | ||
922 | Slider | First | Last ) ) { | ||
923 | if (scrollbar->orientation() == Horizontal) | ||
924 | qDrawShadePanel(p, 0, 0, length, 2, g, TRUE, 1, | ||
925 | &g.brush(QColorGroup::Background)); | ||
926 | else | ||
927 | qDrawShadePanel(p, 0, 0, 2, length, g, TRUE, 1, | ||
928 | &g.brush(QColorGroup::Background)); | ||
929 | } | ||
930 | |||
931 | if ( controls & AddLine ) | ||
932 | drawArrow( p, (scrollbar->orientation() == Vertical) ? DownArrow : RightArrow, | ||
933 | FALSE, addR.x(), addR.y(), | ||
934 | addR.width(), addR.height(), | ||
935 | (( activeControl == AddLine ) ? | ||
936 | singleton->hoverPalette.active() : g), | ||
937 | TRUE, &g.brush(QColorGroup::Background)); | ||
938 | if ( controls & SubLine ) { | ||
939 | drawArrow( p, (scrollbar->orientation() == Vertical) ? UpArrow : LeftArrow, | ||
940 | FALSE, subR.x(), subR.y(), | ||
941 | subR.width(), subR.height(), | ||
942 | (( activeControl == SubLine ) ? | ||
943 | singleton->hoverPalette.active() : g), | ||
944 | TRUE, &g.brush(QColorGroup::Background)); | ||
945 | drawArrow( p, (scrollbar->orientation() == Vertical) ? UpArrow : LeftArrow, | ||
946 | FALSE, subR2.x(), subR2.y(), | ||
947 | subR2.width(), subR2.height(), | ||
948 | (( activeControl == SubLine ) ? | ||
949 | singleton->hoverPalette.active() : g), | ||
950 | TRUE, &g.brush(QColorGroup::Background)); | ||
951 | } | ||
952 | |||
953 | if ( controls & SubPage ) | ||
954 | p->fillRect( subPageR, | ||
955 | ((activeControl == SubPage) ? | ||
956 | g.brush( QColorGroup::Dark ) : | ||
957 | g.brush( QColorGroup::Mid ))); | ||
958 | if ( controls & AddPage ) | ||
959 | p->fillRect( addPageR, | ||
960 | ((activeControl == AddPage) ? | ||
961 | g.brush( QColorGroup::Dark ) : | ||
962 | g.brush( QColorGroup::Mid ))); | ||
963 | |||
964 | if ( controls & Slider ) { | ||
965 | |||
966 | QPoint bo = p->brushOrigin(); | ||
967 | p->setBrushOrigin(sliderR.topLeft()); | ||
968 | if ( sliderR.isValid() ) { | ||
969 | p->fillRect( sliderR.x(), sliderR.y(), 2, 2, | ||
970 | g.brush( QColorGroup::Mid )); | ||
971 | p->fillRect( sliderR.x() + sliderR.width() - 2, | ||
972 | sliderR.y(), 2, 2, | ||
973 | g.brush( QColorGroup::Mid )); | ||
974 | p->fillRect( sliderR.x() + sliderR.width() - 2, | ||
975 | sliderR.y() + sliderR.height() - 2, 2, 2, | ||
976 | g.brush( QColorGroup::Mid )); | ||
977 | p->fillRect( sliderR.x(), | ||
978 | sliderR.y() + sliderR.height() - 2, 2, 2, | ||
979 | g.brush( QColorGroup::Mid )); | ||
980 | |||
981 | QColorGroup cg( g ); | ||
982 | cg.setBrush( QColorGroup::Background, g.brush( QColorGroup::Mid ) ); | ||
983 | drawBevelButton( p, sliderR.x(), sliderR.y(), | ||
984 | sliderR.width(), sliderR.height(), | ||
985 | cg, FALSE, &g.brush( QColorGroup::Button ) ); | ||
986 | } | ||
987 | |||
988 | p->setBrushOrigin(bo); | ||
989 | } | ||
990 | } | ||
991 | |||
992 | |||
993 | void LightStyle::drawToolBarHandle(QPainter *p, const QRect &rect, | ||
994 | Qt::Orientation orientation, | ||
995 | bool, const QColorGroup &g, bool) | ||
996 | { | ||
997 | p->save(); | ||
998 | p->setPen(g.mid()); | ||
999 | p->setBrush(g.brush(QColorGroup::Mid)); | ||
1000 | |||
1001 | if (orientation == Qt::Horizontal) { | ||
1002 | QRect l, r; | ||
1003 | l.setRect(rect.x() + 1, rect.y() + 1, rect.width() - 5, rect.height() - 2); | ||
1004 | r.setRect(l.right() + 1, l.y(), 3, l.height()); | ||
1005 | |||
1006 | p->drawRect(l); | ||
1007 | qDrawShadePanel(p, r, g, FALSE); | ||
1008 | } else { | ||
1009 | QRect t, b; | ||
1010 | t.setRect(rect.x() + 1, rect.y() + 1, rect.width() - 2, rect.height() - 5); | ||
1011 | b.setRect(t.x(), t.bottom() + 1, t.width(), 3); | ||
1012 | |||
1013 | p->drawRect(t); | ||
1014 | qDrawShadePanel(p, b, g, FALSE); | ||
1015 | } | ||
1016 | |||
1017 | p->restore(); | ||
1018 | } | ||
1019 | |||
1020 | |||
1021 | bool LightStyle::eventFilter(QObject *object, QEvent *event) | ||
1022 | { | ||
1023 | switch(event->type()) { | ||
1024 | case QEvent::Enter: | ||
1025 | { | ||
1026 | if (! object->isWidgetType() || | ||
1027 | ! object->inherits("QPushButton")) | ||
1028 | break; | ||
1029 | |||
1030 | singleton->hoverWidget = (QWidget *) object; | ||
1031 | if (! singleton->hoverWidget->isEnabled()) { | ||
1032 | singleton->hoverWidget = 0; | ||
1033 | break; | ||
1034 | } | ||
1035 | |||
1036 | QPalette pal = singleton->hoverWidget->palette(); | ||
1037 | if (singleton->hoverWidget->ownPalette()) | ||
1038 | singleton->savePalette = new QPalette(pal); | ||
1039 | |||
1040 | singleton->hoverWidget->setPalette(singleton->hoverPalette); | ||
1041 | |||
1042 | break; | ||
1043 | } | ||
1044 | |||
1045 | case QEvent::Leave: | ||
1046 | { | ||
1047 | if (object != singleton->hoverWidget) | ||
1048 | break; | ||
1049 | |||
1050 | if (singleton->savePalette) { | ||
1051 | singleton->hoverWidget->setPalette(*(singleton->savePalette)); | ||
1052 | delete singleton->savePalette; | ||
1053 | singleton->savePalette = 0; | ||
1054 | } else | ||
1055 | singleton->hoverWidget->unsetPalette(); | ||
1056 | |||
1057 | singleton->hoverWidget = 0; | ||
1058 | |||
1059 | break; | ||
1060 | } | ||
1061 | |||
1062 | default: | ||
1063 | { | ||
1064 | ; | ||
1065 | } | ||
1066 | } | ||
1067 | |||
1068 | return QWindowsStyle::eventFilter(object, event); | ||
1069 | } | ||
1070 | |||
1071 | |||
1072 | static const int motifItemFrame = 1;// menu item frame width | ||
1073 | static const int motifSepHeight = 2;// separator item height | ||
1074 | static const int motifItemHMargin = 1;// menu item hor text margin | ||
1075 | static const int motifItemVMargin = 2;// menu item ver text margin | ||
1076 | static const int motifArrowHMargin = 0;// arrow horizontal margin | ||
1077 | static const int motifTabSpacing = 12;// space between text and tab | ||
1078 | static const int motifCheckMarkHMargin = 1;// horiz. margins of check mark | ||
1079 | static const int windowsRightBorder= 8; // right border on windows | ||
1080 | static const int windowsCheckMarkWidth = 2; // checkmarks width on windows | ||
1081 | |||
1082 | /*! \reimp | ||
1083 | */ | ||
1084 | int LightStyle::extraPopupMenuItemWidth( bool checkable, int maxpmw, QMenuItem* mi, const QFontMetrics& /*fm*/ ) | ||
1085 | { | ||
1086 | #ifndef QT_NO_MENUDATA | ||
1087 | int w = 2*motifItemHMargin + 2*motifItemFrame; // a little bit of border can never harm | ||
1088 | |||
1089 | if ( mi->isSeparator() ) | ||
1090 | return 10; // arbitrary | ||
1091 | else if ( mi->pixmap() ) | ||
1092 | w += mi->pixmap()->width();// pixmap only | ||
1093 | |||
1094 | if ( !mi->text().isNull() ) { | ||
1095 | if ( mi->text().find('\t') >= 0 )// string contains tab | ||
1096 | w += motifTabSpacing; | ||
1097 | } | ||
1098 | |||
1099 | if ( maxpmw ) { // we have iconsets | ||
1100 | w += maxpmw; | ||
1101 | w += 6; // add a little extra border around the iconset | ||
1102 | } | ||
1103 | |||
1104 | if ( checkable && maxpmw < windowsCheckMarkWidth ) { | ||
1105 | w += windowsCheckMarkWidth - maxpmw; // space for the checkmarks | ||
1106 | } | ||
1107 | |||
1108 | if ( maxpmw > 0 || checkable ) // we have a check-column ( iconsets or checkmarks) | ||
1109 | w += motifCheckMarkHMargin; // add space to separate the columns | ||
1110 | |||
1111 | w += windowsRightBorder; // windows has a strange wide border on the right side | ||
1112 | |||
1113 | return w; | ||
1114 | #endif | ||
1115 | } | ||
1116 | |||
1117 | /*! \reimp | ||
1118 | */ | ||
1119 | int LightStyle::popupMenuItemHeight( bool /*checkable*/, QMenuItem* mi, const QFontMetrics& fm ) | ||
1120 | { | ||
1121 | #ifndef QT_NO_MENUDATA | ||
1122 | int h = 0; | ||
1123 | if ( mi->isSeparator() ) // separator height | ||
1124 | h = motifSepHeight; | ||
1125 | else if ( mi->pixmap() ) // pixmap height | ||
1126 | h = mi->pixmap()->height() + 2*motifItemFrame; | ||
1127 | else // text height | ||
1128 | h = fm.height() + 2*motifItemVMargin + 2*motifItemFrame; | ||
1129 | |||
1130 | if ( !mi->isSeparator() && mi->iconSet() != 0 ) { | ||
1131 | h = QMAX( h, mi->iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height() + 2*motifItemFrame ); | ||
1132 | } | ||
1133 | if ( mi->custom() ) | ||
1134 | h = QMAX( h, mi->custom()->sizeHint().height() + 2*motifItemVMargin + 2*motifItemFrame ) - 1; | ||
1135 | return h; | ||
1136 | #endif | ||
1137 | } | ||
1138 | |||
1139 | void LightStyle::drawPopupMenuItem( QPainter* p, bool checkable, int maxpmw, int tab, QMenuItem* mi, | ||
1140 | const QPalette& pal, | ||
1141 | bool act, bool enabled, int x, int y, int w, int h) | ||
1142 | { | ||
1143 | #ifndef QT_NO_MENUDATA | ||
1144 | const QColorGroup & g = pal.active(); | ||
1145 | bool dis = !enabled; | ||
1146 | QColorGroup itemg = dis ? pal.disabled() : pal.active(); | ||
1147 | |||
1148 | if ( checkable ) | ||
1149 | maxpmw = QMAX( maxpmw, 8 ); // space for the checkmarks | ||
1150 | |||
1151 | int checkcol = maxpmw; | ||
1152 | |||
1153 | if ( mi && mi->isSeparator() ) { // draw separator | ||
1154 | p->setPen( g.dark() ); | ||
1155 | p->drawLine( x, y, x+w, y ); | ||
1156 | p->setPen( g.light() ); | ||
1157 | p->drawLine( x, y+1, x+w, y+1 ); | ||
1158 | return; | ||
1159 | } | ||
1160 | |||
1161 | QBrush fill = act? g.brush( QColorGroup::Highlight ) : | ||
1162 | g.brush( QColorGroup::Button ); | ||
1163 | p->fillRect( x, y, w, h, fill); | ||
1164 | |||
1165 | if ( !mi ) | ||
1166 | return; | ||
1167 | |||
1168 | if ( mi->isChecked() ) { | ||
1169 | if ( act && !dis ) { | ||
1170 | qDrawShadePanel( p, x, y, checkcol, h, | ||
1171 | g, TRUE, 1, &g.brush( QColorGroup::Button ) ); | ||
1172 | } else { | ||
1173 | qDrawShadePanel( p, x, y, checkcol, h, | ||
1174 | g, TRUE, 1, &g.brush( QColorGroup::Midlight ) ); | ||
1175 | } | ||
1176 | } else if ( !act ) { | ||
1177 | p->fillRect(x, y, checkcol , h, | ||
1178 | g.brush( QColorGroup::Button )); | ||
1179 | } | ||
1180 | |||
1181 | if ( mi->iconSet() ) { // draw iconset | ||
1182 | QIconSet::Mode mode = dis ? QIconSet::Disabled : QIconSet::Normal; | ||
1183 | if (act && !dis ) | ||
1184 | mode = QIconSet::Active; | ||
1185 | QPixmap pixmap = mi->iconSet()->pixmap( QIconSet::Small, mode ); | ||
1186 | int pixw = pixmap.width(); | ||
1187 | int pixh = pixmap.height(); | ||
1188 | if ( act && !dis ) { | ||
1189 | if ( !mi->isChecked() ) | ||
1190 | qDrawShadePanel( p, x, y, checkcol, h, g, FALSE, 1, &g.brush( QColorGroup::Button ) ); | ||
1191 | } | ||
1192 | QRect cr( x, y, checkcol, h ); | ||
1193 | QRect pmr( 0, 0, pixw, pixh ); | ||
1194 | pmr.moveCenter( cr.center() ); | ||
1195 | p->setPen( itemg.text() ); | ||
1196 | p->drawPixmap( pmr.topLeft(), pixmap ); | ||
1197 | |||
1198 | QBrush fill = act? g.brush( QColorGroup::Highlight ) : | ||
1199 | g.brush( QColorGroup::Button ); | ||
1200 | p->fillRect( x+checkcol + 1, y, w - checkcol - 1, h, fill); | ||
1201 | } else if ( checkable ) {// just "checking"... | ||
1202 | int mw = checkcol + motifItemFrame; | ||
1203 | int mh = h - 2*motifItemFrame; | ||
1204 | if ( mi->isChecked() ) { | ||
1205 | drawCheckMark( p, x + motifItemFrame + 2, | ||
1206 | y+motifItemFrame, mw, mh, itemg, act, dis ); | ||
1207 | } | ||
1208 | } | ||
1209 | |||
1210 | p->setPen( act ? g.highlightedText() : g.buttonText() ); | ||
1211 | |||
1212 | QColor discol; | ||
1213 | if ( dis ) { | ||
1214 | discol = itemg.text(); | ||
1215 | p->setPen( discol ); | ||
1216 | } | ||
1217 | |||
1218 | int xm = motifItemFrame + checkcol + motifItemHMargin; | ||
1219 | |||
1220 | if ( mi->custom() ) { | ||
1221 | int m = motifItemVMargin; | ||
1222 | p->save(); | ||
1223 | if ( dis && !act ) { | ||
1224 | p->setPen( g.light() ); | ||
1225 | mi->custom()->paint( p, itemg, act, enabled, | ||
1226 | x+xm+1, y+m+1, w-xm-tab+1, h-2*m ); | ||
1227 | p->setPen( discol ); | ||
1228 | } | ||
1229 | mi->custom()->paint( p, itemg, act, enabled, | ||
1230 | x+xm, y+m, w-xm-tab+1, h-2*m ); | ||
1231 | p->restore(); | ||
1232 | } | ||
1233 | QString s = mi->text(); | ||
1234 | if ( !s.isNull() ) { // draw text | ||
1235 | int t = s.find( '\t' ); | ||
1236 | int m = motifItemVMargin; | ||
1237 | const int text_flags = AlignVCenter|ShowPrefix | DontClip | SingleLine; | ||
1238 | if ( t >= 0 ) { // draw tab text | ||
1239 | if ( dis && !act ) { | ||
1240 | p->setPen( g.light() ); | ||
1241 | p->drawText( x+w-tab-windowsRightBorder-motifItemHMargin-motifItemFrame+1, | ||
1242 | y+m+1, tab, h-2*m, text_flags, s.mid( t+1 )); | ||
1243 | p->setPen( discol ); | ||
1244 | } | ||
1245 | p->drawText( x+w-tab-windowsRightBorder-motifItemHMargin-motifItemFrame, | ||
1246 | y+m, tab, h-2*m, text_flags, s.mid( t+1 ) ); | ||
1247 | } | ||
1248 | if ( dis && !act ) { | ||
1249 | p->setPen( g.light() ); | ||
1250 | p->drawText( x+xm+1, y+m+1, w-xm+1, h-2*m, text_flags, s, t ); | ||
1251 | p->setPen( discol ); | ||
1252 | } | ||
1253 | p->drawText( x+xm, y+m, w-xm-tab+1, h-2*m, text_flags, s, t ); | ||
1254 | } else if ( mi->pixmap() ) { // draw pixmap | ||
1255 | QPixmap *pixmap = mi->pixmap(); | ||
1256 | if ( pixmap->depth() == 1 ) | ||
1257 | p->setBackgroundMode( OpaqueMode ); | ||
1258 | p->drawPixmap( x+xm, y+motifItemFrame, *pixmap ); | ||
1259 | if ( pixmap->depth() == 1 ) | ||
1260 | p->setBackgroundMode( TransparentMode ); | ||
1261 | } | ||
1262 | if ( mi->popup() ) { // draw sub menu arrow | ||
1263 | int dim = (h-2*motifItemFrame) / 2; | ||
1264 | if ( act ) { | ||
1265 | if ( !dis ) | ||
1266 | discol = white; | ||
1267 | QColorGroup g2( discol, g.highlight(), | ||
1268 | white, white, | ||
1269 | dis ? discol : white, | ||
1270 | discol, white ); | ||
1271 | drawArrow( p, RightArrow, FALSE, | ||
1272 | x+w - motifArrowHMargin - motifItemFrame - dim, y+h/2-dim/2, | ||
1273 | dim, dim, g2, TRUE ); | ||
1274 | } else { | ||
1275 | drawArrow( p, RightArrow, | ||
1276 | FALSE, | ||
1277 | x+w - motifArrowHMargin - motifItemFrame - dim, y+h/2-dim/2, | ||
1278 | dim, dim, g, mi->isEnabled() ); | ||
1279 | } | ||
1280 | } | ||
1281 | #endif | ||
1282 | } | ||
1283 | |||
1284 | #endif | ||