From: Till Theato Date: Fri, 7 Jan 2011 17:03:43 +0000 (+0000) Subject: corners on-monitor editing: add tools to move the sides (2 corners at once) X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=008116794aba70022f8ef9a990cc49bdcab77ac2;p=kdenlive corners on-monitor editing: add tools to move the sides (2 corners at once) svn path=/trunk/kdenlive/; revision=5293 --- diff --git a/src/onmonitoritems/onmonitorcornersitem.cpp b/src/onmonitoritems/onmonitorcornersitem.cpp index 2ad761c3..d887afe3 100644 --- a/src/onmonitoritems/onmonitorcornersitem.cpp +++ b/src/onmonitoritems/onmonitorcornersitem.cpp @@ -29,7 +29,8 @@ OnMonitorCornersItem::OnMonitorCornersItem(MonitorScene* scene, QGraphicsItem* parent) : AbstractOnMonitorItem(scene), - QGraphicsPolygonItem(parent) + QGraphicsPolygonItem(parent), + m_selectedCorner(-1) { setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); @@ -39,23 +40,34 @@ OnMonitorCornersItem::OnMonitorCornersItem(MonitorScene* scene, QGraphicsItem* p setBrush(Qt::NoBrush); } -OnMonitorCornersItem::cornersActions OnMonitorCornersItem::getMode(QPointF pos) +OnMonitorCornersItem::cornersActions OnMonitorCornersItem::getMode(QPointF pos, int *corner) { + *corner = -1; + QPainterPath mouseArea; pos = mapFromScene(pos); mouseArea.addRect(pos.x() - 6, pos.y() - 6, 12, 12); - if (mouseArea.contains(polygon().at(0))) - return Corner1; - else if (mouseArea.contains(polygon().at(1))) - return Corner2; - else if (mouseArea.contains(polygon().at(2))) - return Corner3; - else if (mouseArea.contains(polygon().at(3))) - return Corner4; - else if (KdenliveSettings::onmonitoreffects_cornersshowcontrols() && mouseArea.contains(getCentroid())) - return Move; - else - return NoAction; + for (int i = 0; i < 4; ++i) { + if (mouseArea.contains(polygon().at(i))) { + *corner = 1; + return Corner; + } + } + if (KdenliveSettings::onmonitoreffects_cornersshowcontrols()) { + if (mouseArea.contains(getCentroid())) + return Move; + + int j; + for (int i = 0; i < 4; ++i) { + j = (i + 1) % 4; + if (mouseArea.contains(QLineF(polygon().at(i), polygon().at(j)).pointAt(.5))) { + *corner = i; + return MoveSide; + } + } + } + + return NoAction; } void OnMonitorCornersItem::slotMousePressed(QGraphicsSceneMouseEvent* event) @@ -65,7 +77,7 @@ void OnMonitorCornersItem::slotMousePressed(QGraphicsSceneMouseEvent* event) if (!isEnabled()) return; - m_mode = getMode(event->scenePos()); + m_mode = getMode(event->scenePos(), &m_selectedCorner); m_lastPoint = event->scenePos(); } @@ -87,33 +99,27 @@ void OnMonitorCornersItem::slotMouseMoved(QGraphicsSceneMouseEvent* event) QPointF mousePos = mapFromScene(event->scenePos()); QPolygonF p = polygon(); switch (m_mode) { - case Corner1: - p.replace(0, mousePos); - m_modified = true; - break; - case Corner2: - p.replace(1, mousePos); - m_modified = true; - break; - case Corner3: - p.replace(2, mousePos); - m_modified = true; - break; - case Corner4: - p.replace(3, mousePos); + case Corner: + p.replace(m_selectedCorner, mousePos); m_modified = true; break; case Move: p.translate(mousePos - m_lastPoint); m_modified = true; break; + case MoveSide: + p[m_selectedCorner] += mousePos - m_lastPoint; + p[(m_selectedCorner + 1) % 4] += mousePos - m_lastPoint; + m_modified = true; + break; default: break; } m_lastPoint = mousePos; setPolygon(p); } else { - switch (getMode(event->scenePos())) { + int corner; + switch (getMode(event->scenePos(), &corner)) { case NoAction: emit requestCursor(QCursor(Qt::ArrowCursor)); break; @@ -138,20 +144,28 @@ void OnMonitorCornersItem::paint(QPainter* painter, const QStyleOptionGraphicsIt if (KdenliveSettings::onmonitoreffects_cornersshowlines()) QGraphicsPolygonItem::paint(painter, option, widget); + double baseSize = 1 / painter->matrix().m11(); painter->setRenderHint(QPainter::Antialiasing); painter->setBrush(QBrush(Qt::yellow)); - double handleSize = 4 / painter->matrix().m11(); - painter->drawEllipse(polygon().at(0), handleSize, handleSize); - painter->drawEllipse(polygon().at(1), handleSize, handleSize); - painter->drawEllipse(polygon().at(2), handleSize, handleSize); - painter->drawEllipse(polygon().at(3), handleSize, handleSize); + double handleSize = 4 * baseSize; + for (int i = 0; i < 4; ++i) + painter->drawEllipse(polygon().at(i), handleSize, handleSize); if (KdenliveSettings::onmonitoreffects_cornersshowcontrols()) { painter->setPen(QPen(Qt::red, 2, Qt::SolidLine)); + double toolSize = 6 * baseSize; + // move tool QPointF c = getCentroid(); - handleSize *= 1.5; - painter->drawLine(QLineF(c - QPointF(handleSize, handleSize), c + QPointF(handleSize, handleSize))); - painter->drawLine(QLineF(c - QPointF(-handleSize, handleSize), c + QPointF(-handleSize, handleSize))); + painter->drawLine(QLineF(c - QPointF(toolSize, toolSize), c + QPointF(toolSize, toolSize))); + painter->drawLine(QLineF(c - QPointF(-toolSize, toolSize), c + QPointF(-toolSize, toolSize))); + + // move side tools (2 corners at once) + int j; + for (int i = 0; i < 4; ++i) { + j = (i + 1) % 4; + QPointF m = QLineF(polygon().at(i), polygon().at(j)).pointAt(.5); + painter->drawRect(QRectF(-toolSize / 2., -toolSize / 2., toolSize, toolSize).translated(m)); + } } } diff --git a/src/onmonitoritems/onmonitorcornersitem.h b/src/onmonitoritems/onmonitorcornersitem.h index 8d7cacee..aaade57c 100644 --- a/src/onmonitoritems/onmonitorcornersitem.h +++ b/src/onmonitoritems/onmonitorcornersitem.h @@ -32,9 +32,9 @@ class OnMonitorCornersItem : public AbstractOnMonitorItem, public QGraphicsPolyg public: OnMonitorCornersItem(MonitorScene *scene, QGraphicsItem *parent = 0); - enum cornersActions { Corner1, Corner2, Corner3, Corner4, Move, NoAction }; + enum cornersActions { Corner, Move, MoveSide, NoAction }; /** @brief Gets The action mode for the area @param pos +- 4. */ - cornersActions getMode(QPointF pos); + cornersActions getMode(QPointF pos, int *corner); /** @brief Reimplemented to draw the handles. */ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0 ); @@ -53,6 +53,8 @@ private: QList sortedClockwise(); cornersActions m_mode; + /** Number of the selected corner or if in MoveSide mode number of the first corner on this side */ + int m_selectedCorner; QPointF m_lastPoint; };