From: Till Theato Date: Mon, 27 Dec 2010 23:52:43 +0000 (+0000) Subject: Allow keeping the aspect ratio (of the project) when resizing a geometry rect on... X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=8e04972abe9bd505c8b7b4c521eb2ef918a7e6b5;p=kdenlive Allow keeping the aspect ratio (of the project) when resizing a geometry rect on the monitor using CTRL + mouse drag svn path=/trunk/kdenlive/; revision=5212 --- diff --git a/src/geometrywidget.cpp b/src/geometrywidget.cpp index cbf9eec5..34d2b972 100644 --- a/src/geometrywidget.cpp +++ b/src/geometrywidget.cpp @@ -188,7 +188,7 @@ void GeometryWidget::setupParam(const QDomElement elem, int minframe, int maxfra m_geometry->fetch(&item, 0); delete m_rect; - m_rect = new OnMonitorRectItem(QRectF(0, 0, item.w(), item.h()), m_scene); + m_rect = new OnMonitorRectItem(QRectF(0, 0, item.w(), item.h()), m_monitor->render->dar(), m_scene); m_rect->setPos(item.x(), item.y()); m_rect->setZValue(0); m_scene->addItem(m_rect); diff --git a/src/onmonitoritems/onmonitorrectitem.cpp b/src/onmonitoritems/onmonitorrectitem.cpp index 05909b5d..45f39a7b 100644 --- a/src/onmonitoritems/onmonitorrectitem.cpp +++ b/src/onmonitoritems/onmonitorrectitem.cpp @@ -25,9 +25,10 @@ #include #include -OnMonitorRectItem::OnMonitorRectItem(const QRectF &rect, MonitorScene *scene, QGraphicsItem* parent) : +OnMonitorRectItem::OnMonitorRectItem(const QRectF &rect, double dar, MonitorScene *scene, QGraphicsItem* parent) : AbstractOnMonitorItem(scene), - QGraphicsRectItem(rect, parent) + QGraphicsRectItem(rect, parent), + m_dar(dar) { setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); @@ -90,8 +91,9 @@ void OnMonitorRectItem::slotMousePressed(QGraphicsSceneMouseEvent* event) if (!isEnabled()) return; - m_clickPoint = event->scenePos(); - m_mode = getMode(m_clickPoint.toPoint()); + m_lastPoint = event->scenePos(); + m_oldRect = rect().normalized(); + m_mode = getMode(m_lastPoint.toPoint()); } void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event) @@ -108,18 +110,18 @@ void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event) * return; }*/ - QPointF mousePos = event->scenePos(); - if (event->buttons() & Qt::LeftButton) { QRectF r = rect().normalized(); QPointF p = pos(); + QPointF mousePos = event->scenePos(); QPointF mousePosInRect = mapFromScene(mousePos); - QPointF diff = mousePos - m_clickPoint; - m_clickPoint = mousePos; + QPointF diff = mousePos - m_lastPoint; + m_lastPoint = mousePos; + switch (m_mode) { case ResizeTopLeft: if (mousePos.x() < p.x() + r.height() && mousePos.y() < p.y() + r.height()) { - setRect(r.adjusted(0, 0, -mousePosInRect.x(), -mousePosInRect.y())); + r.adjust(0, 0, -mousePosInRect.x(), -mousePosInRect.y()); setPos(mousePos); m_modified = true; } @@ -127,7 +129,6 @@ void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event) case ResizeTop: if (mousePos.y() < p.y() + r.height()) { r.setBottom(r.height() - mousePosInRect.y()); - setRect(r); setPos(QPointF(p.x(), mousePos.y())); m_modified = true; } @@ -135,7 +136,6 @@ void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event) case ResizeTopRight: if (mousePos.x() > p.x() && mousePos.y() < p.y() + r.height()) { r.setBottomRight(QPointF(mousePosInRect.x(), r.bottom() - mousePosInRect.y())); - setRect(r); setPos(QPointF(p.x(), mousePos.y())); m_modified = true; } @@ -143,7 +143,6 @@ void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event) case ResizeLeft: if (mousePos.x() < p.x() + r.width()) { r.setRight(r.width() - mousePosInRect.x()); - setRect(r); setPos(QPointF(mousePos.x(), p.y())); m_modified = true; } @@ -151,14 +150,12 @@ void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event) case ResizeRight: if (mousePos.x() > p.x()) { r.setRight(mousePosInRect.x()); - setRect(r); m_modified = true; } break; case ResizeBottomLeft: if (mousePos.x() < p.x() + r.width() && mousePos.y() > p.y()) { r.setBottomRight(QPointF(r.width() - mousePosInRect.x(), mousePosInRect.y())); - setRect(r); setPos(QPointF(mousePos.x(), p.y())); m_modified = true; } @@ -166,14 +163,12 @@ void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event) case ResizeBottom: if (mousePos.y() > p.y()) { r.setBottom(mousePosInRect.y()); - setRect(r); m_modified = true; } break; case ResizeBottomRight: if (mousePos.x() > p.x() && mousePos.y() > p.y()) { r.setBottomRight(mousePosInRect); - setRect(r); m_modified = true; } break; @@ -184,6 +179,35 @@ void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event) default: break; } + + // Keep aspect ratio + if (event->modifiers() == Qt::ControlModifier) { + // compare to rect during mouse press: + // if we subtract rect() we'll get a whole lot of flickering + // because of diffWidth > diffHeight changing all the time + int diffWidth = qAbs(r.width() - m_oldRect.width()); + int diffHeight = qAbs(r.height() - m_oldRect.height()); + + if (diffHeight != 0 || diffWidth != 0) { + if (diffWidth > diffHeight) + r.setBottom(r.width() / m_dar); + else + r.setRight(r.height() * m_dar); + + // the rect's position changed + if (p - pos() != QPointF()) { + if (diffWidth > diffHeight) { + if (m_mode != ResizeBottomLeft) + setY(p.y() - r.height() + rect().normalized().height()); + } else { + if (m_mode != ResizeTopRight) + setX(p.x() - r.width() + rect().normalized().width()); + } + } + } + } + + setRect(r); } else { switch (getMode(event->scenePos().toPoint())) { case ResizeTopLeft: @@ -210,6 +234,7 @@ void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event) break; } } + if (m_modified && KdenliveSettings::monitorscene_directupdate()) { emit actionFinished(); m_modified = false; diff --git a/src/onmonitoritems/onmonitorrectitem.h b/src/onmonitoritems/onmonitorrectitem.h index 96e3db36..acdee10c 100644 --- a/src/onmonitoritems/onmonitorrectitem.h +++ b/src/onmonitoritems/onmonitorrectitem.h @@ -32,7 +32,7 @@ class OnMonitorRectItem : public AbstractOnMonitorItem, public QGraphicsRectItem { Q_OBJECT public: - OnMonitorRectItem(const QRectF &rect, MonitorScene *scene, QGraphicsItem *parent = 0); + OnMonitorRectItem(const QRectF &rect, double dar, MonitorScene *scene, QGraphicsItem *parent = 0); /** @brief Gets The action mode for the area @param pos +- 4. * e.g. pos(0,0) returns ResizeTopLeft */ @@ -52,8 +52,10 @@ public slots: void slotMouseMoved(QGraphicsSceneMouseEvent *event); private: + double m_dar; rectActions m_mode; - QPointF m_clickPoint; + QRectF m_oldRect; + QPointF m_lastPoint; }; #endif