]> git.sesse.net Git - kdenlive/blobdiff - src/geometrywidget.cpp
Fix small memleaks, and add option to show previous keyframe on monitor scene
[kdenlive] / src / geometrywidget.cpp
index 6e3850758d6191c46fd2ebc18a7a2c87f09315b0..efb8613c25e4e0636a9295d2ae4d4d9e2a45fb03 100644 (file)
@@ -46,12 +46,15 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos,
     m_outPoint(1),
     m_isEffect(isEffect),
     m_rect(NULL),
+    m_previous(NULL),
     m_geometry(NULL),
     m_showScene(true)
 {
     m_ui.setupUi(this);
     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum);
     MonitorEditWidget *edit = monitor->getEffectEdit();
+    edit->removeCustomControls();
+    edit->addCustomButton(KIcon("transform-crop"), i18n("Show previous keyframe"), this, SLOT(slotShowPreviousKeyFrame(bool)), true, KdenliveSettings::onmonitoreffects_geometryshowprevious());
     edit->showVisibilityButton(true);
     m_scene = edit->getScene();
 
@@ -187,6 +190,8 @@ GeometryWidget::~GeometryWidget()
     delete m_spinHeight;
     delete m_opacity;
     m_scene->removeItem(m_rect);
+    if (m_rect) delete m_rect;
+    if (m_previous) delete m_previous;
     delete m_geometry;
     if (m_monitor) {
         m_monitor->getEffectEdit()->showVisibilityButton(false);
@@ -194,6 +199,12 @@ GeometryWidget::~GeometryWidget()
     }
 }
 
+void GeometryWidget::slotShowPreviousKeyFrame(bool show)
+{
+    KdenliveSettings::setOnmonitoreffects_geometryshowprevious(show);
+    slotPositionChanged(-1, false);
+}
+
 void GeometryWidget::updateTimecodeFormat()
 {
     m_timePos->slotUpdateTimeCodeFormat();
@@ -267,6 +278,7 @@ void GeometryWidget::slotPositionChanged(int pos, bool seek)
     m_timeline->blockSignals(false);
 
     Mlt::GeometryItem item;
+    Mlt::GeometryItem previousItem;
     if (m_geometry->fetch(&item, pos) || item.key() == false) {
         // no keyframe
         m_rect->setEnabled(false);
@@ -282,6 +294,28 @@ void GeometryWidget::slotPositionChanged(int pos, bool seek)
         m_ui.buttonAddDelete->setIcon(KIcon("edit-delete"));
         m_ui.buttonAddDelete->setToolTip(i18n("Delete keyframe"));
     }
+    
+    if (KdenliveSettings::onmonitoreffects_geometryshowprevious() == false || m_geometry->prev_key(&previousItem, pos - 1) || previousItem.frame() == item.frame()) {
+        if (m_previous) {
+            m_scene->removeItem(m_previous);
+        }
+    }
+    else {
+        if (m_previous == NULL) {
+            m_previous = new QGraphicsRectItem(0, 0, previousItem.w(), previousItem.h());
+            m_previous->setBrush(QColor(200, 200, 0, 20));
+            m_previous->setPen(QPen(Qt::white, 0, Qt::DotLine));
+            
+            m_previous->setPos(previousItem.x(), previousItem.y());
+            m_previous->setZValue(-1);
+            m_previous->setEnabled(false);
+        }
+        else {
+            m_previous->setPos(previousItem.x(), previousItem.y());
+            m_previous->setRect(0, 0, previousItem.w(), previousItem.h());
+        }
+        m_scene->addItem(m_previous);
+    }
 
     m_rect->setPos(item.x(), item.y());
     m_rect->setRect(0, 0, item.w(), item.h());