-GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos, bool isEffect, bool showRotation, QWidget* parent):
+GeometryWidget::GeometryWidget(Monitor* monitor, const Timecode &timecode, int clipPos, bool isEffect, bool showRotation, QWidget* parent):
QWidget(parent),
m_monitor(monitor),
m_timePos(new TimecodeDisplay(timecode)),
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();
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()));
m_scene->removeItem(m_geomPath);
delete m_geomPath;
}
- if (m_previous) delete m_previous;
+ delete m_previous;
delete m_geometry;
m_extraGeometryNames.clear();
m_extraFactors.clear();
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();
return val;
}
-void GeometryWidget::setupParam(const QDomElement elem, int minframe, int maxframe)
+void GeometryWidget::setupParam(const QDomElement &elem, int minframe, int maxframe)
{
m_inPoint = minframe;
m_outPoint = maxframe;
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);
}
-void GeometryWidget::addParameter(const QDomElement elem)
+void GeometryWidget::addParameter(const QDomElement &elem)
{
Mlt::Geometry *geometry = new Mlt::Geometry(elem.attribute("value").toUtf8().data(), m_outPoint - m_inPoint, m_monitor->render->frameRenderWidth(), m_monitor->render->renderHeight());
m_extraGeometries.append(geometry);
m_timeline->addGeometry(geometry);
m_extraFactors.append(elem.attribute("factor", "1"));
m_extraGeometryNames.append(elem.attribute("name"));
- //kDebug()<<"ADDED PARAM: "<<elem.attribute("value");
}
void GeometryWidget::slotSyncPosition(int relTimelinePos)
m_opacity->setValue(item.mix());
m_opacity->blockSignals(false);
- for (int i = 0; i < m_extraGeometries.count(); i++) {
+ for (int i = 0; i < m_extraGeometries.count(); ++i) {
Mlt::Geometry *geom = m_extraGeometries.at(i);
QString name = m_extraGeometryNames.at(i);
if (!geom->fetch(&item, pos)) {
item.mix(m_opacity->value());
m_geometry->insert(item);
- for (int i = 0; i < m_extraGeometries.count(); i++) {
+ for (int i = 0; i < m_extraGeometries.count(); ++i) {
Mlt::Geometry *geom = m_extraGeometries.at(i);
QString name = m_extraGeometryNames.at(i);
DragValue *widget = findChild<DragValue *>(name);
}
m_geometry->remove(pos);
- for (int i = 0; i < m_extraGeometries.count(); i++) {
+ for (int i = 0; i < m_extraGeometries.count(); ++i) {
Mlt::Geometry *geom = m_extraGeometries.at(i);
geom->remove(pos);
}
m_timeline->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);
item.h(rectSize.height());
m_geometry->insert(item);
- for (int i = 0; i < m_extraGeometries.count(); i++) {
+ for (int i = 0; i < m_extraGeometries.count(); ++i) {
Mlt::Geometry *geom = m_extraGeometries.at(i);
QString name = m_extraGeometryNames.at(i);
Mlt::GeometryItem item2;
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);
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);
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);
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);
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);
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);
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);
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);