]> git.sesse.net Git - kdenlive/commitdiff
Fix small memleaks, and add option to show previous keyframe on monitor scene
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 14 Feb 2011 18:34:20 +0000 (18:34 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 14 Feb 2011 18:34:20 +0000 (18:34 +0000)
svn path=/trunk/kdenlive/; revision=5408

src/cornerswidget.cpp
src/geometrywidget.cpp
src/geometrywidget.h
src/kdenlivesettings.kcfg
src/monitoreditwidget.cpp

index b588336d09b2a7e14d47d321b78aa533fa4a90ae..1987b7ca861e72558109922ecda0c0e6ed236396 100644 (file)
@@ -50,6 +50,7 @@ CornersWidget::CornersWidget(Monitor *monitor, QDomElement e, int minFrame, int
     m_scene->addItem(m_item);
 
     // TODO: Better Icons
+    edit->removeCustomControls();
     edit->addCustomButton(KIcon("transform-move"), i18n("Show additional controls"), this, SLOT(slotShowControls(bool)),
                           true, KdenliveSettings::onmonitoreffects_cornersshowcontrols());
     edit->addCustomButton(KIcon("insert-horizontal-rule"), i18n("Show/Hide the lines connecting the corners"), this, SLOT(slotShowLines(bool)),
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());
index 9425eacb8f3cec65a0d9d6c8dea4b1f5c7406634..29598280ff4df887ef653473aac589d83f11ba05 100644 (file)
@@ -33,6 +33,7 @@ class MonitorScene;
 class KeyframeHelper;
 class TimecodeDisplay;
 class OnMonitorRectItem;
+class QGraphicsRectItem;
 class DragValue;
 
 class GeometryWidget : public QWidget
@@ -78,6 +79,7 @@ private:
     bool m_isEffect;
     MonitorScene *m_scene;
     OnMonitorRectItem *m_rect;
+    QGraphicsRectItem *m_previous;
     KeyframeHelper *m_timeline;
     /** Stores the different settings in the MLT geometry format. */
     Mlt::Geometry *m_geometry;
@@ -155,6 +157,8 @@ private slots:
     void slotAdjustToFrameSize();
     void slotFitToWidth();
     void slotFitToHeight();
+    /** @brief Show / hide previous keyframe in monitor scene. */
+    void slotShowPreviousKeyFrame(bool show);
 
 signals:
     void parameterChanged();
index e9ed358e534be52e019e8204b9eae3034dd5c767..6be859b24948ad36c4729c84fe27585a67f2e0da 100644 (file)
       <default>false</default>
     </entry>
 
+    <entry name="onmonitoreffects_geometryshowprevious" type="Bool">
+      <label>Show previous keyframe in monitor.</label>
+      <default>false</default>
+    </entry>
+
     <entry name="onmonitoreffects_cornersshowcontrols" type="Bool">
       <label>Show additional controls in the c0rners on-monitor widget.</label>
       <default>false</default>
index 25df13dd2827b30a7b9bfe005731bc839e8f7db0..76109ba546a3774ea92e1d0936d87f5fecc84190 100644 (file)
@@ -121,8 +121,10 @@ void MonitorEditWidget::addCustomButton(const QIcon& icon, const QString& text,
 void MonitorEditWidget::removeCustomControls()
 {
     QLayoutItem *child;
-    while ((child = m_customControlsLayout->takeAt(0)) != 0)
+    while ((child = m_customControlsLayout->takeAt(0)) != 0) {
+        if (child->widget()) delete child->widget();
         delete child;
+    }
 }
 
 void MonitorEditWidget::slotSetDirectUpdate(bool directUpdate)