]> git.sesse.net Git - kdenlive/blobdiff - src/geometryval.cpp
New option in composite transition: double click in rectangle to manually adjust...
[kdenlive] / src / geometryval.cpp
index a58fdfd0cd6cff208b7307d8abbb8dd19685066a..78fd7095381c6e2cbe3736e67e256ab2de72ffc2 100644 (file)
 #include <QVBoxLayout>
 #include <QGraphicsRectItem>
 #include <QMenu>
+#include <QInputDialog>
 
 
-Geometryval::Geometryval(const MltVideoProfile profile, QWidget* parent) :
+Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidget* parent) :
         QWidget(parent),
         m_profile(profile),
         m_paramRect(NULL),
         m_geom(NULL),
         m_path(NULL),
-        m_fixedMode(false)
+        m_fixedMode(false),
+        m_frameSize(frame_size)
 {
     m_ui.setupUi(this);
     QVBoxLayout* vbox = new QVBoxLayout(m_ui.widget);
@@ -73,12 +75,15 @@ Geometryval::Geometryval(const MltVideoProfile profile, QWidget* parent) :
     m_ui.buttonMenu->setPopupMode(QToolButton::QToolButton::InstantPopup);
 
 
+    configMenu->addAction(i18n("Geometry"), this, SLOT(slotGeometry()));
+
     m_scaleMenu = new QMenu(i18n("Resize..."), this);
     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);
@@ -107,6 +112,8 @@ Geometryval::Geometryval(const MltVideoProfile profile, QWidget* parent) :
     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()));
+
 }
 
 void Geometryval::slotAlignCenter()
@@ -239,6 +246,37 @@ void Geometryval::slotResize200()
     slotUpdateTransitionProperties();
 }
 
+void Geometryval::slotResizeOriginal()
+{
+    if (m_frameSize.isNull()) slotResize100();
+    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;
+    }
+    m_paramRect->setRect(0, 0, m_frameSize.x(), m_frameSize.y());
+    slotUpdateTransitionProperties();
+}
+
+void Geometryval::slotResizeCustom()
+{
+    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;
+    }
+    int scale = m_paramRect->rect().width() * 100 / m_profile.width;
+    bool ok;
+    scale =  QInputDialog::getInteger(this, i18n("Resize..."), i18n("Scale"), scale, 1, 2147483647, 10, &ok);
+    if (!ok) return;
+    m_paramRect->setRect(0, 0, m_profile.width * scale / 100, m_profile.height * scale / 100);
+    slotUpdateTransitionProperties();
+}
+
 void Geometryval::slotTransparencyChanged(int transp)
 {
     int pos = m_ui.spinPos->value();
@@ -448,11 +486,64 @@ void Geometryval::slotUpdateTransitionProperties()
         // no keyframe under cursor
         return;
     }
+    QRectF r = m_paramRect->rect().normalized();
     item.x(m_paramRect->pos().x());
     item.y(m_paramRect->pos().y());
-    item.w(m_paramRect->rect().width());
-    item.h(m_paramRect->rect().height());
+    item.w(r.width());
+    item.h(r.height());
     m_geom->insert(item);
     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 = new Ui::GeometryPosition_UI();
+    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();
+    }
+    delete m_view;
+}
+
+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());
+    }
+}