]> git.sesse.net Git - kdenlive/blobdiff - src/monitor.cpp
Fix mouse click on monitor sometimes not working
[kdenlive] / src / monitor.cpp
index 4e017b54cd71af96380e9bdeacdbe91ca0c087aa..dccd537b9ecf95bb153cb84c24b4e0af9ffc452d 100644 (file)
@@ -155,7 +155,7 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget
     createOpenGlWidget(m_videoBox, profile);
     monitorCreated = true;
     //m_glWidget->setFixedSize(width, height);
-#elif defined (USE_OPEN_GL)
+#elif defined(USE_OPENGL)
     if (KdenliveSettings::openglmonitors()) {
         monitorCreated = createOpenGlWidget(m_videoBox, profile);
     }
@@ -169,7 +169,7 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget
         render = new Render(m_name, (int) m_monitorRefresh->winId(), profile, this);
         m_monitorRefresh->setRenderer(render);
     }
-#if defined (USE_OPEN_GL)
+#ifdef USE_OPENGL
     else if (m_glWidget) {
         lay->addWidget(m_glWidget);
         m_videoBox->setLayout(lay);
@@ -180,6 +180,7 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget
     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)));
 
     if (name != "clip") {
         connect(render, SIGNAL(rendererPosition(int)), this, SIGNAL(renderPosition(int)));
@@ -229,7 +230,7 @@ const QString Monitor::name() const
     return m_name;
 }
 
-#if defined(Q_WS_MAC) || defined(USE_OPEN_GL)
+#ifdef USE_OPENGL
 bool Monitor::createOpenGlWidget(QWidget *parent, const QString profile)
 {
     render = new Render(m_name, 0, profile, this);
@@ -273,6 +274,8 @@ void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMe
     if (m_name == "clip") {
         m_contextMenu->addMenu(m_markerMenu);
         m_contextMenu->addAction(KIcon("document-save"), i18n("Save zone"), this, SLOT(slotSaveZone()));
+        QAction *extractZone = m_configMenu->addAction(KIcon("document-new"), i18n("Extract Zone"), this, SLOT(slotExtractCurrentZone()));
+        m_contextMenu->addAction(extractZone);
     }
     QAction *extractFrame = m_configMenu->addAction(KIcon("document-new"), i18n("Extract frame"), this, SLOT(slotExtractCurrentFrame()));
     m_contextMenu->addAction(extractFrame);
@@ -446,7 +449,7 @@ void Monitor::slotSetZoneEnd()
 void Monitor::mousePressEvent(QMouseEvent * event)
 {
     if (event->button() != Qt::RightButton) {
-        if (m_videoBox->underMouse() && (!m_overlay || !m_overlay->underMouse())) {
+        if (m_videoBox->geometry().contains(event->pos()) && (!m_overlay || !m_overlay->underMouse())) {
             m_dragStarted = true;
             m_DragStartPosition = event->pos();
         }
@@ -470,11 +473,11 @@ void Monitor::slotSwitchFullScreen()
 // virtual
 void Monitor::mouseReleaseEvent(QMouseEvent * event)
 {
-    if (m_dragStarted) {
-        if (m_videoBox->underMouse() && (!m_effectWidget || !m_effectWidget->isVisible())) {
+    if (m_dragStarted && event->button() != Qt::RightButton) {
+        if (m_videoBox->geometry().contains(event->pos()) && (!m_effectWidget || !m_effectWidget->isVisible())) {
             if (isActive()) slotPlay();
             else activateMonitor();
-        } else QWidget::mouseReleaseEvent(event);
+        } //else event->ignore(); //QWidget::mouseReleaseEvent(event);
         m_dragStarted = false;
     }
 }
@@ -482,7 +485,6 @@ void Monitor::mouseReleaseEvent(QMouseEvent * event)
 // virtual
 void Monitor::mouseMoveEvent(QMouseEvent *event)
 {
-    // kDebug() << "// DRAG STARTED, MOUSE MOVED: ";
     if (!m_dragStarted || m_currentClip == NULL) return;
 
     if ((event->pos() - m_DragStartPosition).manhattanLength()
@@ -502,9 +504,9 @@ void Monitor::mouseMoveEvent(QMouseEvent *event)
         data.append(list.join(";").toUtf8());
         mimeData->setData("kdenlive/clip", data);
         drag->setMimeData(mimeData);
-        QPixmap pix = m_currentClip->thumbnail();
+        /*QPixmap pix = m_currentClip->thumbnail();
         drag->setPixmap(pix);
-        drag->setHotSpot(QPoint(0, 50));
+        drag->setHotSpot(QPoint(0, 50));*/
         drag->start(Qt::MoveAction);
 
         //Qt::DropAction dropAction;
@@ -544,6 +546,14 @@ void Monitor::wheelEvent(QWheelEvent * event)
     event->accept();
 }
 
+void Monitor::mouseDoubleClickEvent(QMouseEvent * event)
+{
+    if (!KdenliveSettings::openglmonitors()) {
+        m_videoBox->switchFullScreen();
+        event->accept();
+    }
+}
+
 void Monitor::slotMouseSeek(int eventDelta, bool fast)
 {
     if (fast) {
@@ -565,6 +575,12 @@ void Monitor::slotSetThumbFrame()
     emit refreshClipThumbnail(m_currentClip->getId(), true);
 }
 
+void Monitor::slotExtractCurrentZone()
+{
+    if (m_currentClip == NULL) return;
+    emit extractZone(m_currentClip->getId(), m_ruler->zone());
+}
+
 void Monitor::slotExtractCurrentFrame()
 {
     QImage frame;
@@ -577,9 +593,7 @@ void Monitor::slotExtractCurrentFrame()
     KFileDialog *fs = new KFileDialog(KUrl(), "image/png", this);
     fs->setOperationMode(KFileDialog::Saving);
     fs->setMode(KFile::File);
-#if KDE_IS_VERSION(4,2,0)
     fs->setConfirmOverwrite(true);
-#endif
     fs->setKeepLocation(true);
     fs->exec();
     QString path = fs->selectedFile();
@@ -733,7 +747,6 @@ void Monitor::adjustRulerSize(int length)
 
 void Monitor::stop()
 {
-    disconnect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
     if (render) render->stop();
 }
 
@@ -741,7 +754,6 @@ void Monitor::start()
 {
     if (!isVisible()) return;
     if (render) render->start();
-    connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
 }
 
 void Monitor::refreshMonitor(bool visible)
@@ -819,7 +831,7 @@ void Monitor::updateClipProducer(Mlt::Producer *prod)
    render->setProducer(prod, render->seekFramePosition());
 }
 
-void Monitor::slotSetClipProducer(DocClipBase *clip, QPoint zone, int position)
+void Monitor::slotSetClipProducer(DocClipBase *clip, QPoint zone, bool forceUpdate, int position)
 {
     if (render == NULL) return;
     if (clip == NULL && m_currentClip != NULL) {
@@ -830,7 +842,7 @@ void Monitor::slotSetClipProducer(DocClipBase *clip, QPoint zone, int position)
         return;
     }
     
-    if (clip != m_currentClip) {
+    if (clip != m_currentClip || forceUpdate) {
         m_currentClip = clip;
         if (m_currentClip) activateMonitor();
         updateMarkers(clip);
@@ -917,7 +929,7 @@ void Monitor::slotSwitchMonitorInfo(bool show)
         if (m_overlay) return;
         if (m_monitorRefresh == NULL) {
             // Using OpenGL display
-#if defined(Q_WS_MAC) || defined(USE_OPEN_GL)
+#ifdef USE_OPENGL
             if (m_glWidget->layout()) delete m_glWidget->layout();
             m_overlay = new Overlay();
             connect(m_overlay, SIGNAL(editMarker()), this, SLOT(slotEditMarker()));
@@ -997,7 +1009,7 @@ void Monitor::slotEffectScene(bool show)
         if (m_monitorRefresh) {
             m_monitorRefresh->setVisible(!show);
         } else {
-#if defined(Q_WS_MAC) || defined(USE_OPEN_GL)
+#ifdef USE_OPENGL
             m_glWidget->setVisible(!show);
 #endif
         }
@@ -1048,6 +1060,13 @@ AbstractRender *Monitor::abstractRender()
     return render;
 }
 
+void Monitor::reloadProducer(const QString &id)
+{
+    if (!m_currentClip) return;
+    if (m_currentClip->getId() == id)
+        slotSetClipProducer(m_currentClip, m_currentClip->zone(), true);
+}
+
 MonitorRefresh::MonitorRefresh(QWidget* parent) :
     QWidget(parent)
     , m_renderer(NULL)
@@ -1078,20 +1097,20 @@ Overlay::Overlay(QWidget* parent) :
 // virtual
 void Overlay::mouseReleaseEvent ( QMouseEvent * event )
 {
-    event->accept();
+    event->ignore();
 }
 
 // virtual
 void Overlay::mousePressEvent( QMouseEvent * event )
 {
-    event->accept();
+    event->ignore();
 }
 
 // virtual
 void Overlay::mouseDoubleClickEvent ( QMouseEvent * event )
 {
     emit editMarker();
-    event->accept();
+    event->ignore();
 }
 
 void Overlay::setOverlayText(const QString &text, bool isZone)
@@ -1114,32 +1133,20 @@ VideoContainer::VideoContainer(Monitor* parent) :
 {
     setFrameShape(QFrame::NoFrame);
     setFocusPolicy(Qt::ClickFocus);
+    setEnabled(false);
     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
 }
 
-// virtual
-void VideoContainer::mousePressEvent(QMouseEvent * event)
-{
-    if (m_monitor->underMouse()) event->setAccepted(false);
-}
-
 // virtual
 void VideoContainer::mouseReleaseEvent(QMouseEvent * event)
 {
-    if (m_monitor->underMouse()) event->setAccepted(false);
-    else {
+    if (event->button() != Qt::RightButton) {
         if (m_monitor->isActive()) {
             m_monitor->slotPlay();
-            event->accept();
         }
     }
 }
 
-// virtual
-void VideoContainer::mouseMoveEvent(QMouseEvent *event)
-{
-    if (m_monitor->underMouse()) event->setAccepted(false);
-}
 
 // virtual
 void VideoContainer::keyPressEvent(QKeyEvent *event)
@@ -1154,19 +1161,15 @@ void VideoContainer::keyPressEvent(QKeyEvent *event)
 // virtual
 void VideoContainer::wheelEvent(QWheelEvent * event)
 {
-    if (m_monitor->underMouse()) event->setAccepted(false);
-    else {
-        m_monitor->slotMouseSeek(event->delta(), event->modifiers() == Qt::ControlModifier);
-        event->accept();
-    }
+    m_monitor->slotMouseSeek(event->delta(), event->modifiers() == Qt::ControlModifier);
+    event->accept();
 }
 
 void VideoContainer::mouseDoubleClickEvent(QMouseEvent * event)
 {
-    Q_UNUSED(event)
-
     if (!KdenliveSettings::openglmonitors())
         switchFullScreen();
+    event->accept();
 }
 
 void VideoContainer::switchFullScreen()
@@ -1208,6 +1211,7 @@ void VideoContainer::switchFullScreen()
         setUpdatesEnabled(true);
         show();
 #endif
+        setEnabled(true);
     } else {
         setUpdatesEnabled(false);
         flags ^= (Qt::Window | Qt::SubWindow); //clear the flags...
@@ -1215,6 +1219,7 @@ void VideoContainer::switchFullScreen()
         setWindowFlags(flags);
         setWindowState(windowState()  ^ Qt::WindowFullScreen);   // reset
         setUpdatesEnabled(true);
+        setEnabled(false);
         show();
     }
     m_monitor->pause();