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()));
94 tmp.translate(m_point.h1.x(), m_point.h1.y());
95 p.drawConvexPolygon(tmp);
96 tmp.translate(m_point.h2.x(), m_point.h2.y());
97 p.drawConvexPolygon(tmp);
100 painter->drawEllipse(QRectF(m_point.p.x() - handleSizeHalf,
101 m_point.p.y() - handleSizeHalf, handleSize, handleSize));
104 int BPointItem::getSelection(QPointF pos)
106 QRectF mouseArea(pos.x() - 6, pos.y() - 6, 12, 12);
108 if (mouseArea.contains(m_point.h1))
110 else if (mouseArea.contains(m_point.p))
112 else if (mouseArea.contains(m_point.h2))
118 void BPointItem::mousePressEvent(QGraphicsSceneMouseEvent* event)
120 m_selection = getSelection(event->pos());
122 if (m_selection < 0) {
126 if (event->button() == Qt::RightButton && m_selection == 1) {
127 SplineItem *parent = qgraphicsitem_cast<SplineItem*>(parentItem());
129 parent->removeChild(this);
137 void BPointItem::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
139 prepareGeometryChange();
140 switch (m_selection) {
142 m_point.setH1(event->pos());
145 m_point.setP(event->pos());
148 m_point.setH2(event->pos());
153 SplineItem *parent = qgraphicsitem_cast<SplineItem*>(parentItem());
155 parent->updateSpline(true);
159 void BPointItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
162 SplineItem *parent = qgraphicsitem_cast<SplineItem*>(parentItem());
164 parent->updateSpline(false);
166 QGraphicsItem::mouseReleaseEvent(event);
169 void BPointItem::hoverMoveEvent(QGraphicsSceneHoverEvent* event)
171 if (getSelection(event->pos()) < 0)
174 setCursor(QCursor(Qt::PointingHandCursor));