]> cloud.milkyroute.net Git - dolphin.git/blob - src/tooltips/kformattedballoontipdelegate.cpp
don't use empty dummy images if the preview takes a while to get generated, show...
[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 QLinearGradient gradient(option.rect.topLeft(), option.rect.bottomLeft());
66 gradient.setColorAt(0.0, fromColor);
67 gradient.setColorAt(1.0, toColor);
68 painter->setPen(Qt::NoPen);
69 painter->setBrush(gradient);
70
71 painter->drawPath(path);
72
73 const QIcon icon = item.icon();
74 int x = Border;
75 const int y = Border;
76 if (!icon.isNull()) {
77 const QSize iconSize = icon.actualSize(option.decorationSize);
78 const QPoint pos(x + option.rect.x(), y + option.rect.y());
79 painter->drawPixmap(pos, icon.pixmap(iconSize));
80 x += iconSize.width() + Border;
81 }
82
83 QTextDocument doc;
84 doc.setHtml(item.text());
85 QPixmap bitmap(doc.size().toSize());
86 bitmap.fill(Qt::transparent);
87 QPainter p(&bitmap);
88 doc.drawContents(&p);
89
90 const QRect docRect(QPoint(x, y), doc.size().toSize());
91 painter->drawPixmap(docRect, bitmap);
92 }
93
94 QRegion KFormattedBalloonTipDelegate::inputShape(const KStyleOptionToolTip &option) const
95 {
96 QBitmap bitmap(option.rect.size());
97 bitmap.fill(Qt::color0);
98
99 QPainter p(&bitmap);
100 p.setPen(QPen(Qt::color1, 1));
101 p.setBrush(Qt::color1);
102 p.drawPath(createPath(option));
103
104 return QRegion(bitmap);
105 }
106
107 QRegion KFormattedBalloonTipDelegate::shapeMask(const KStyleOptionToolTip &option) const
108 {
109 return inputShape(option);
110 }
111
112 static inline void arc(QPainterPath &path, qreal cx, qreal cy, qreal radius, qreal angle, qreal sweeplength)
113 {
114 path.arcTo(cx-radius, cy-radius, radius * 2, radius * 2, angle, sweeplength);
115 }
116
117 QPainterPath KFormattedBalloonTipDelegate::createPath(const KStyleOptionToolTip& option) const
118 {
119 const QRect rect = option.rect;
120 const qreal radius = 5;
121
122 QPainterPath path;
123 path.moveTo(rect.left(), rect.top() + radius);
124 arc(path, rect.left() + radius, rect.top() + radius, radius, 180, -90);
125 arc(path, rect.right() - radius, rect.top() + radius, radius, 90, -90);
126 arc(path, rect.right() - radius, rect.bottom() - radius, radius, 0, -90);
127 arc(path, rect.left() + radius, rect.bottom() - radius, radius, 270, -90);
128 path.closeSubpath();
129
130 return path;
131 }