]> git.sesse.net Git - kdenlive/commitdiff
rotoscoping: preserve point selection after mouse release
authorTill Theato <root@ttill.de>
Tue, 1 Mar 2011 21:04:25 +0000 (21:04 +0000)
committerTill Theato <root@ttill.de>
Tue, 1 Mar 2011 21:04:25 +0000 (21:04 +0000)
svn path=/trunk/kdenlive/; revision=5467

src/monitorscene.cpp
src/rotoscoping/rotowidget.cpp
src/rotoscoping/rotowidget.h

index 08d6ee5ba87d8e6183cf7e636962a5021514c209..921439ce743403f1a18b2fd93057775606aef6a8 100644 (file)
@@ -142,11 +142,20 @@ void MonitorScene::slotZoomIn(int by)
 
 void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent* event)
 {
+    QList <QGraphicsItem *> selected = selectedItems();
+
     QGraphicsScene::mousePressEvent(event);
 
+    if (selected.count() != selectedItems().count()) {
+        // mouse click on item not in selection group
+        // -> select only this item
+        foreach (QGraphicsItem *item, selected)
+            item->setSelected(false);
+    }
+
     if (event->isAccepted() && selectedItems().count() > 1) {
         // multiple items selected + mouse pressed on an item
-        QList <QGraphicsItem *> selected = selectedItems();
+        selected = selectedItems();
         foreach (QGraphicsItem *item, selected) {
             if (qgraphicsitem_cast<BPointItem*>(item)) {
                 // works with rotoscoping only for now
index bf6ca24e414c8b5afa3585b246852f7a1b5af495..b1dddf74dd5d9c4fa77862f95cef447602ddd084 100644 (file)
@@ -39,8 +39,7 @@ RotoWidget::RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode
         m_monitor(monitor),
         m_showScene(true),
         m_in(in),
-        m_out(out),
-        m_pos(0)
+        m_out(out)
 {
     QVBoxLayout *l = new QVBoxLayout(this);
     m_keyframeWidget = new SimpleKeyframeWidget(t, m_out - m_in - 1, this);
@@ -178,6 +177,8 @@ void RotoWidget::slotPositionChanged(int pos, bool seek)
 
     pos += m_in;
 
+    QList <BPoint> p;
+
     if (m_data.canConvert(QVariant::Map)) {
         QMap <QString, QVariant> map = m_data.toMap();
         QMap <QString, QVariant>::const_iterator i = map.constBegin();
@@ -191,7 +192,6 @@ void RotoWidget::slotPositionChanged(int pos, bool seek)
         if (keyframe1 != keyframe2 && pos < keyframe2) {
             QList <BPoint> p1 = getPoints(keyframe1);
             QList <BPoint> p2 = getPoints(keyframe2);
-            QList <BPoint> p;
             qreal relPos = (pos - keyframe1) / (qreal)(keyframe2 - keyframe1 + 1);
 
             int count = qMin(p1.count(), p2.count());
@@ -210,12 +210,18 @@ void RotoWidget::slotPositionChanged(int pos, bool seek)
             m_item->setEnabled(false);
             m_scene->setEnabled(false);
         } else {
-            m_item->setPoints(getPoints(keyframe2));
+            p = getPoints(keyframe2);
+            // only update if necessary to preserve the current point selection
+            if (p != m_item->getPoints())
+                m_item->setPoints(p);
             m_item->setEnabled(pos == keyframe2);
             m_scene->setEnabled(pos == keyframe2);
         }
     } else {
-        m_item->setPoints(getPoints(-1));
+        p = getPoints(-1);
+        // only update if necessary to preserve the current point selection
+        if (p != m_item->getPoints())
+            m_item->setPoints(p);
         m_item->setEnabled(true);
         m_scene->setEnabled(true);
     }
index ef3a376a8612e08ba5ecd5eab48eeb1d91fdbfba..cb5a7828344733ab50f4b080583fcd45612f0709 100644 (file)
@@ -60,7 +60,6 @@ private:
     SplineItem *m_item;
     int m_in;
     int m_out;
-    int m_pos;
 
     QList <BPoint> getPoints(int keyframe);