]> git.sesse.net Git - kdenlive/blobdiff - src/onmonitoritems/onmonitorrectitem.cpp
Make c0rners keyframable
[kdenlive] / src / onmonitoritems / onmonitorrectitem.cpp
index e25ae5d00af70d92a9fcf423770a0a941f09cb20..ddbb97fc261e5597609908f585ca0d4125ca53c9 100644 (file)
 #include <QStyleOptionGraphicsItem>
 #include <QCursor>
 
-OnMonitorRectItem::OnMonitorRectItem(const QRectF &rect, QGraphicsItem* parent) :
-        QGraphicsRectItem(rect, parent)
+OnMonitorRectItem::OnMonitorRectItem(const QRectF &rect, double dar, MonitorScene *scene, QGraphicsItem* parent) :
+        AbstractOnMonitorItem(scene),
+        QGraphicsRectItem(rect, parent),
+        m_dar(dar)
 {
     setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
 
@@ -77,39 +79,29 @@ rectActions OnMonitorRectItem::getMode(QPoint pos)
         return NoAction;
 }
 
-int OnMonitorRectItem::type() const
+/*int OnMonitorRectItem::type() const
 {
     return Type;
-}
-
-void OnMonitorRectItem::setEnabled(bool enabled)
-{
-    m_enabled = enabled;
-}
+}*/
 
 void OnMonitorRectItem::slotMousePressed(QGraphicsSceneMouseEvent* event)
 {
-    if (!m_enabled)
+    event->accept();
+
+    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::slotMouseReleased(QGraphicsSceneMouseEvent* event)
+void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event)
 {
-    if (m_modified) {
-        m_modified = false;
-        emit actionFinished();
-    }
-
     event->accept();
-}
 
-void OnMonitorRectItem::slotMouseMoved(QGraphicsSceneMouseEvent* event)
-{
-    if (!m_enabled) {
-        emit setCursor(QCursor(Qt::ArrowCursor));
+    if (!isEnabled()) {
+        emit requestCursor(QCursor(Qt::ArrowCursor));
         return;
     }
 
@@ -118,16 +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_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;
             }
@@ -135,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;
             }
@@ -143,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;
             }
@@ -151,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;
             }
@@ -159,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;
             }
@@ -174,64 +163,100 @@ 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;
         case Move:
-            QPointF diff = mousePos - m_clickPoint;
-            m_clickPoint = mousePos;
             moveBy(diff.x(), diff.y());
             m_modified = true;
             break;
+        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)
+#if QT_VERSION >= 0x040600
+                            setY(p.y() - r.height() + rect().normalized().height());
+#else
+                            setPos(x(), p.y() - r.height() + rect().normalized().height());
+#endif
+                    } else {
+                        if (m_mode != ResizeTopRight)
+#if QT_VERSION >= 0x040600
+                            setX(p.x() - r.width() + rect().normalized().width());
+#else
+                            setPos(p.x() - r.width() + rect().normalized().width(), y());
+#endif
+                    }
+                }
+            }
         }
+
+        setRect(r);
     } else {
         switch (getMode(event->scenePos().toPoint())) {
         case ResizeTopLeft:
         case ResizeBottomRight:
-            emit setCursor(QCursor(Qt::SizeFDiagCursor));
+            emit requestCursor(QCursor(Qt::SizeFDiagCursor));
             break;
         case ResizeTopRight:
         case ResizeBottomLeft:
-            emit setCursor(QCursor(Qt::SizeBDiagCursor));
+            emit requestCursor(QCursor(Qt::SizeBDiagCursor));
             break;
         case ResizeTop:
         case ResizeBottom:
-            emit setCursor(QCursor(Qt::SizeVerCursor));
+            emit requestCursor(QCursor(Qt::SizeVerCursor));
             break;
         case ResizeLeft:
         case ResizeRight:
-            emit setCursor(QCursor(Qt::SizeHorCursor));
+            emit requestCursor(QCursor(Qt::SizeHorCursor));
             break;
         case Move:
-            emit setCursor(QCursor(Qt::OpenHandCursor));
+            emit requestCursor(QCursor(Qt::OpenHandCursor));
             break;
         default:
-            emit setCursor(QCursor(Qt::ArrowCursor));
+            emit requestCursor(QCursor(Qt::ArrowCursor));
             break;
         }
     }
+
     if (m_modified && KdenliveSettings::monitorscene_directupdate()) {
         emit actionFinished();
         m_modified = false;
     }
-
-    event->accept();
 }
 
 void OnMonitorRectItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
 {
+    Q_UNUSED(widget);
+
     painter->setPen(pen());
     painter->drawRect(option->rect);
 
-    if (m_enabled) {
+    if (isEnabled()) {
         double handleSize = 6 / painter->matrix().m11();
         double halfHandleSize = handleSize / 2;
         painter->fillRect(-halfHandleSize, -halfHandleSize, handleSize, handleSize, QColor(Qt::yellow));
@@ -241,6 +266,4 @@ void OnMonitorRectItem::paint(QPainter* painter, const QStyleOptionGraphicsItem*
     }
 }
 
-
-
 #include "onmonitorrectitem.moc"