X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fgeometrywidget.cpp;h=c5e50ce2d20387afd2d259def078cc18459f1c62;hb=9a9c75a8375583b7dee43938741d1bebce9416d4;hp=7067b94c78bfab19e6da2c1c6773b1e6c9316224;hpb=b6a63f517f9c93311bd5b119d6c30a85cca7edc4;p=kdenlive diff --git a/src/geometrywidget.cpp b/src/geometrywidget.cpp index 7067b94c..c5e50ce2 100644 --- a/src/geometrywidget.cpp +++ b/src/geometrywidget.cpp @@ -57,6 +57,7 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos, setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum); MonitorEditWidget *edit = monitor->getEffectEdit(); edit->removeCustomControls(); + edit->addCustomButton(KIcon("draw-path"), i18n("Show path"), this, SLOT(slotShowPath(bool)), true, KdenliveSettings::onmonitoreffects_geometryshowpath()); edit->addCustomButton(KIcon("transform-crop"), i18n("Show previous keyframe"), this, SLOT(slotShowPreviousKeyFrame(bool)), true, KdenliveSettings::onmonitoreffects_geometryshowprevious()); m_scene = edit->getScene(); m_scene->cleanup(); @@ -89,7 +90,7 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos, connect(m_timeline, SIGNAL(keyframeMoved(int)), this, SLOT(slotKeyframeMoved(int))); connect(m_timeline, SIGNAL(addKeyframe(int)), this, SLOT(slotAddKeyframe(int))); connect(m_timeline, SIGNAL(removeKeyframe(int)), this, SLOT(slotDeleteKeyframe(int))); - connect(m_timePos, SIGNAL(editingFinished()), this, SLOT(slotPositionChanged())); + connect(m_timePos, SIGNAL(timeCodeEditingFinished()), this, SLOT(slotPositionChanged())); connect(m_ui.buttonPrevious, SIGNAL(clicked()), this, SLOT(slotPreviousKeyframe())); connect(m_ui.buttonNext, SIGNAL(clicked()), this, SLOT(slotNextKeyframe())); connect(m_ui.buttonAddDelete, SIGNAL(clicked()), this, SLOT(slotAddDeleteKeyframe())); @@ -119,9 +120,16 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos, QAction *importKeyframes = new QAction(i18n("Import keyframes from clip"), this); connect(importKeyframes, SIGNAL(triggered()), this, SIGNAL(importClipKeyframes())); menu->addAction(importKeyframes); - QAction *resetKeyframes = new QAction(i18n("Reset keyframes"), this); + QAction *resetKeyframes = new QAction(i18n("Reset all keyframes"), this); connect(resetKeyframes, SIGNAL(triggered()), this, SLOT(slotResetKeyframes())); menu->addAction(resetKeyframes); + + QAction *resetNextKeyframes = new QAction(i18n("Reset keyframes after cursor"), this); + connect(resetNextKeyframes, SIGNAL(triggered()), this, SLOT(slotResetNextKeyframes())); + menu->addAction(resetNextKeyframes); + QAction *resetPreviousKeyframes = new QAction(i18n("Reset keyframes before cursor"), this); + connect(resetPreviousKeyframes, SIGNAL(triggered()), this, SLOT(slotResetPreviousKeyframes())); + menu->addAction(resetPreviousKeyframes); menu->addSeparator(); QAction *syncTimeline = new QAction(KIcon("insert-link"), i18n("Synchronize with timeline cursor"), this); @@ -284,6 +292,16 @@ void GeometryWidget::slotShowPreviousKeyFrame(bool show) slotPositionChanged(-1, false); } +void GeometryWidget::slotShowPath(bool show) +{ + KdenliveSettings::setOnmonitoreffects_geometryshowpath(show); + if (m_geomPath) { + if (show) m_scene->addItem(m_geomPath); + else m_scene->removeItem(m_geomPath); + } + slotPositionChanged(-1, false); +} + void GeometryWidget::updateTimecodeFormat() { m_timePos->slotUpdateTimeCodeFormat(); @@ -354,7 +372,8 @@ void GeometryWidget::setupParam(const QDomElement elem, int minframe, int maxfra connect(m_geomPath, SIGNAL(changed()), this, SLOT(slotUpdatePath())); m_geomPath->setPen(QPen(Qt::red)); m_geomPath->setPoints(m_geometry); - m_scene->addItem(m_geomPath); + if (KdenliveSettings::onmonitoreffects_geometryshowpath()) + m_scene->addItem(m_geomPath); m_scene->centerView(); slotPositionChanged(0, false); } @@ -366,7 +385,6 @@ void GeometryWidget::addParameter(const QDomElement elem) m_timeline->addGeometry(geometry); m_extraFactors.append(elem.attribute("factor", "1")); m_extraGeometryNames.append(elem.attribute("name")); - //kDebug()<<"ADDED PARAM: "<update(); - if (m_geomPath) { + if (m_geomPath && KdenliveSettings::onmonitoreffects_geometryshowpath()) { m_scene->removeItem(m_geomPath); m_geomPath->setPoints(m_geometry); m_scene->addItem(m_geomPath); @@ -617,7 +635,7 @@ void GeometryWidget::slotUpdateGeometry() geom->insert(item2); } } - if (m_geomPath) { + if (m_geomPath && KdenliveSettings::onmonitoreffects_geometryshowpath()) { m_scene->removeItem(m_geomPath); m_geomPath->setPoints(m_geometry); m_scene->addItem(m_geomPath); @@ -808,6 +826,14 @@ void GeometryWidget::slotResetKeyframes() m_geometry->remove(item.frame()); } + // Delete extra geometry keyframes too + for (int i = 0; i < m_extraGeometries.count(); i++) { + Mlt::Geometry *geom = m_extraGeometries.at(i); + while (!geom->next_key(&item, 1)) { + geom->remove(item.frame()); + } + } + // Create neutral first keyframe item.frame(0); item.x(0); @@ -817,14 +843,99 @@ void GeometryWidget::slotResetKeyframes() item.mix(100); m_geometry->insert(item); m_timeline->setKeyGeometry(m_geometry, m_outPoint - m_inPoint); - if (m_geomPath) { + if (m_geomPath && KdenliveSettings::onmonitoreffects_geometryshowpath()) { + m_scene->removeItem(m_geomPath); + m_geomPath->setPoints(m_geometry); + m_scene->addItem(m_geomPath); + } + slotPositionChanged(-1, false); + emit parameterChanged(); +} + +void GeometryWidget::slotResetNextKeyframes() +{ + // Delete keyframes after cursor pos + Mlt::GeometryItem item; + int pos = m_timePos->getValue(); + while (!m_geometry->next_key(&item, pos)) { + m_geometry->remove(item.frame()); + } + + // Delete extra geometry keyframes too + for (int i = 0; i < m_extraGeometries.count(); i++) { + Mlt::Geometry *geom = m_extraGeometries.at(i); + while (!geom->next_key(&item, pos)) { + geom->remove(item.frame()); + } + } + + // Make sure we have at least one keyframe + if (m_geometry->next_key(&item, 0)) { + item.frame(0); + item.x(0); + item.y(0); + item.w(m_monitor->render->frameRenderWidth()); + item.h(m_monitor->render->renderHeight()); + item.mix(100); + m_geometry->insert(item); + } + m_timeline->setKeyGeometry(m_geometry, m_outPoint - m_inPoint); + if (m_geomPath && KdenliveSettings::onmonitoreffects_geometryshowpath()) { + m_scene->removeItem(m_geomPath); + m_geomPath->setPoints(m_geometry); + m_scene->addItem(m_geomPath); + } + slotPositionChanged(-1, false); + emit parameterChanged(); +} + +void GeometryWidget::slotResetPreviousKeyframes() +{ + // Delete keyframes before cursor pos + Mlt::GeometryItem item; + int pos = 0; + while (!m_geometry->next_key(&item, pos) && pos < m_timePos->getValue()) { + pos = item.frame() + 1; + m_geometry->remove(item.frame()); + } + + // Delete extra geometry keyframes too + for (int i = 0; i < m_extraGeometries.count(); i++) { + Mlt::Geometry *geom = m_extraGeometries.at(i); + pos = 0; + while (!geom->next_key(&item, pos) && pos < m_timePos->getValue()) { + pos = item.frame() + 1; + geom->remove(item.frame()); + } + } + + // Make sure we have at least one keyframe + if (!m_geometry->next_key(&item, 0)) { + item.frame(0); + /*item.x(0); + item.y(0); + item.w(m_monitor->render->frameRenderWidth()); + item.h(m_monitor->render->renderHeight()); + item.mix(100);*/ + m_geometry->insert(item); + } + else { + item.frame(0); + item.x(0); + item.y(0); + item.w(m_monitor->render->frameRenderWidth()); + item.h(m_monitor->render->renderHeight()); + item.mix(100); + m_geometry->insert(item); + } + m_timeline->setKeyGeometry(m_geometry, m_outPoint - m_inPoint); + if (m_geomPath && KdenliveSettings::onmonitoreffects_geometryshowpath()) { m_scene->removeItem(m_geomPath); m_geomPath->setPoints(m_geometry); m_scene->addItem(m_geomPath); } slotPositionChanged(-1, false); emit parameterChanged(); - } void GeometryWidget::importKeyframes(const QString &data, int maximum) @@ -874,7 +985,7 @@ void GeometryWidget::importKeyframes(const QString &data, int maximum) m_geometry->insert(item); } m_timeline->setKeyGeometry(m_geometry, m_outPoint - m_inPoint); - if (m_geomPath) { + if (m_geomPath && KdenliveSettings::onmonitoreffects_geometryshowpath()) { m_scene->removeItem(m_geomPath); m_geomPath->setPoints(m_geometry); m_scene->addItem(m_geomPath);