]> git.sesse.net Git - kdenlive/commitdiff
Add / remove transition keyframes through double click in param ruler
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 23 Jul 2009 23:03:17 +0000 (23:03 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 23 Jul 2009 23:03:17 +0000 (23:03 +0000)
svn path=/trunk/kdenlive/; revision=3760

src/geometryval.cpp
src/geometryval.h
src/keyframehelper.cpp
src/keyframehelper.h

index 887d0824c810049d2572f036d72965f88afb2936..d6e277829d7e84a4164ddb6b791e3a92556847d6 100644 (file)
@@ -51,7 +51,8 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidg
 
     connect(m_helper, SIGNAL(positionChanged(int)), this, SLOT(slotPositionChanged(int)));
     connect(m_helper, SIGNAL(keyframeMoved(int)), this, SLOT(slotKeyframeMoved(int)));
-
+    connect(m_helper, SIGNAL(addKeyframe(int)), this, SLOT(slotAddFrame(int)));
+    connect(m_helper, SIGNAL(removeKeyframe(int)), this, SLOT(slotDeleteFrame(int)));
 
     m_scene = new GraphicsSceneRectMove(this);
     m_scene->setTool(TITLE_SELECT);
@@ -347,11 +348,11 @@ void Geometryval::slotPositionChanged(int pos, bool seek)
     m_paramRect->setBrush(QColor(255, 0, 0, item.mix()));
 }
 
-void Geometryval::slotDeleteFrame()
+void Geometryval::slotDeleteFrame(int pos)
 {
     // check there is more than one keyframe
     Mlt::GeometryItem item;
-    const int pos = m_ui.spinPos->value();
+    if (pos == -1) pos = m_ui.spinPos->value();
     int error = m_geom->next_key(&item, pos + 1);
     if (error) {
         error = m_geom->prev_key(&item, pos - 1);
@@ -372,9 +373,9 @@ void Geometryval::slotDeleteFrame()
     emit parameterChanged();
 }
 
-void Geometryval::slotAddFrame()
+void Geometryval::slotAddFrame(int pos)
 {
-    int pos = m_ui.spinPos->value();
+    if (pos = -1) pos = m_ui.spinPos->value();
     Mlt::GeometryItem item;
     item.frame(pos);
     item.x(m_paramRect->pos().x());
index 55bcc7115c98f3a3c83f2e07dd06196a6c18a5fd..9cab925fda883028e7611a269acf1f682a3e14ae 100644 (file)
@@ -71,8 +71,8 @@ private slots:
     void slotNextFrame();
     void slotPreviousFrame();
     void slotPositionChanged(int pos, bool seek = true);
-    void slotDeleteFrame();
-    void slotAddFrame();
+    void slotDeleteFrame(int pos = -1);
+    void slotAddFrame(int pos = -1);
     void slotUpdateTransitionProperties();
     void slotTransparencyChanged(int transp);
     void slotResize50();
index 09a2235b676d11511e0210e2cb39710681ab751d..afcfa9eb320c1a7b92808465795099eb6553b148 100644 (file)
@@ -53,7 +53,7 @@ void KeyframeHelper::mousePressEvent(QMouseEvent * event)
                 m_movingItem.w(item.w());
                 m_movingItem.h(item.h());
                 m_movingItem.mix(item.mix());
-                m_geom->remove(item.frame());
+                m_movingItem.frame(item.frame());
                 m_dragStart = event->pos();
                 m_movingKeyframe = true;
                 return;
@@ -69,8 +69,11 @@ void KeyframeHelper::mousePressEvent(QMouseEvent * event)
 void KeyframeHelper::mouseMoveEvent(QMouseEvent * event)
 {
     if (m_movingKeyframe) {
-        if (!m_dragStart.isNull() && (event->pos() - m_dragStart).manhattanLength() < QApplication::startDragDistance()) return;
-        m_dragStart = QPoint();
+        if (!m_dragStart.isNull()) {
+            if ((event->pos() - m_dragStart).manhattanLength() < QApplication::startDragDistance()) return;
+            m_dragStart = QPoint();
+            m_geom->remove(m_movingItem.frame());
+        }
         int pos = qMax(0, (int)(event->x() / m_scale));
         pos = qMin(m_length, pos);
         m_movingItem.frame(pos);
@@ -84,6 +87,22 @@ void KeyframeHelper::mouseMoveEvent(QMouseEvent * event)
     update();
 }
 
+void KeyframeHelper::mouseDoubleClickEvent(QMouseEvent * event)
+{
+    if (m_geom != NULL && event->button() == Qt::LeftButton) {
+        // check if we want to move a keyframe
+        int mousePos = qMax((int)(event->x() / m_scale - 5), 0);
+        Mlt::GeometryItem item;
+        if (m_geom->next_key(&item, mousePos) == 0 && item.frame() - mousePos < 10) {
+            // There is already a keyframe close to mouse click
+            emit removeKeyframe(item.frame());
+            return;
+        }
+        // add new keyframe
+        emit addKeyframe((int)(event->x() / m_scale));
+    }
+}
+
 // virtual
 void KeyframeHelper::mouseReleaseEvent(QMouseEvent * event)
 {
index faa9e3c163271cdca8f43d8270b84ebb287fdff9..982cd3a8fb01ed5c98ca343c906362f738a4fc39 100644 (file)
@@ -40,6 +40,7 @@ protected:
     virtual void mousePressEvent(QMouseEvent * event);
     virtual void mouseMoveEvent(QMouseEvent * event);
     virtual void mouseReleaseEvent(QMouseEvent * event);
+    virtual void mouseDoubleClickEvent(QMouseEvent * event);
 
 private:
     Mlt::Geometry *m_geom;
@@ -57,6 +58,8 @@ public slots:
 signals:
     void positionChanged(int);
     void keyframeMoved(int);
+    void addKeyframe(int);
+    void removeKeyframe(int);
 };
 
 #endif