]> git.sesse.net Git - kdenlive/blobdiff - src/monitor.cpp
Fix seek cursor not disappearing from monitor ruler when pausing
[kdenlive] / src / monitor.cpp
index aebf23cda1c4453c168b0c5c932be05c213878c9..ccdce950d04d512769f24e3f0c57e74002c80f26 100644 (file)
 #include <QVBoxLayout>
 
 
+#define SEEK_INACTIVE (-1)
+
+
 Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profile, QWidget *parent) :
     AbstractMonitor(id, manager, parent),
     render(NULL),
     m_currentClip(NULL),
-    m_ruler(new SmallRuler(m_monitorManager)),
     m_overlay(NULL),
     m_scale(1),
     m_length(0),
@@ -69,8 +71,7 @@ Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profil
     // Get base size for icons
     int s = style()->pixelMetric(QStyle::PM_SmallIconSize);
 
-    // Monitor ruler
-    layout->addWidget(m_ruler);
+
     // Tool bar buttons
     m_toolbar = new QToolBar(this);
     m_toolbar->setIconSize(QSize(s, s));
@@ -78,11 +79,10 @@ Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profil
     m_playIcon = KIcon("media-playback-start");
     m_pauseIcon = KIcon("media-playback-pause");
 
+
     if (id != Kdenlive::dvdMonitor) {
         m_toolbar->addAction(KIcon("kdenlive-zone-start"), i18n("Set zone start"), this, SLOT(slotSetZoneStart()));
         m_toolbar->addAction(KIcon("kdenlive-zone-end"), i18n("Set zone end"), this, SLOT(slotSetZoneEnd()));
-    } else {
-        m_ruler->setZone(-3, -2);
     }
 
     m_toolbar->addAction(KIcon("media-seek-backward"), i18n("Rewind"), this, SLOT(slotRewind()));
@@ -169,8 +169,12 @@ Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profil
     }
 #endif
 
+    // Monitor ruler
+    m_ruler = new SmallRuler(m_monitorManager, render);
+    if (id == Kdenlive::dvdMonitor) m_ruler->setZone(-3, -2);
+    layout->addWidget(m_ruler);
+    
     connect(m_audioSlider, SIGNAL(valueChanged(int)), this, SLOT(slotSetVolume(int)));
-    connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int)));
     connect(render, SIGNAL(durationChanged(int)), this, SLOT(adjustRulerSize(int)));
     connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
     connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
@@ -419,7 +423,7 @@ void Monitor::slotZoneMoved(int start, int end)
 
 void Monitor::slotSetZoneStart()
 {
-    m_ruler->setZone(m_ruler->position(), -1);
+    m_ruler->setZoneStart();
     emit zoneUpdated(m_ruler->zone());
     checkOverlay();
     setClipZone(m_ruler->zone());
@@ -427,7 +431,7 @@ void Monitor::slotSetZoneStart()
 
 void Monitor::slotSetZoneEnd()
 {
-    m_ruler->setZone(-1, m_ruler->position());
+    m_ruler->setZoneEnd();
     emit zoneUpdated(m_ruler->zone());
     checkOverlay();
     setClipZone(m_ruler->zone());
@@ -546,7 +550,9 @@ void Monitor::slotMouseSeek(int eventDelta, bool fast)
     if (fast) {
         int delta = m_monitorManager->timecode().fps();
         if (eventDelta > 0) delta = 0 - delta;
-        slotSeek(m_ruler->position() - delta);
+       if (render->requestedSeekPosition != SEEK_INACTIVE)
+           slotSeek(render->requestedSeekPosition - delta);
+       else slotSeek(render->seekFramePosition() - delta);
     } else {
         if (eventDelta >= 0) slotForwardOneFrame();
         else slotRewindOneFrame();
@@ -577,13 +583,14 @@ void Monitor::slotExtractCurrentFrame()
         frame = render->extractFrame(render->seekFramePosition(), m_currentClip->fileURL().path());
     }
     else frame = render->extractFrame(render->seekFramePosition());
-    KFileDialog *fs = new KFileDialog(KUrl(), "image/png", this);
+    QPointer<KFileDialog> fs = new KFileDialog(KUrl(), "image/png", this);
     fs->setOperationMode(KFileDialog::Saving);
     fs->setMode(KFile::File);
     fs->setConfirmOverwrite(true);
     fs->setKeepLocation(true);
     fs->exec();
-    QString path = fs->selectedFile();
+    QString path;
+    if (fs) path = fs->selectedFile();
     delete fs;
     if (!path.isEmpty()) {
         frame.save(path);
@@ -606,13 +613,14 @@ void Monitor::slotSeek(int pos)
     if (render == NULL) return;
     slotActivateMonitor();
     render->seekToFrame(pos);
+    m_ruler->update();
 }
 
 void Monitor::checkOverlay()
 {
     if (m_overlay == NULL) return;
     QString overlayText;
-    int pos = m_ruler->position();
+    int pos = render->seekFramePosition();
     QPoint zone = m_ruler->zone();
     if (pos == zone.x())
         overlayText = i18n("In Point");
@@ -688,6 +696,7 @@ void Monitor::slotRewindOneFrame(int diff)
     slotActivateMonitor();
     render->play(0);
     render->seekToFrameDiff(-diff);
+    m_ruler->update();
 }
 
 void Monitor::slotForwardOneFrame(int diff)
@@ -695,11 +704,11 @@ void Monitor::slotForwardOneFrame(int diff)
     slotActivateMonitor();
     render->play(0);
     render->seekToFrameDiff(diff);
+    m_ruler->update();
 }
 
 void Monitor::seekCursor(int pos)
 {
-    //slotActivateMonitor();
     if (m_ruler->slotNewValue(pos)) {
         checkOverlay();
         m_timePos->setValue(pos);
@@ -777,6 +786,7 @@ void Monitor::slotPlay()
         m_playAction->setIcon(m_playIcon);
         render->switchPlay(false);
     }
+    m_ruler->refreshRuler();
 }
 
 void Monitor::slotPlayZone()