X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fgeometryval.cpp;h=6b3323ddfad46c8d0f12289f9377cd0b712151a6;hb=c3259e44d9526e707ed70a0d62f6e3eb2496a123;hp=a8e515e7a62755651e4efc5bbb57813be664e176;hpb=e1984120c805806cba78941ec08839285c3b2591;p=kdenlive diff --git a/src/geometryval.cpp b/src/geometryval.cpp index a8e515e7..6b3323dd 100644 --- a/src/geometryval.cpp +++ b/src/geometryval.cpp @@ -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(); +} +