]> git.sesse.net Git - kdenlive/commitdiff
Keyframe in composite transitions can be moved:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 23 Jul 2009 21:46:37 +0000 (21:46 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 23 Jul 2009 21:46:37 +0000 (21:46 +0000)
http://kdenlive.org/mantis/view.php?id=1054

svn path=/trunk/kdenlive/; revision=3759

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

index 2c8e72c3ebbf87d0292934e243d66f4584681f3b..887d0824c810049d2572f036d72965f88afb2936 100644 (file)
@@ -50,6 +50,8 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidg
     vbox2->setContentsMargins(0, 0, 0, 0);
 
     connect(m_helper, SIGNAL(positionChanged(int)), this, SLOT(slotPositionChanged(int)));
+    connect(m_helper, SIGNAL(keyframeMoved(int)), this, SLOT(slotKeyframeMoved(int)));
+
 
     m_scene = new GraphicsSceneRectMove(this);
     m_scene->setTool(TITLE_SELECT);
@@ -69,16 +71,16 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidg
     m_ui.buttonDelete->setIcon(KIcon("edit-delete"));
     m_ui.buttonDelete->setToolTip(i18n("Delete keyframe"));
 
-    QMenu *configMenu = new QMenu(i18n("Misc..."), this);
+    m_configMenu = new QMenu(i18n("Misc..."), this);
     m_ui.buttonMenu->setIcon(KIcon("system-run"));
-    m_ui.buttonMenu->setMenu(configMenu);
+    m_ui.buttonMenu->setMenu(m_configMenu);
     m_ui.buttonMenu->setPopupMode(QToolButton::QToolButton::InstantPopup);
 
 
-    configMenu->addAction(i18n("Geometry"), this, SLOT(slotGeometry()));
+    m_editGeom = m_configMenu->addAction(i18n("Edit keyframe"), this, SLOT(slotGeometry()));
 
     m_scaleMenu = new QMenu(i18n("Resize..."), this);
-    configMenu->addMenu(m_scaleMenu);
+    m_configMenu->addMenu(m_scaleMenu);
     m_scaleMenu->addAction(i18n("50%"), this, SLOT(slotResize50()));
     m_scaleMenu->addAction(i18n("100%"), this, SLOT(slotResize100()));
     m_scaleMenu->addAction(i18n("200%"), this, SLOT(slotResize200()));
@@ -86,7 +88,7 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidg
     m_scaleMenu->addAction(i18n("Custom"), this, SLOT(slotResizeCustom()));
 
     m_alignMenu = new QMenu(i18n("Align..."), this);
-    configMenu->addMenu(m_alignMenu);
+    m_configMenu->addMenu(m_alignMenu);
     m_alignMenu->addAction(i18n("Center"), this, SLOT(slotAlignCenter()));
     m_alignMenu->addAction(i18n("Hor. Center"), this, SLOT(slotAlignHCenter()));
     m_alignMenu->addAction(i18n("Vert. Center"), this, SLOT(slotAlignVCenter()));
@@ -96,7 +98,7 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidg
     m_alignMenu->addAction(i18n("Bottom"), this, SLOT(slotAlignBottom()));
 
 
-    m_syncAction = configMenu->addAction(i18n("Sync timeline cursor"), this, SLOT(slotSyncCursor()));
+    m_syncAction = m_configMenu->addAction(i18n("Sync timeline cursor"), this, SLOT(slotSyncCursor()));
     m_syncAction->setCheckable(true);
     m_syncAction->setChecked(KdenliveSettings::transitionfollowcursor());
 
@@ -120,6 +122,11 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidg
 Geometryval::~Geometryval()
 {
     m_scene->disconnect();
+    delete m_scaleMenu;
+    delete m_alignMenu;
+    delete m_editGeom;
+    delete m_syncAction;
+    delete m_configMenu;
     delete m_paramRect;
     delete m_path;
     delete m_helper;
@@ -324,6 +331,7 @@ void Geometryval::slotPositionChanged(int pos, bool seek)
         m_ui.spinTransp->setEnabled(false);
         m_scaleMenu->setEnabled(false);
         m_alignMenu->setEnabled(false);
+        m_editGeom->setEnabled(false);
     } else {
         m_ui.buttonAdd->setEnabled(false);
         m_ui.buttonDelete->setEnabled(true);
@@ -331,6 +339,7 @@ void Geometryval::slotPositionChanged(int pos, bool seek)
         m_ui.spinTransp->setEnabled(true);
         m_scaleMenu->setEnabled(true);
         m_alignMenu->setEnabled(true);
+        m_editGeom->setEnabled(true);
     }
     m_paramRect->setPos(item.x(), item.y());
     m_paramRect->setRect(0, 0, item.w(), item.h());
@@ -356,6 +365,7 @@ void Geometryval::slotDeleteFrame()
     m_ui.spinTransp->setEnabled(false);
     m_scaleMenu->setEnabled(false);
     m_alignMenu->setEnabled(false);
+    m_editGeom->setEnabled(false);
     m_helper->update();
     slotPositionChanged(pos, false);
     updateTransitionPath();
@@ -379,6 +389,7 @@ void Geometryval::slotAddFrame()
     m_ui.spinTransp->setEnabled(true);
     m_scaleMenu->setEnabled(true);
     m_alignMenu->setEnabled(true);
+    m_editGeom->setEnabled(true);
     m_helper->update();
     emit parameterChanged();
 }
@@ -429,6 +440,7 @@ void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame)
         m_ui.label_pos->setHidden(true);
         m_helper->setHidden(true);
         m_ui.spinPos->setHidden(true);
+
     }
     char *tmp = (char *) qstrdup(val.toUtf8().data());
     if (m_geom) m_geom->parse(tmp, maxFrame - minFrame, m_profile.width, m_profile.height);
@@ -562,3 +574,11 @@ void Geometryval::setFrameSize(QPoint p)
 {
     m_frameSize = p;
 }
+
+
+void Geometryval::slotKeyframeMoved(int pos)
+{
+    slotPositionChanged(pos);
+    slotUpdateTransitionProperties();
+}
+
index 629a1ff1b58578bf0fd5a379c9e84b35c982a94b..55bcc7115c98f3a3c83f2e07dd06196a6c18a5fd 100644 (file)
@@ -54,9 +54,11 @@ private:
     Mlt::Geometry *m_geom;
     KeyframeHelper *m_helper;
     QGraphicsPathItem *m_path;
+    QMenu *m_configMenu;
     QMenu *m_scaleMenu;
     QMenu *m_alignMenu;
     QAction *m_syncAction;
+    QAction *m_editGeom;
     bool m_fixedMode;
     QPoint m_frameSize;
     Ui::GeometryPosition_UI m_view;
@@ -88,6 +90,7 @@ private slots:
     void slotSyncCursor();
     void slotGeometry();
     void slotResetPosition();
+    void slotKeyframeMoved(int);
 
 signals:
     void parameterChanged();
index a199bc7d8f163e70b878a6fd1cfad7fcddb6a6eb..09a2235b676d11511e0210e2cb39710681ab751d 100644 (file)
 
 #include <QMouseEvent>
 #include <QStylePainter>
+#include <QApplication>
 
 
 KeyframeHelper::KeyframeHelper(QWidget *parent) :
         QWidget(parent),
         m_geom(NULL),
         m_position(0),
-        m_scale(0)
+        m_scale(0),
+        m_movingKeyframe(false)
 {
     setFont(KGlobalSettings::toolBarFont());
 }
@@ -40,6 +42,24 @@ KeyframeHelper::KeyframeHelper(QWidget *parent) :
 // virtual
 void KeyframeHelper::mousePressEvent(QMouseEvent * event)
 {
+    if (m_geom != NULL && (event->y() < height() / 2) && 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) {
+            if (item.frame() - mousePos < 10) {
+                m_movingItem.x(item.x());
+                m_movingItem.y(item.y());
+                m_movingItem.w(item.w());
+                m_movingItem.h(item.h());
+                m_movingItem.mix(item.mix());
+                m_geom->remove(item.frame());
+                m_dragStart = event->pos();
+                m_movingKeyframe = true;
+                return;
+            }
+        }
+    }
     m_position = event->x() / m_scale;
     emit positionChanged(m_position);
     update();
@@ -48,6 +68,15 @@ void KeyframeHelper::mousePressEvent(QMouseEvent * event)
 // virtual
 void KeyframeHelper::mouseMoveEvent(QMouseEvent * event)
 {
+    if (m_movingKeyframe) {
+        if (!m_dragStart.isNull() && (event->pos() - m_dragStart).manhattanLength() < QApplication::startDragDistance()) return;
+        m_dragStart = QPoint();
+        int pos = qMax(0, (int)(event->x() / m_scale));
+        pos = qMin(m_length, pos);
+        m_movingItem.frame(pos);
+        update();
+        return;
+    }
     m_position = event->x() / m_scale;
     m_position = qMax(0, m_position);
     m_position = qMin(m_length, m_position);
@@ -55,6 +84,17 @@ void KeyframeHelper::mouseMoveEvent(QMouseEvent * event)
     update();
 }
 
+// virtual
+void KeyframeHelper::mouseReleaseEvent(QMouseEvent * event)
+{
+    if (m_movingKeyframe) {
+        m_geom->insert(m_movingItem);
+        m_movingKeyframe = false;
+        emit keyframeMoved(m_position);
+        return;
+    }
+    QWidget::mouseReleaseEvent(event);
+}
 
 // virtual
 void KeyframeHelper::wheelEvent(QWheelEvent * e)
@@ -82,6 +122,7 @@ void KeyframeHelper::paintEvent(QPaintEvent *e)
     if (m_geom != NULL) {
         int pos = 0;
         p.setPen(QColor(255, 20, 20));
+        p.setBrush(QColor(255, 20, 20));
         Mlt::GeometryItem item;
         while (true) {
             if (m_geom->next_key(&item, pos) == 1) break;
@@ -92,11 +133,19 @@ void KeyframeHelper::paintEvent(QPaintEvent *e)
             // draw pointer
             QPolygon pa(3);
             pa.setPoints(3, scaledPos - 4, 0, scaledPos + 4, 0, scaledPos, 4);
-            p.setBrush(QColor(255, 20, 20));
             p.drawPolygon(pa);
             //p.fillRect(QRect(scaledPos - 1, 0, 2, 15), QBrush(QColor(255, 20, 20)));
             pos++;
         }
+        if (m_movingKeyframe) {
+            int scaledPos = (int)(m_movingItem.frame() * m_scale);
+            // draw keyframes
+            p.drawLine(scaledPos, 6, scaledPos, 10);
+            // draw pointer
+            QPolygon pa(3);
+            pa.setPoints(3, scaledPos - 4, 0, scaledPos + 4, 0, scaledPos, 4);
+            p.drawPolygon(pa);
+        }
     }
     p.setPen(palette().dark().color());
     p.drawLine(clipRect.x(), 5, clipRect.right(), 5);
index 66c1872785fd8b525949ceb087d278039b0c91eb..faa9e3c163271cdca8f43d8270b84ebb287fdff9 100644 (file)
@@ -30,7 +30,6 @@
 class KeyframeHelper : public QWidget
 {
     Q_OBJECT
-
 public:
     KeyframeHelper(QWidget *parent = 0);
     int value() const;
@@ -40,12 +39,16 @@ protected:
     virtual void wheelEvent(QWheelEvent * e);
     virtual void mousePressEvent(QMouseEvent * event);
     virtual void mouseMoveEvent(QMouseEvent * event);
+    virtual void mouseReleaseEvent(QMouseEvent * event);
 
 private:
     Mlt::Geometry *m_geom;
     int m_length;
     int m_position;
     double m_scale;
+    bool m_movingKeyframe;
+    Mlt::GeometryItem m_movingItem;
+    QPoint m_dragStart;
 
 public slots:
     void setKeyGeometry(Mlt::Geometry *geom, const int length);
@@ -53,6 +56,7 @@ public slots:
 
 signals:
     void positionChanged(int);
+    void keyframeMoved(int);
 };
 
 #endif