]> git.sesse.net Git - kdenlive/blobdiff - src/monitorscene.cpp
Const'ref
[kdenlive] / src / monitorscene.cpp
index dfe14a99fc5e4194df5a18d3b5b760859658764d..e6be3de10188933da55b54a6b60c13e3dd682076 100644 (file)
 
 #include "monitorscene.h"
 #include "renderer.h"
-#include "onmonitoritems/onmonitorrectitem.h"
+#include "onmonitoritems/rotoscoping/bpointitem.h"
+#include "onmonitoritems/rotoscoping/splineitem.h"
 #include "kdenlivesettings.h"
 
 #include <QGraphicsView>
 #include <QGraphicsPixmapItem>
 #include <QGraphicsSceneMouseEvent>
+#include <QScrollBar>
+
 
 MonitorScene::MonitorScene(Render *renderer, QObject* parent) :
         QGraphicsScene(parent),
@@ -33,7 +36,8 @@ MonitorScene::MonitorScene(Render *renderer, QObject* parent) :
         m_view(NULL),
         m_backgroundImage(QImage()),
         m_enabled(true),
-        m_zoom(1.0)
+        m_zoom(1.0),
+        m_groupMove(false)
 {
     setBackgroundBrush(QBrush(QColor(KdenliveSettings::window_background().name())));
 
@@ -61,9 +65,20 @@ MonitorScene::MonitorScene(Render *renderer, QObject* parent) :
     connect(m_renderer, SIGNAL(frameUpdated(QImage)), this, SLOT(slotSetBackgroundImage(QImage)));
 }
 
+void MonitorScene::centerView()
+{
+    if (m_view) m_view->centerOn(m_frameBorder);
+}
+
+void MonitorScene::cleanup()
+{
+    // Reset scene rect
+    setSceneRect(m_frameBorder->boundingRect());
+}
+
 void MonitorScene::setUp()
 {
-    if (views().count() > 0) {
+    if (!views().isEmpty()) {
         m_view = views().at(0);
         m_view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
     } else {
@@ -85,7 +100,7 @@ void MonitorScene::setEnabled(bool enabled)
 void MonitorScene::slotUpdateBackground()
 {
     if (m_view && m_view->isVisible()) {
-        if (m_lastUpdate.msecsTo(QTime::currentTime()) > 100) {
+        if (m_lastUpdate.msecsTo(QTime::currentTime()) > 50) {
             m_background->setPixmap(QPixmap::fromImage(m_backgroundImage));
             m_lastUpdate = QTime::currentTime();
         }
@@ -137,40 +152,100 @@ void MonitorScene::slotZoomIn(int by)
     slotZoom(qMin(300, (int)(m_zoom * 100 + by + 0.5)));
 }
 
-void MonitorScene::slotSetCursor(const QCursor &cursor)
+void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent* event)
 {
-    if (m_view)
-        m_view->setCursor(cursor);
-}
+    QList <QGraphicsItem *> selected = selectedItems();
 
+    QGraphicsScene::mousePressEvent(event);
 
-void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
-    emit mousePressed(event);
+    if (selected.count() < selectedItems().count()) {
+        // mouse click on item not in selection group
+        // -> select only this item
+        foreach (QGraphicsItem *item, selected) {
+            if (item)
+                item->setSelected(false);
+        }
+    }
+
+    if (event->isAccepted() && selectedItems().count() > 1) {
+        // multiple items selected + mouse pressed on an item
+        selected = selectedItems();
+        foreach (QGraphicsItem *item, selected) {
+            if (qgraphicsitem_cast<BPointItem*>(item)) {
+                // works with rotoscoping only for now
+                m_groupMove = true;
+                m_lastPos = event->scenePos();
+                return;
+            }
+        }
+    }
 
-    if (!event->isAccepted())
-        QGraphicsScene::mousePressEvent(event);
+    if (!event->isAccepted() && event->buttons() & Qt::LeftButton) {
+        if (event->modifiers() == Qt::ControlModifier)
+            m_view->setDragMode(QGraphicsView::ScrollHandDrag);
+        else if (event->modifiers() == Qt::ShiftModifier)
+            m_view->setDragMode(QGraphicsView::RubberBandDrag);
+    }
 }
 
 void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
 {
-    emit mouseMoved(event);
+    if (m_groupMove) {
+        // we want to move multiple items
+        // rotoscoping only for now
+        QPointF diff =  event->scenePos() - m_lastPos;
+        if (diff != QPointF(0, 0)) {
+            m_lastPos = event->scenePos();
+            QList <QGraphicsItem *> selected = selectedItems();
+            int first = -1;
+            int i = 0;
+            foreach (QGraphicsItem *item, selected) {
+                BPointItem *bpoint = qgraphicsitem_cast<BPointItem *>(item);
+                if (bpoint) {
+                    if (first < 0)
+                        first = i;
+                    BPoint p = bpoint->getPoint();
+                    p.setP(p.p + diff);
+                    bpoint->setPoint(p);
+                }
+                ++i;
+            }
 
-    if (!event->isAccepted())
+            if (first >= 0) {
+                QGraphicsItem *item = selected.at(first);
+                if (item->parentItem()) {
+                    SplineItem *parent = qgraphicsitem_cast<SplineItem*>(item->parentItem());
+                    if (parent)
+                        parent->updateSpline(true);
+                }
+            }
+        }
+    } else {
         QGraphicsScene::mouseMoveEvent(event);
+    }
 }
 
-void MonitorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+void MonitorScene::mouseReleaseEvent(QGraphicsSceneMouseEventevent)
 {
-    emit mouseReleased(event);
-
-    if (!event->isAccepted())
-        QGraphicsScene::mouseReleaseEvent(event);
+    if (m_groupMove) {
+        QList <QGraphicsItem *> selected = selectedItems();
+        foreach (QGraphicsItem *item, selected) {
+            if (qgraphicsitem_cast<BPointItem*>(item) && item->parentItem()) {
+                SplineItem *parent = qgraphicsitem_cast<SplineItem*>(item->parentItem());
+                if (parent) {
+                    parent->updateSpline(false);
+                    break;
+                }
+            }
+        }
+        m_groupMove = false;
+    }
+    QGraphicsScene::mouseReleaseEvent(event);
+    m_view->setDragMode(QGraphicsView::NoDrag);
 }
-
 void MonitorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
 {
-    Q_UNUSED(event);
+    Q_UNUSED(event)
 
     if (!m_enabled)
         emit addKeyframe();
@@ -179,12 +254,23 @@ void MonitorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
 void MonitorScene::wheelEvent(QGraphicsSceneWheelEvent* event)
 {
     if (event->modifiers() == Qt::ControlModifier) {
-        if (event->delta() > 0)
+        if (event->delta() > 0) {
+            m_view->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
             slotZoomIn(5);
-        else
+            m_view->setTransformationAnchor(QGraphicsView::AnchorViewCenter);
+        } else {
             slotZoomOut(5);
+        }
     } else {
-        QGraphicsScene::wheelEvent(event);
+        QAbstractSlider::SliderAction action;
+        if (event->delta() > 0)
+            action = QAbstractSlider::SliderSingleStepSub;
+        else
+            action = QAbstractSlider::SliderSingleStepAdd;
+        if (event->orientation() == Qt::Horizontal)
+            m_view->horizontalScrollBar()->triggerAction(action);
+        else
+            m_view->verticalScrollBar()->triggerAction(action);
     }
 
     event->accept();