From f30bf5047561cf6c76121ca553468336906e1e26 Mon Sep 17 00:00:00 2001 From: Till Theato Date: Sun, 20 Feb 2011 14:24:03 +0000 Subject: [PATCH] rotoscoping: make it easier to select points on the spline svn path=/trunk/kdenlive/; revision=5438 --- src/onmonitoritems/rotoscoping/bpointitem.cpp | 19 +++++++++++-------- src/onmonitoritems/rotoscoping/bpointitem.h | 3 +++ src/onmonitoritems/rotoscoping/splineitem.cpp | 9 +++++++-- src/onmonitoritems/rotoscoping/splineitem.h | 2 ++ 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/onmonitoritems/rotoscoping/bpointitem.cpp b/src/onmonitoritems/rotoscoping/bpointitem.cpp index 292ccad9..1635e546 100644 --- a/src/onmonitoritems/rotoscoping/bpointitem.cpp +++ b/src/onmonitoritems/rotoscoping/bpointitem.cpp @@ -22,6 +22,8 @@ #include #include #include +#include +#include BPointItem::BPointItem(BPoint point, QGraphicsItem* parent) : @@ -37,6 +39,8 @@ BPointItem::BPointItem(BPoint point, QGraphicsItem* parent) : m_point.p = mapFromScene(point.p); m_point.h2 = mapFromScene(point.h2); m_point.handlesLinked = false; + + m_view = scene()->views()[0]; } BPoint BPointItem::getPoint() @@ -105,14 +109,13 @@ void BPointItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option int BPointItem::getSelection(QPointF pos) { - QRectF mouseArea(pos.x() - 6, pos.y() - 6, 12, 12); - - if (mouseArea.contains(m_point.h1)) - return 0; - else if (mouseArea.contains(m_point.p)) - return 1; - else if (mouseArea.contains(m_point.h2)) - return 2; + QList d; + d << QLineF(pos, m_point.h1).length() << QLineF(pos, m_point.p).length() << QLineF(pos, m_point.h2).length(); + // index of point nearest to pos + int i = ( d[1] < d[0] && d[1] < d[2]) ? 1 : (d[0] < d[2] ? 0 : 2); + + if (d[i] < 6 / m_view->matrix().m11()) + return i; return -1; } diff --git a/src/onmonitoritems/rotoscoping/bpointitem.h b/src/onmonitoritems/rotoscoping/bpointitem.h index 5dfddfad..794bc8b5 100644 --- a/src/onmonitoritems/rotoscoping/bpointitem.h +++ b/src/onmonitoritems/rotoscoping/bpointitem.h @@ -24,6 +24,8 @@ #include #include +class QGraphicsView; + class BPointItem : public QAbstractGraphicsShapeItem { public: @@ -47,6 +49,7 @@ protected: private: BPoint m_point; int m_selection; + QGraphicsView *m_view; /** @brief Gets The action mode for the area @param pos +- 4. */ int getSelection(QPointF pos); diff --git a/src/onmonitoritems/rotoscoping/splineitem.cpp b/src/onmonitoritems/rotoscoping/splineitem.cpp index f9a7d579..508f69dc 100644 --- a/src/onmonitoritems/rotoscoping/splineitem.cpp +++ b/src/onmonitoritems/rotoscoping/splineitem.cpp @@ -24,6 +24,7 @@ #include #include #include +#include inline QPointF closestPointInRect(QPointF point, QRectF rect) @@ -63,6 +64,8 @@ SplineItem::SplineItem(const QList< BPoint >& points, QGraphicsItem* parent, QGr setBrush(Qt::NoBrush); setAcceptHoverEvents(true); + m_view = scene->views()[0]; + setPoints(points); } @@ -146,7 +149,8 @@ void SplineItem::mousePressEvent(QGraphicsSceneMouseEvent* event) return; if (m_closed) { - QRectF r(event->scenePos() - QPointF(6, 6), QSizeF(12, 12)); + qreal size = 12 / m_view->matrix().m11(); + QRectF r(event->scenePos() - QPointF(size / 2, size / 2), QSizeF(size, size)); if (event->button() == Qt::LeftButton && path().intersects(r) && !path().contains(r)) { double t = 0; BPointItem *i1, *i2; @@ -230,7 +234,8 @@ void SplineItem::hoverMoveEvent(QGraphicsSceneHoverEvent* event) { QGraphicsItem::hoverMoveEvent(event); - QRectF r(event->scenePos() - QPointF(6, 6), QSizeF(12, 12)); + qreal size = 12 / m_view->matrix().m11(); + QRectF r(event->scenePos() - QPointF(size / 2, size / 2), QSizeF(size, size)); if (path().intersects(r) && !path().contains(r)) setCursor(QCursor(Qt::PointingHandCursor)); else diff --git a/src/onmonitoritems/rotoscoping/splineitem.h b/src/onmonitoritems/rotoscoping/splineitem.h index 4b3599d4..fec4dfd1 100644 --- a/src/onmonitoritems/rotoscoping/splineitem.h +++ b/src/onmonitoritems/rotoscoping/splineitem.h @@ -23,6 +23,7 @@ #include class BPoint; +class QGraphicsView; class SplineItem : public QObject, public QGraphicsPathItem { @@ -54,6 +55,7 @@ private: bool m_closed; bool m_editing; + QGraphicsView *m_view; signals: void changed(bool editing); -- 2.39.2