]> git.sesse.net Git - kdenlive/blobdiff - src/geometryval.cpp
Fix broken loading when document profile was different than default profile
[kdenlive] / src / geometryval.cpp
index a8e515e7a62755651e4efc5bbb57813be664e176..6b3323ddfad46c8d0f12289f9377cd0b712151a6 100644 (file)
@@ -50,6 +50,9 @@ 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)));
+    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);
@@ -69,23 +72,24 @@ 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);
 
 
+    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()));
     m_scaleMenu->addAction(i18n("Original size"), this, SLOT(slotResizeOriginal()));
     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()));
@@ -95,7 +99,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());
 
@@ -111,8 +115,27 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidg
     connect(m_ui.buttonDelete , SIGNAL(clicked()) , this , SLOT(slotDeleteFrame()));
     connect(m_ui.buttonAdd , SIGNAL(clicked()) , this , SLOT(slotAddFrame()));
     connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateTransitionProperties()));
+    connect(m_scene, SIGNAL(doubleClickEvent()), this, SLOT(slotGeometry()));
+
+}
+
+
+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;
+    delete m_geom;
+    delete m_scene;
 }
 
+
 void Geometryval::slotAlignCenter()
 {
     int pos = m_ui.spinPos->value();
@@ -309,6 +332,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);
@@ -316,6 +340,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());
@@ -323,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);
@@ -341,15 +366,16 @@ 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();
     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());
@@ -364,6 +390,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();
 }
@@ -400,7 +427,7 @@ QDomElement Geometryval::getParamDesc()
     return m_param;
 }
 
-void Geometryval::setupParam(const QDomElement& par, int minFrame, int maxFrame)
+void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame)
 {
     m_param = par;
     QString val = par.attribute("value");
@@ -414,6 +441,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);
@@ -492,3 +520,66 @@ void Geometryval::slotUpdateTransitionProperties()
     updateTransitionPath();
     emit parameterChanged();
 }
+
+void Geometryval::slotGeometry()
+{
+    int pos = m_ui.spinPos->value();
+    Mlt::GeometryItem item;
+    int error = m_geom->fetch(&item, pos);
+    if (error || item.key() == false) {
+        // no keyframe under cursor
+        return;
+    }
+    QRectF r = m_paramRect->rect().normalized();
+
+    QDialog d(this);
+    m_view.setupUi(&d);
+    d.setWindowTitle(i18n("Frame Geometry"));
+    m_view.value_x->setMaximum(10000);
+    m_view.value_x->setMinimum(-10000);
+    m_view.value_y->setMaximum(10000);
+    m_view.value_y->setMinimum(-10000);
+    m_view.value_width->setMaximum(500000);
+    m_view.value_width->setMinimum(1);
+    m_view.value_height->setMaximum(500000);
+    m_view.value_height->setMinimum(1);
+
+    m_view.value_x->setValue(m_paramRect->pos().x());
+    m_view.value_y->setValue(m_paramRect->pos().y());
+    m_view.value_width->setValue(r.width());
+    m_view.value_height->setValue(r.height());
+    connect(m_view.button_reset , SIGNAL(clicked()) , this , SLOT(slotResetPosition()));
+
+    if (d.exec() == QDialog::Accepted) {
+        m_paramRect->setPos(m_view.value_x->value(), m_view.value_y->value());
+        m_paramRect->setRect(0, 0, m_view.value_width->value(), m_view.value_height->value());
+        slotUpdateTransitionProperties();
+    }
+}
+
+void Geometryval::slotResetPosition()
+{
+    m_view.value_x->setValue(0);
+    m_view.value_y->setValue(0);
+
+    if (m_frameSize.isNull()) {
+        m_view.value_width->setValue(m_profile.width);
+        m_view.value_height->setValue(m_profile.height);
+    } else {
+        m_view.value_width->setValue(m_frameSize.x());
+        m_view.value_height->setValue(m_frameSize.y());
+    }
+}
+
+void Geometryval::setFrameSize(QPoint p)
+{
+    m_frameSize = p;
+}
+
+
+void Geometryval::slotKeyframeMoved(int pos)
+{
+    slotPositionChanged(pos);
+    slotUpdateTransitionProperties();
+}
+