1 /***************************************************************************
2 * Copyright (C) 2011 by Till Theato (root@ttill.de) *
3 * This file is part of Kdenlive (www.kdenlive.org). *
5 * Kdenlive 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. *
10 * Kdenlive 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. *
15 * You should have received a copy of the GNU General Public License *
16 * along with Kdenlive. If not, see <http://www.gnu.org/licenses/>. *
17 ***************************************************************************/
19 #include "bpointitem.h"
20 #include "splineitem.h"
23 #include <QGraphicsSceneMouseEvent>
27 BPointItem::BPointItem(BPoint point, QGraphicsItem* parent) :
28 QAbstractGraphicsShapeItem(parent),
31 setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
33 setAcceptHoverEvents(true);
36 m_point.h1 = mapFromScene(point.h1);
37 m_point.p = mapFromScene(point.p);
38 m_point.h2 = mapFromScene(point.h2);
39 m_point.handlesLinked = false;
42 BPoint BPointItem::getPoint()
44 return BPoint(mapToScene(m_point.h1), mapToScene(m_point.p), mapToScene(m_point.h2));
47 void BPointItem::setPoint(BPoint point)
50 prepareGeometryChange();
51 m_point.h1 = mapFromScene(point.h1);
52 m_point.p = mapFromScene(point.p);
53 m_point.h2 = mapFromScene(point.h2);
56 int BPointItem::type() const
61 QRectF BPointItem::boundingRect() const
63 QPolygonF p = QPolygonF() << m_point.h1 << m_point.p << m_point.h2;
64 return p.boundingRect().adjusted(-6, -6, 6, 6);
67 void BPointItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
73 painter->setPen(QPen(Qt::yellow, 1, Qt::SolidLine));
74 painter->setBrush(QBrush(isSelected() ? Qt::red : Qt::yellow));
76 painter->setPen(QPen(Qt::gray, 1, Qt::SolidLine));
77 painter->setBrush(QBrush(Qt::gray));
79 painter->setRenderHint(QPainter::Antialiasing);
81 double handleSize = 6 / painter->matrix().m11();
82 double handleSizeHalf = handleSize / 2;
84 QPolygonF handle = QPolygonF() << QPointF(0, -handleSizeHalf) << QPointF(handleSizeHalf, 0) << QPointF(0, handleSizeHalf) << QPointF(-handleSizeHalf, 0);
86 painter->drawLine(m_point.h1, m_point.p);
87 painter->drawLine(m_point.p, m_point.h2);
89 #if QT_VERSION >= 0x040600
90 painter->drawConvexPolygon(handle.translated(m_point.h1.x(), m_point.h1.y()));
91 painter->drawConvexPolygon(handle.translated(m_point.h2.x(), m_point.h2.y()));
95 tmp.translate(m_point.h1.x(), m_point.h1.y());
96 painter->drawConvexPolygon(tmp);
98 tmp.translate(m_point.h2.x(), m_point.h2.y());
99 painter->drawConvexPolygon(tmp);
102 painter->drawEllipse(QRectF(m_point.p.x() - handleSizeHalf,
103 m_point.p.y() - handleSizeHalf, handleSize, handleSize));
106 int BPointItem::getSelection(QPointF pos)
108 QRectF mouseArea(pos.x() - 6, pos.y() - 6, 12, 12);
110 if (mouseArea.contains(m_point.h1))
112 else if (mouseArea.contains(m_point.p))
114 else if (mouseArea.contains(m_point.h2))
120 void BPointItem::mousePressEvent(QGraphicsSceneMouseEvent* event)
122 m_selection = getSelection(event->pos());
124 if (m_selection < 0) {
128 if (event->button() == Qt::RightButton && m_selection == 1) {
129 SplineItem *parent = qgraphicsitem_cast<SplineItem*>(parentItem());
131 parent->removeChild(this);
139 void BPointItem::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
141 prepareGeometryChange();
142 switch (m_selection) {
144 m_point.setH1(event->pos());
147 m_point.setP(event->pos());
150 m_point.setH2(event->pos());
155 SplineItem *parent = qgraphicsitem_cast<SplineItem*>(parentItem());
157 parent->updateSpline(true);
161 void BPointItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
164 SplineItem *parent = qgraphicsitem_cast<SplineItem*>(parentItem());
166 parent->updateSpline(false);
168 QGraphicsItem::mouseReleaseEvent(event);
171 void BPointItem::hoverMoveEvent(QGraphicsSceneHoverEvent* event)
173 if (getSelection(event->pos()) < 0)
176 setCursor(QCursor(Qt::PointingHandCursor));