fixes and improvements
[Sak.git] / sakmessageitem.cpp
blob10db290d9cfa5c3dd5d65d78edff9135e18e212e
1 #include "sakmessageitem.h"
3 SakMessageItem::SakMessageItem(const QString& message, const QPixmap& p) : QGraphicsItem(0) {
4 m_rect = QRectF(QPointF(0, 0), QSizeF(800, 200));
6 setAcceptsHoverEvents(true);
7 m_p=new QGraphicsPixmapItem(p.scaled(200, 600, Qt::KeepAspectRatio, Qt::SmoothTransformation),this);
8 m_p->setPos(0,0);
10 m_t = new QTextDocument;
11 m_t->setHtml(message);
12 m_t->setTextWidth(500);
14 setZValue(-1);
15 //setFlag(ItemIsMovable, true);
16 //setFlag(ItemIsSelectable, true);
19 SakMessageItem::~SakMessageItem()
21 delete m_p;
22 delete m_t;
25 void SakMessageItem::setGeometry(const QRect& r) {
26 prepareGeometryChange();
27 double xratio = r.width() / 800.0;
28 double yratio = r.height() / 200.0;
29 double ratio = qMin(xratio, yratio);
30 QTransform t;
31 t.scale(ratio, ratio);
32 setTransform(t);
33 setPos( 0, 0 );
34 m_cachedPixmap = QPixmap();
37 void SakMessageItem::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * )
39 if (m_cachedPixmap.isNull()) {
40 m_cachedPixmap = QPixmap(QSize((int)m_rect.width(), (int)m_rect.height()));
41 m_cachedPixmap.fill(QColor(255,255,255,0));
42 QPainter p(&m_cachedPixmap);
44 int m_border=20;
45 QPen pen;
46 pen.setWidth(4);
47 pen.setColor(QColor(Qt::white).darker(150));
48 p.setPen(pen);
49 p.setBrush(Qt::white);
51 QPainterPath path;
52 int curve = 15;
53 qreal w = 300 + qMin(600.0, m_t->documentLayout()->documentSize().width());
54 qreal h = qMax(80.0+m_border+curve, qMin(200.0, m_t->documentLayout()->documentSize().height() + 20));
55 path.moveTo(200 + m_border, 75);
56 path.lineTo(200, 75);
57 path.lineTo(200+m_border, 40);
58 path.lineTo(200+m_border, m_border + curve);
59 path.cubicTo(QPointF(200+m_border, m_border), QPointF(200+m_border, m_border), QPointF(200+m_border+curve, m_border));
60 path.lineTo(w-m_border-curve, m_border);
61 path.cubicTo(QPointF(w-m_border, m_border), QPointF(w-m_border, m_border), QPointF(w-m_border, m_border+curve));
62 path.lineTo(w-m_border, h-m_border-curve);
63 path.cubicTo(QPointF(w-m_border,h-m_border), QPointF(w-m_border,h-m_border), QPointF(w-m_border-curve,h-m_border));
64 path.lineTo(200+m_border+curve,h-m_border);
65 path.cubicTo(QPointF(200+m_border,h-m_border),QPointF(200+m_border,h-m_border),QPointF(200+m_border,h-m_border-curve));
66 path.closeSubpath();
67 p.drawPath(path);
69 p.translate(240,40);
70 m_t->drawContents(&p);
73 painter->save();
74 QRectF exposed = option->exposedRect.adjusted(-1,-1,1,1);
75 exposed &= QRectF(0,0, m_cachedPixmap.width(), m_cachedPixmap.height());
76 painter->drawPixmap(exposed, m_cachedPixmap, exposed);
77 painter->restore();