The API changed for rotations, requiring another argument for positions.
[contacts_plasmoid.git] / contactphoto.cpp
blob02d69a860bb91b0fe5b00527a035b8048e2b3d2a
2 #include "contactphoto.h"
3 #include <QPixmap>
4 #include <QPainter>
5 #include <QGraphicsSceneEvent>
6 #include <QImage>
7 #include <math.h>
8 #include <QDebug>
10 static const double pi = 3.14159265359;
13 ContactPhoto::ContactPhoto(QGraphicsWidget *parent,
14 QGraphicsScene *scene): QGraphicsWidget( parent ),
15 grabbed( false ),
16 photo( 0 ), source( 0 ),
17 shadow( 0 ), result( 0 )
19 QRectF tmp;
20 if (parent)
21 tmp = QRectF(10, 10, parent->geometry().width()/3,
22 parent->geometry().height()/3);
23 else
24 tmp = QRectF(10, 10, 100, 200);
26 setGeometry(tmp);
28 setAcceptsHoverEvents(true);
29 setFlag(ItemIgnoresParentOpacity);
33 void ContactPhoto::setPhoto(const QString &pixPath)
35 if ( !source )
36 source = new QImage;
37 source->load( pixPath );
39 if ( photo )
40 delete photo;
41 photo = new QPixmap( QPixmap::fromImage( *source ) );
45 ContactPhoto::~ContactPhoto()
48 delete photo;
49 delete source;
50 delete shadow;
51 delete result;
53 qDebug() << "contactphoto result: " << result << "\n";
56 void ContactPhoto::setShadow(const QString &pixPath)
58 QSize size(110, 110);
60 if ( !shadow )
61 shadow = new QImage;
62 shadow->load( pixPath );
64 qDebug() << "contactphoto result: " << result;
65 if ( !result )
66 result = new QImage( size, QImage::Format_ARGB32_Premultiplied );
67 qDebug() << "contactphoto result: " << result;
69 createShadow();
72 void ContactPhoto::createShadow()
75 QPainter painter( result );
76 painter.setCompositionMode(QPainter::CompositionMode_Source);
77 painter.fillRect(result->rect(), Qt::transparent);
78 painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
79 painter.drawImage(-10, -10, *shadow);
80 painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
81 painter.drawImage(0, 0, *source);
82 painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
83 painter.fillRect(result->rect(), Qt::transparent);
84 painter.end();
86 if ( photo )
87 delete photo;
88 photo = new QPixmap( QPixmap::fromImage( *result ) );
91 void ContactPhoto::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
92 QWidget *widget)
94 Q_UNUSED(widget);
95 Q_UNUSED(option);
96 painter->drawPixmap(QPoint(10, 10), *photo);
97 /* TODO: make a round image */
100 QRectF ContactPhoto::boundingRect() const
102 return QRectF(-100, -100, 200, 200);
106 /* TODO: cleanup this mess! */
107 /***************************************************************************/
108 static qreal lengthForPos(const QPointF &pos)
110 return ::sqrt(pos.x() * pos.x() + pos.y() * pos.y());
113 static qreal angleForPos(const QPointF &pos)
115 qreal angle = ::acos(pos.x() / lengthForPos(pos));
116 if (pos.y() > 0)
117 angle = pi * 2.0 - angle;
118 return angle;
121 void ContactPhoto::mousePressEvent(QGraphicsSceneMouseEvent *event)
123 return QGraphicsItem::mousePressEvent(event);
126 void ContactPhoto::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
128 if (!grabbed)
129 return QGraphicsItem::mouseMoveEvent(event);
131 /* TODO: use it for something useful */
132 QPointF buttonDownPos = mapFromScene(event->buttonDownScenePos(Qt::LeftButton));
136 void ContactPhoto::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
138 if (!grabbed)
139 return QGraphicsItem::mouseReleaseEvent(event);
141 grabbed = false;
142 update();
146 void ContactPhoto::setHover(qreal value)
148 hover = value;
149 update();