]> cloud.milkyroute.net Git - dolphin.git/blob - src/tooltips/kformattedballoontipdelegate.cpp
win32 compile fix
[dolphin.git] / src / tooltips / kformattedballoontipdelegate.cpp
1 /*******************************************************************************
2 * Copyright (C) 2008 by Fredrik Höglund <fredrik@kde.org> *
3 * Copyright (C) 2008 by Konstantin Heil <konst.heil@stud.uni-heidelberg.de> *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
19 *******************************************************************************/
20
21 #include "kformattedballoontipdelegate.h"
22 #include <QBitmap>
23 #include <QLinearGradient>
24 #include <QTextDocument>
25 #include <kcolorscheme.h>
26
27 KFormattedBalloonTipDelegate::KFormattedBalloonTipDelegate()
28 {
29 }
30
31 KFormattedBalloonTipDelegate::~KFormattedBalloonTipDelegate()
32 {
33 }
34
35 QSize KFormattedBalloonTipDelegate::sizeHint(const KStyleOptionToolTip *option, const KToolTipItem *item) const
36 {
37 QTextDocument doc;
38 doc.setHtml(item->text());
39 const QIcon icon = item->icon();
40
41 const QSize iconSize = icon.isNull() ? QSize(0, 0) : icon.actualSize(option->decorationSize);
42 const QSize docSize = doc.size().toSize();
43 QSize contentSize = iconSize + docSize;
44
45 // assure that the content height is large enough for the icon and the document
46 contentSize.setHeight(iconSize.height() > doc.size().height() ? iconSize.height() : doc.size().height());
47 return contentSize + QSize(Border * 3, Border * 2);
48 }
49
50 void KFormattedBalloonTipDelegate::paint(QPainter *painter,
51 const KStyleOptionToolTip *option,
52 const KToolTipItem *item) const
53 {
54 QColor toColor = option->palette.brush(QPalette::ToolTipBase).color();
55 QColor fromColor = KColorScheme::shade(toColor, KColorScheme::LightShade, 0.2);
56
57 QPainterPath path = createPath(*option);
58 if (haveAlphaChannel()) {
59 painter->setRenderHint(QPainter::Antialiasing);
60 painter->translate(.5, .5);
61 toColor.setAlpha(220);
62 fromColor.setAlpha(220);
63 }
64
65
66 QLinearGradient gradient(option->rect.topLeft(), option->rect.bottomLeft());
67 gradient.setColorAt(0.0, fromColor);
68 gradient.setColorAt(1.0, toColor);
69 painter->setPen(Qt::NoPen);
70 painter->setBrush(gradient);
71
72 painter->drawPath(path);
73
74 const QIcon icon = item->icon();
75 int x = Border;
76 const int y = Border;
77 if (!icon.isNull()) {
78 const QSize iconSize = icon.actualSize(option->decorationSize);
79 const QPoint pos(x + option->rect.x(), y + option->rect.y());
80 painter->drawPixmap(pos, icon.pixmap(iconSize));
81 x += iconSize.width() + Border;
82 }
83
84 QTextDocument doc;
85 doc.setHtml(item->text());
86 QPixmap bitmap(doc.size().toSize());
87 bitmap.fill(Qt::transparent);
88 QPainter p(&bitmap);
89 doc.drawContents(&p);
90
91 const QRect docRect(QPoint(x, y), doc.size().toSize());
92 painter->drawPixmap(docRect, bitmap);
93 }
94
95 QRegion KFormattedBalloonTipDelegate::inputShape(const KStyleOptionToolTip *option) const
96 {
97 QBitmap bitmap(option->rect.size());
98 bitmap.fill(Qt::color0);
99
100 QPainter p(&bitmap);
101 p.setPen(QPen(Qt::color1, 1));
102 p.setBrush(Qt::color1);
103 p.drawPath(createPath(*option));
104
105 return QRegion(bitmap);
106 }
107
108 QRegion KFormattedBalloonTipDelegate::shapeMask(const KStyleOptionToolTip *option) const
109 {
110 return inputShape(option);
111 }
112
113 static inline void arc(QPainterPath &path, qreal cx, qreal cy, qreal radius, qreal angle, qreal sweeplength)
114 {
115 path.arcTo(cx-radius, cy-radius, radius * 2, radius * 2, angle, sweeplength);
116 }
117
118 QPainterPath KFormattedBalloonTipDelegate::createPath(const KStyleOptionToolTip& option) const
119 {
120 const QRect rect = option.rect;
121 const qreal radius = 5;
122
123 QPainterPath path;
124 path.moveTo(rect.left(), rect.top() + radius);
125 arc(path, rect.left() + radius, rect.top() + radius, radius, 180, -90);
126 arc(path, rect.right() - radius, rect.top() + radius, radius, 90, -90);
127 arc(path, rect.right() - radius, rect.bottom() - radius, radius, 0, -90);
128 arc(path, rect.left() + radius, rect.bottom() - radius, radius, 270, -90);
129 path.closeSubpath();
130
131 return path;
132 }