]> git.sesse.net Git - kdenlive/blobdiff - src/monitor.cpp
Fix freeze when making fast play / pause
[kdenlive] / src / monitor.cpp
index 819f0b27b2c6e13b0525f40945e86283c3b887be..4cf150df7ac76e303fc5b3e396d39c669bb67c82 100644 (file)
@@ -19,8 +19,6 @@
 
 
 #include "monitor.h"
-#include "renderer.h"
-#include "monitormanager.h"
 #include "smallruler.h"
 #include "docclipbase.h"
 #include "abstractclipitem.h"
 
 
 Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget *parent) :
-    QWidget(parent),
+    AbstractMonitor(parent),
     render(NULL),
     m_name(name),
     m_monitorManager(manager),
     m_currentClip(NULL),
     m_ruler(new SmallRuler(m_monitorManager)),
     m_overlay(NULL),
-    m_isActive(false),
     m_scale(1),
     m_length(0),
     m_dragStarted(false),
     m_monitorRefresh(NULL),
     m_effectWidget(NULL),
     m_selectedClip(NULL),
-    m_loopClipTransition(true)
+    m_loopClipTransition(true),
+    m_editMarker(NULL)
 
 {
     QVBoxLayout *layout = new QVBoxLayout;
@@ -184,8 +182,6 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget
     connect(render, SIGNAL(durationChanged(int)), this, SLOT(adjustRulerSize(int)));
     connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
 
-    //render->createVideoXWindow(m_ui.video_frame->winId(), -1);
-
     if (name != "clip") {
         connect(render, SIGNAL(rendererPosition(int)), this, SIGNAL(renderPosition(int)));
         connect(render, SIGNAL(durationChanged(int)), this, SIGNAL(durationChanged(int)));
@@ -229,7 +225,7 @@ QWidget *Monitor::container()
     return m_videoBox;
 }
 
-QString Monitor::name() const
+const QString Monitor::name() const
 {
     return m_name;
 }
@@ -256,8 +252,16 @@ void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMe
     m_contextMenu->addMenu(m_playMenu);
     if (goMenu)
         m_contextMenu->addMenu(goMenu);
-    if (markerMenu)
+    if (markerMenu) {
         m_contextMenu->addMenu(markerMenu);
+        QList <QAction *>list = markerMenu->actions();
+        for (int i = 0; i < list.count(); i++) {
+            if (list.at(i)->data().toString() == "edit_marker") {
+                m_editMarker = list.at(i);
+                break;
+            }
+        }
+    }
 
     m_playMenu->addAction(playZone);
     m_playMenu->addAction(loopZone);
@@ -443,11 +447,13 @@ void Monitor::slotSetZoneEnd()
 void Monitor::mousePressEvent(QMouseEvent * event)
 {
     if (event->button() != Qt::RightButton) {
-        if (m_videoBox->underMouse()) {
+        if (m_videoBox->underMouse() && (!m_overlay || !m_overlay->underMouse())) {
             m_dragStarted = true;
             m_DragStartPosition = event->pos();
         }
-    } else m_contextMenu->popup(event->globalPos());
+    } else if (!m_effectWidget || !m_effectWidget->isVisible()) {
+        m_contextMenu->popup(event->globalPos());
+    }
 }
 
 void Monitor::slotSwitchFullScreen()
@@ -550,12 +556,18 @@ void Monitor::slotSetThumbFrame()
         return;
     }
     m_currentClip->setClipThumbFrame((uint) render->seekFramePosition());
-    emit refreshClipThumbnail(m_currentClip->getId());
+    emit refreshClipThumbnail(m_currentClip->getId(), true);
 }
 
 void Monitor::slotExtractCurrentFrame()
 {
-    QImage frame = render->extractFrame(render->seekFramePosition());
+    QImage frame;
+    // check if we are using a proxy
+    if (m_currentClip && !m_currentClip->getProperty("proxy").isEmpty() && m_currentClip->getProperty("proxy") != "-") {
+        // using proxy, use original clip url to get frame
+        frame = render->extractFrame(render->seekFramePosition(), m_currentClip->fileURL().path());
+    }
+    else frame = render->extractFrame(render->seekFramePosition());
     KFileDialog *fs = new KFileDialog(KUrl(), "image/png", this);
     fs->setOperationMode(KFileDialog::Saving);
     fs->setMode(KFile::File);
@@ -573,14 +585,12 @@ void Monitor::slotExtractCurrentFrame()
 
 bool Monitor::isActive() const
 {
-    return m_isActive;
+    return m_monitorManager->isActive(m_name);
 }
 
 void Monitor::activateMonitor()
 {
-    if (!m_isActive) {
-        m_monitorManager->slotSwitchMonitors(m_name == "clip");
-    }
+    m_monitorManager->activateMonitor(m_name);
 }
 
 void Monitor::setTimePos(const QString &pos)
@@ -596,7 +606,7 @@ void Monitor::slotSeek()
 
 void Monitor::slotSeek(int pos)
 {
-    activateMonitor();
+    //activateMonitor();
     if (render == NULL) return;
     render->seekToFrame(pos);
 }
@@ -689,7 +699,7 @@ void Monitor::slotForwardOneFrame(int diff)
 
 void Monitor::seekCursor(int pos)
 {
-    activateMonitor();
+    //activateMonitor();
     if (m_ruler->slotNewValue(pos)) {
         checkOverlay();
         m_timePos->setValue(pos);
@@ -720,21 +730,19 @@ void Monitor::adjustRulerSize(int length)
 
 void Monitor::stop()
 {
-    m_isActive = false;
     disconnect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
     if (render) render->stop();
 }
 
 void Monitor::start()
 {
-    m_isActive = true;
     if (render) render->start();
     connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
 }
 
 void Monitor::refreshMonitor(bool visible)
 {
-    if (visible && render && !m_isActive) {
+    if (visible && render) {
         activateMonitor();
         render->doRefresh(); //askForRefresh();
     }
@@ -742,7 +750,7 @@ void Monitor::refreshMonitor(bool visible)
 
 void Monitor::refreshMonitor()
 {
-    if (m_isActive) {
+    if (isActive()) {
         render->doRefresh();
     }
 }
@@ -763,11 +771,12 @@ void Monitor::slotPlay()
     if (render->playSpeed() == 0) {
         //m_playAction->setChecked(true);
         m_playAction->setIcon(m_pauseIcon);
+        render->switchPlay(true);
     } else {
         //m_playAction->setChecked(false);
         m_playAction->setIcon(m_playIcon);
+        render->switchPlay(false);
     }
-    render->switchPlay();
 }
 
 void Monitor::slotPlayZone()
@@ -888,6 +897,7 @@ void Monitor::slotSwitchMonitorInfo(bool show)
 #if defined(Q_WS_MAC) || defined(USE_OPEN_GL)
             if (m_glWidget->layout()) delete m_glWidget->layout();
             m_overlay = new Overlay();
+            connect(m_overlay, SIGNAL(editMarker()), this, SLOT(slotEditMarker()));
             QVBoxLayout *layout = new QVBoxLayout;
             layout->addStretch(10);
             layout->addWidget(m_overlay);
@@ -896,6 +906,7 @@ void Monitor::slotSwitchMonitorInfo(bool show)
         } else {
             if (m_monitorRefresh->layout()) delete m_monitorRefresh->layout();
             m_overlay = new Overlay();
+            connect(m_overlay, SIGNAL(editMarker()), this, SLOT(slotEditMarker()));
             QVBoxLayout *layout = new QVBoxLayout;
             layout->addStretch(10);
             layout->addWidget(m_overlay);
@@ -910,6 +921,11 @@ void Monitor::slotSwitchMonitorInfo(bool show)
     }
 }
 
+void Monitor::slotEditMarker()
+{
+    if (m_editMarker) m_editMarker->trigger();
+}
+
 void Monitor::updateTimecodeFormat()
 {
     m_timePos->slotUpdateTimeCodeFormat();
@@ -1004,6 +1020,11 @@ void Monitor::slotShowVolume()
     m_volumePopup->show();
 }
 
+AbstractRender *Monitor::abstractRender()
+{
+    return render;
+}
+
 MonitorRefresh::MonitorRefresh(QWidget* parent) :
     QWidget(parent)
     , m_renderer(NULL)
@@ -1022,19 +1043,38 @@ void MonitorRefresh::setRenderer(Render* render)
 
 void MonitorRefresh::paintEvent(QPaintEvent *event)
 {
-    Q_UNUSED(event);
+    Q_UNUSED(event)
     if (m_renderer) m_renderer->doRefresh();
 }
 
 Overlay::Overlay(QWidget* parent) :
     QLabel(parent)
 {
-    setAttribute(Qt::WA_TransparentForMouseEvents);
+    //setAttribute(Qt::WA_TransparentForMouseEvents);
     setAutoFillBackground(true);
     setBackgroundRole(QPalette::Base);
     setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+    setCursor(Qt::PointingHandCursor);
 }
 
+// virtual
+void Overlay::mouseReleaseEvent ( QMouseEvent * event )
+{
+    event->accept();
+}
+
+// virtual
+void Overlay::mousePressEvent( QMouseEvent * event )
+{
+    event->accept();
+}
+
+// virtual
+void Overlay::mouseDoubleClickEvent ( QMouseEvent * event )
+{
+    emit editMarker();
+    event->accept();
+}
 
 void Overlay::setOverlayText(const QString &text, bool isZone)
 {
@@ -1105,7 +1145,7 @@ void VideoContainer::wheelEvent(QWheelEvent * event)
 
 void VideoContainer::mouseDoubleClickEvent(QMouseEvent * event)
 {
-    Q_UNUSED(event);
+    Q_UNUSED(event)
 
     if (!KdenliveSettings::openglmonitors())
         switchFullScreen();