]> git.sesse.net Git - kdenlive/blobdiff - src/monitor.cpp
Various changes for getting an OpenGL context (almost) everywhere it is needed.
[kdenlive] / src / monitor.cpp
index f2db5f3691ab70962ceda7d0c8b39370c87b7873..29a7a3d8463116cc0e280f3567667fa2332c7f49 100644 (file)
 
 
 #include "monitor.h"
-#include "renderer.h"
-#include "monitormanager.h"
 #include "smallruler.h"
 #include "docclipbase.h"
+#include "abstractclipitem.h"
+#include "monitorscene.h"
+#include "widgets/monitoreditwidget.h"
+#include "widgets/videosurface.h"
+#include "widgets/videoglwidget.h"
 #include "kdenlivesettings.h"
 
 #include <KDebug>
-#include <KLocale>
+#include <KLocalizedString>
 #include <KFileDialog>
 #include <KApplication>
 #include <KMessageBox>
+#include <KSelectAction>
 
 #include <QMouseEvent>
 #include <QStylePainter>
 #include <QDesktopWidget>
 #include <QLabel>
 #include <QIntValidator>
-
-
-Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget *parent) :
-        QWidget(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_ui.setupUi(this);
+#include <QVBoxLayout>
+#include <QSlider>
+
+
+#define SEEK_INACTIVE (-1)
+
+
+Monitor::Monitor(Kdenlive::MonitorId id, MonitorManager *manager, QGLWidget *glContext, QString profile, QWidget *parent) :
+    AbstractMonitor(id, manager, parent)
+    , render(NULL)
+    , m_currentClip(NULL)
+    , m_overlay(NULL)
+    , m_scale(1)
+    , m_length(2)
+    , m_dragStarted(false)
+    , m_loopClipAction(NULL)
+    , m_contextMenu(NULL)
+    , m_effectWidget(NULL)
+    , m_selectedClip(NULL)
+    , m_loopClipTransition(true)
+    , m_parentGLContext(glContext)
+    , m_glWidget(NULL)
+    , m_editMarker(NULL)
+{
     QVBoxLayout *layout = new QVBoxLayout;
     layout->setContentsMargins(0, 0, 0, 0);
-    layout->addWidget(m_ruler);
-    m_ui.ruler_frame->setLayout(layout);
-    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-    setMinimumHeight(200);
-    QToolBar *toolbar = new QToolBar(name, this);
-    QVBoxLayout *layout2 = new QVBoxLayout;
-    layout2->setContentsMargins(0, 0, 0, 0);
+    layout->setSpacing(0);
+
+    // Video widget holder
+    layout->addWidget(videoBox, 10);
+    layout->addStretch();
+
+    // Get base size for icons
+    int s = style()->pixelMetric(QStyle::PM_SmallIconSize);
+
+
+    // Tool bar buttons
+    m_toolbar = new QToolBar(this);
+    m_toolbar->setIconSize(QSize(s, s));
 
     m_playIcon = KIcon("media-playback-start");
     m_pauseIcon = KIcon("media-playback-pause");
 
-    if (name != "chapter") {
-        toolbar->addAction(KIcon("kdenlive-zone-start"), i18n("Set zone start"), this, SLOT(slotSetZoneStart()));
-        toolbar->addAction(KIcon("kdenlive-zone-end"), i18n("Set zone end"), this, SLOT(slotSetZoneEnd()));
-    } else m_ruler->setZone(-3, -2);
 
-    toolbar->addAction(KIcon("media-seek-backward"), i18n("Rewind"), this, SLOT(slotRewind()));
-    toolbar->addAction(KIcon("media-skip-backward"), i18n("Rewind 1 frame"), this, SLOT(slotRewindOneFrame()));
+    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()));
+    }
+
+    m_toolbar->addAction(KIcon("media-seek-backward"), i18n("Rewind"), this, SLOT(slotRewind()));
+    //m_toolbar->addAction(KIcon("media-skip-backward"), i18n("Rewind 1 frame"), this, SLOT(slotRewindOneFrame()));
 
-    QToolButton *playButton = new QToolButton(toolbar);
+    QToolButton *playButton = new QToolButton(m_toolbar);
     m_playMenu = new QMenu(i18n("Play..."), this);
     m_playAction = m_playMenu->addAction(m_playIcon, i18n("Play"));
-    m_playAction->setCheckable(true);
+    //m_playAction->setCheckable(true);
     connect(m_playAction, SIGNAL(triggered()), this, SLOT(slotPlay()));
 
     playButton->setMenu(m_playMenu);
     playButton->setPopupMode(QToolButton::MenuButtonPopup);
-    toolbar->addWidget(playButton);
+    m_toolbar->addWidget(playButton);
 
-    toolbar->addAction(KIcon("media-skip-forward"), i18n("Forward 1 frame"), this, SLOT(slotForwardOneFrame()));
-    toolbar->addAction(KIcon("media-seek-forward"), i18n("Forward"), this, SLOT(slotForward()));
+    //m_toolbar->addAction(KIcon("media-skip-forward"), i18n("Forward 1 frame"), this, SLOT(slotForwardOneFrame()));
+    m_toolbar->addAction(KIcon("media-seek-forward"), i18n("Forward"), this, SLOT(slotForward()));
 
     playButton->setDefaultAction(m_playAction);
 
-    if (name != "chapter") {
-        QToolButton *configButton = new QToolButton(toolbar);
+    if (id != Kdenlive::DvdMonitor) {
+        QToolButton *configButton = new QToolButton(m_toolbar);
         m_configMenu = new QMenu(i18n("Misc..."), this);
         configButton->setIcon(KIcon("system-run"));
         configButton->setMenu(m_configMenu);
         configButton->setPopupMode(QToolButton::QToolButton::InstantPopup);
-        toolbar->addWidget(configButton);
+        m_toolbar->addWidget(configButton);
 
-        if (name == "clip") {
+        if (id == Kdenlive::ClipMonitor) {
             m_markerMenu = new QMenu(i18n("Go to marker..."), this);
             m_markerMenu->setEnabled(false);
             m_configMenu->addMenu(m_markerMenu);
-            connect(m_markerMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotGoToMarker(QAction *)));
+            connect(m_markerMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotGoToMarker(QAction*)));
         }
         m_configMenu->addAction(KIcon("transform-scale"), i18n("Resize (100%)"), this, SLOT(slotSetSizeOneToOne()));
         m_configMenu->addAction(KIcon("transform-scale"), i18n("Resize (50%)"), this, SLOT(slotSetSizeOneToTwo()));
     }
 
-    QWidget *spacer = new QWidget(this);
-    spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
-    toolbar->addWidget(spacer);
-    m_timePos = new KRestrictedLine(this);
-    m_timePos->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::MinimumExpanding);
-    m_frametimecode = KdenliveSettings::frametimecode();
-    if (m_frametimecode) {
-        m_timePos->setInputMask(QString());
-        m_timePos->setValidator(new QIntValidator(this));
-    } else m_timePos->setInputMask(m_monitorManager->timecode().inputMask());
-
-    toolbar->addWidget(m_timePos);
-
-    connect(m_timePos, SIGNAL(editingFinished()), this, SLOT(slotSeek()));
-
-    layout2->addWidget(toolbar);
-    m_ui.button_frame->setLayout(layout2);
-    const int toolHeight = toolbar->height();
-    m_ui.button_frame->setMinimumHeight(toolHeight);
-
-    //m_ruler->setPixelPerMark(3);
-
-    if (profile.isEmpty()) profile = KdenliveSettings::current_profile();
-
-    QVBoxLayout *rendererBox = new QVBoxLayout(m_ui.video_frame);
-    rendererBox->setContentsMargins(0, 0, 0, 0);
-#ifdef Q_WS_MAC
-    m_glWidget = new VideoGLWidget(m_ui.video_frame);
-    rendererBox->addWidget(m_glWidget);
-    render = new Render(m_name, (int) m_ui.video_frame->winId(), -1, profile, this);
-    m_glWidget->setImageAspectRatio(render->dar());
-    m_glWidget->setBackgroundColor(KdenliveSettings::window_background());
-    m_glWidget->resize(m_ui.video_frame->size());
-    connect(render, SIGNAL(showImageSignal(QImage)), m_glWidget, SLOT(showImage(QImage)));
-    m_monitorRefresh = 0;
-#else
-    m_monitorRefresh = new MonitorRefresh(m_ui.video_frame);
-    rendererBox->addWidget(m_monitorRefresh);
-    render = new Render(m_name, (int) m_monitorRefresh->winId(), -1, profile, this);
-    m_monitorRefresh->setRenderer(render);
-#endif
-
-    connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int)));
+    // Create Volume slider popup
+    m_volumePopup = new QFrame(this, Qt::Popup);
+    QVBoxLayout *poplayout = new QVBoxLayout;
+    poplayout->setContentsMargins(0, 0, 0, 0);
+    m_audioSlider = new QSlider(Qt::Vertical);
+    m_audioSlider->setRange(0, 100);
+    poplayout->addWidget(m_audioSlider);
+    m_volumePopup->setLayout(poplayout);
+    KIcon icon;
+    if (KdenliveSettings::volume() == 0) icon = KIcon("audio-volume-muted");
+    else icon = KIcon("audio-volume-medium");
+
+    m_volumeWidget = m_toolbar->widgetForAction(m_toolbar->addAction(icon, i18n("Audio volume"), this, SLOT(slotShowVolume())));
+
+    // we need to show / hide the popup once so that it's geometry can be calculated in slotShowVolume
+    m_volumePopup->show();
+    m_volumePopup->hide();
+
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    setLayout(layout);
+    setMinimumHeight(200);
+
+    if (profile.isEmpty())
+        profile = KdenliveSettings::current_profile();
+
+    createOpenGlWidget(videoBox, profile);
+    QVBoxLayout *lay = new QVBoxLayout;
+    lay->setContentsMargins(0, 0, 0, 0);
+    lay->addWidget(m_glWidget);
+    videoBox->setLayout(lay);
+
+    // Monitor ruler
+    m_ruler = new SmallRuler(this, 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(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)));
 
-    //render->createVideoXWindow(m_ui.video_frame->winId(), -1);
-
-    if (name != "clip") {
+    if (id != Kdenlive::ClipMonitor) {
         connect(render, SIGNAL(rendererPosition(int)), this, SIGNAL(renderPosition(int)));
         connect(render, SIGNAL(durationChanged(int)), this, SIGNAL(durationChanged(int)));
         connect(m_ruler, SIGNAL(zoneChanged(QPoint)), this, SIGNAL(zoneUpdated(QPoint)));
     } else {
         connect(m_ruler, SIGNAL(zoneChanged(QPoint)), this, SLOT(setClipZone(QPoint)));
     }
-#ifndef Q_WS_MAC
-    m_monitorRefresh->show();
-#endif
-    kDebug() << "/////// BUILDING MONITOR, ID: " << m_ui.video_frame->winId();
+
+    if (id == Kdenlive::ProjectMonitor) {
+        m_effectWidget = new MonitorEditWidget(render, videoBox);
+       connect(m_effectWidget, SIGNAL(showEdit(bool,bool)), this, SLOT(slotShowEffectScene(bool,bool)));
+        m_toolbar->addAction(m_effectWidget->getVisibilityAction());
+        videoBox->layout()->addWidget(m_effectWidget);
+        m_effectWidget->hide();
+    }
+
+    QWidget *spacer = new QWidget(this);
+    spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+    m_toolbar->addWidget(spacer);
+    m_timePos = new TimecodeDisplay(m_monitorManager->timecode(), this);
+    m_toolbar->addWidget(m_timePos);
+    connect(m_timePos, SIGNAL(timeCodeEditingFinished()), this, SLOT(slotSeek()));
+    m_toolbar->setMaximumHeight(m_timePos->height());
+    layout->addWidget(m_toolbar);
 }
 
 Monitor::~Monitor()
@@ -175,39 +200,70 @@ Monitor::~Monitor()
     delete m_ruler;
     delete m_timePos;
     delete m_overlay;
-    delete m_monitorRefresh;
+    if (m_effectWidget)
+        delete m_effectWidget;
     delete render;
 }
 
-QString Monitor::name() const
+QWidget *Monitor::container()
 {
-    return m_name;
+    return videoBox;
 }
 
-void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMenu *markerMenu)
+void Monitor::createOpenGlWidget(QWidget *parent, const QString &profile)
+{
+    m_glWidget = new VideoGLWidget(parent, m_parentGLContext);
+    render = new Render(id(), 0, profile, this, m_glWidget);
+    if (m_glWidget == NULL) {
+        // Creation failed, we are in trouble...
+        QMessageBox::critical(this, i18n("Missing OpenGL support"),
+                             i18n("You need working OpenGL support to run Kdenlive. Exiting."));
+        qApp->quit();
+    }
+    m_glWidget->setImageAspectRatio(render->dar());
+    m_glWidget->setBackgroundColor(KdenliveSettings::window_background());
+    connect(render, SIGNAL(showImageSignal(QImage)), m_glWidget, SLOT(showImage(QImage)));
+    connect(render, SIGNAL(showImageSignal(GLuint)), m_glWidget, SLOT(showImage(GLuint)));
+}
+
+void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMenu *markerMenu, QAction *loopClip)
 {
     m_contextMenu = new QMenu(this);
     m_contextMenu->addMenu(m_playMenu);
-    if (goMenu) m_contextMenu->addMenu(goMenu);
-    if (markerMenu) m_contextMenu->addMenu(markerMenu);
+    if (goMenu)
+        m_contextMenu->addMenu(goMenu);
+    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);
+    if (loopClip) {
+        m_loopClipAction = loopClip;
+        m_playMenu->addAction(loopClip);
+    }
 
     //TODO: add save zone to timeline monitor when fixed
-    if (m_name == "clip") {
+    if (m_id == Kdenlive::ClipMonitor) {
         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);
 
-    if (m_name != "clip") {
-#ifndef Q_WS_MAC
+    if (m_id != Kdenlive::ClipMonitor) {
         QAction *splitView = m_contextMenu->addAction(KIcon("view-split-left-right"), i18n("Split view"), render, SLOT(slotSplitView(bool)));
         splitView->setCheckable(true);
         m_configMenu->addAction(splitView);
-#endif
     } else {
         QAction *setThumbFrame = m_contextMenu->addAction(KIcon("document-new"), i18n("Set current image as thumbnail"), this, SLOT(slotSetThumbFrame()));
         m_configMenu->addAction(setThumbFrame);
@@ -222,10 +278,9 @@ void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMe
     dropFrames->setCheckable(true);
     dropFrames->setChecked(true);
     connect(dropFrames, SIGNAL(toggled(bool)), this, SLOT(slotSwitchDropFrames(bool)));
-
+    
     m_configMenu->addAction(showTips);
     m_configMenu->addAction(dropFrames);
-
 }
 
 void Monitor::slotGoToMarker(QAction *action)
@@ -247,7 +302,7 @@ void Monitor::slotSetSizeOneToOne()
         height = height * 0.8;
     }
     kDebug() << "// MONITOR; set SIZE: " << width << ", " << height;
-    m_ui.video_frame->setFixedSize(width, height);
+    videoBox->setFixedSize(width, height);
     updateGeometry();
     adjustSize();
     //m_ui.video_frame->setMinimumSize(0, 0);
@@ -267,7 +322,7 @@ void Monitor::slotSetSizeOneToTwo()
         height = height * 0.8;
     }
     kDebug() << "// MONITOR; set SIZE: " << width << ", " << height;
-    m_ui.video_frame->setFixedSize(width, height);
+    videoBox->setFixedSize(width, height);
     updateGeometry();
     adjustSize();
     //m_ui.video_frame->setMinimumSize(0, 0);
@@ -276,7 +331,17 @@ void Monitor::slotSetSizeOneToTwo()
 
 void Monitor::resetSize()
 {
-    m_ui.video_frame->setMinimumSize(0, 0);
+    videoBox->setMinimumSize(0, 0);
+}
+
+QString Monitor::getTimecodeFromFrames(int pos)
+{
+    return m_monitorManager->timecode().getTimecodeFromFrames(pos);
+}
+
+double Monitor::fps() const
+{
+    return m_monitorManager->timecode().fps();
 }
 
 DocClipBase *Monitor::activeClip()
@@ -291,19 +356,24 @@ void Monitor::updateMarkers(DocClipBase *source)
         QList <CommentedTime> markers = m_currentClip->commentedSnapMarkers();
         if (!markers.isEmpty()) {
             QList <int> marks;
-            for (int i = 0; i < markers.count(); i++) {
+            for (int i = 0; i < markers.count(); ++i) {
                 int pos = (int) markers.at(i).time().frames(m_monitorManager->timecode().fps());
                 marks.append(pos);
                 QString position = m_monitorManager->timecode().getTimecode(markers.at(i).time()) + ' ' + markers.at(i).comment();
                 QAction *go = m_markerMenu->addAction(position);
                 go->setData(pos);
             }
-            m_ruler->setMarkers(marks);
-        } else m_ruler->setMarkers(QList <int>());
+        }
+       m_ruler->setMarkers(markers);
         m_markerMenu->setEnabled(!m_markerMenu->isEmpty());
     }
 }
 
+void Monitor::setMarkers(const QList<CommentedTime> &markers)
+{
+    m_ruler->setMarkers(markers);
+}
+
 void Monitor::slotSeekToPreviousSnap()
 {
     if (m_currentClip) slotSeek(getSnapForPos(true).frames(m_monitorManager->timecode().fps()));
@@ -346,59 +416,70 @@ GenTime Monitor::getSnapForPos(bool previous)
     return GenTime();
 }
 
-
-
 void Monitor::slotZoneMoved(int start, int end)
 {
     m_ruler->setZone(start, end);
-    checkOverlay();
     setClipZone(m_ruler->zone());
+    checkOverlay();
 }
 
 void Monitor::slotSetZoneStart()
 {
-    m_ruler->setZone(render->seekFramePosition(), -1);
+    m_ruler->setZoneStart();
     emit zoneUpdated(m_ruler->zone());
-    checkOverlay();
     setClipZone(m_ruler->zone());
+    checkOverlay();
 }
 
 void Monitor::slotSetZoneEnd()
 {
-    m_ruler->setZone(-1, render->seekFramePosition());
+    m_ruler->setZoneEnd();
     emit zoneUpdated(m_ruler->zone());
-    checkOverlay();
     setClipZone(m_ruler->zone());
+    checkOverlay();
 }
 
 // virtual
 void Monitor::mousePressEvent(QMouseEvent * event)
 {
+    if (render) render->setActiveMonitor();
     if (event->button() != Qt::RightButton) {
-        if (m_ui.video_frame->underMouse()) {
+        if (videoBox->geometry().contains(event->pos()) && (!m_overlay || !m_overlay->underMouse())) {
             m_dragStarted = true;
             m_DragStartPosition = event->pos();
         }
-    } else m_contextMenu->popup(event->globalPos());
+    } else if (m_contextMenu && (!m_effectWidget || !m_effectWidget->isVisible())) {
+        m_contextMenu->popup(event->globalPos());
+    }
+}
+
+void Monitor::resizeEvent(QResizeEvent *event)
+{
+    Q_UNUSED(event)
+    if (render && isVisible() && isActive()) render->doRefresh();
+}
+
+void Monitor::slotSwitchFullScreen()
+{
+    videoBox->switchFullScreen();
 }
 
 // virtual
 void Monitor::mouseReleaseEvent(QMouseEvent * event)
 {
-    if (m_dragStarted) {
-        if (m_ui.video_frame->underMouse()) {
+    if (m_dragStarted && event->button() != Qt::RightButton) {
+        if (videoBox->geometry().contains(event->pos()) && (!m_effectWidget || !m_effectWidget->isVisible())) {
             if (isActive()) slotPlay();
-            else activateMonitor();
-        } else QWidget::mouseReleaseEvent(event);
-        m_dragStarted = false;
+            else slotActivateMonitor();
+        } //else event->ignore(); //QWidget::mouseReleaseEvent(event);
     }
+    m_dragStarted = false;
+    event->accept();
 }
 
-
 // virtual
 void Monitor::mouseMoveEvent(QMouseEvent *event)
 {
-    // kDebug() << "// DRAG STARTED, MOUSE MOVED: ";
     if (!m_dragStarted || m_currentClip == NULL) return;
 
     if ((event->pos() - m_DragStartPosition).manhattanLength()
@@ -418,13 +499,13 @@ 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;
-        //dropAction = drag->start(Qt::CopyAction | Qt::MoveAction);
+       /*Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction);
+        Qt::DropAction dropAction;
+        dropAction = drag->start(Qt::CopyAction | Qt::MoveAction);*/
 
         //Qt::DropAction dropAction = drag->exec();
 
@@ -432,6 +513,7 @@ void Monitor::mouseMoveEvent(QMouseEvent *event)
     //event->accept();
 }
 
+
 /*void Monitor::dragMoveEvent(QDragMoveEvent * event) {
     event->setDropAction(Qt::IgnoreAction);
     event->setDropAction(Qt::MoveAction);
@@ -453,24 +535,23 @@ QStringList Monitor::mimeTypes() const
     return qstrList;
 }
 
-
 // virtual
-/** Move to other position on mousewheel
- *
- * Moves towards end of clip/timeline on mousewheel down/back,
- * opposite for mousewheel up/forward.
- *
- * Ctrl+wheel moves single frame, without Ctrl moves a second.
- *
- * See also http://www.kdenlive.org/mantis/view.php?id=265 */
 void Monitor::wheelEvent(QWheelEvent * event)
 {
-    if (event->modifiers() == Qt::ControlModifier) {
+    slotMouseSeek(event->delta(), event->modifiers() == Qt::ControlModifier);
+    event->accept();
+}
+
+void Monitor::slotMouseSeek(int eventDelta, bool fast)
+{
+    if (fast) {
         int delta = m_monitorManager->timecode().fps();
-        if (event->delta() > 0) delta = 0 - delta;
-        slotSeek(render->seekFramePosition() - delta);
+        if (eventDelta > 0) delta = 0 - delta;
+       if (render->requestedSeekPosition != SEEK_INACTIVE)
+           slotSeek(render->requestedSeekPosition - delta);
+       else slotSeek(render->seekFramePosition() - delta);
     } else {
-        if (event->delta() >= 0) slotForwardOneFrame();
+        if (eventDelta >= 0) slotForwardOneFrame();
         else slotRewindOneFrame();
     }
 }
@@ -481,189 +562,189 @@ void Monitor::slotSetThumbFrame()
         return;
     }
     m_currentClip->setClipThumbFrame((uint) render->seekFramePosition());
-    emit refreshClipThumbnail(m_currentClip->getId());
+    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 = render->extractFrame(render->seekFramePosition());
-    KFileDialog *fs = new KFileDialog(KUrl(), "image/png", this);
+    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());
+    QPointer<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();
-    delete fs;
-    if (!path.isEmpty()) {
-        frame.save(path);
-    }
-}
-
-bool Monitor::isActive() const
-{
-    return m_isActive;
-}
-
-void Monitor::activateMonitor()
-{
-    if (!m_isActive) {
-        m_monitorManager->slotSwitchMonitors(m_name == "clip");
+    if (fs->exec()) {
+        QString path = fs->selectedFile();
+        if (!path.isEmpty()) {
+            frame.save(path);
+        }
     }
+    delete fs;
 }
 
 void Monitor::setTimePos(const QString &pos)
 {
-    if (m_frametimecode) {
-        int frames = m_monitorManager->timecode().getFrameCount(pos);
-        m_timePos->setText(QString::number(frames));
-    } else m_timePos->setText(pos);
+    m_timePos->setValue(pos);
     slotSeek();
 }
 
 void Monitor::slotSeek()
 {
-    int frames;
-    if (m_frametimecode) frames = m_timePos->text().toInt();
-    else frames = m_monitorManager->timecode().getFrameCount(m_timePos->text());
-    //kDebug() << "// / / SEEK TO: " << frames;
-    slotSeek(frames);
+    slotSeek(m_timePos->getValue());
 }
 
 void Monitor::slotSeek(int pos)
 {
-    activateMonitor();
     if (render == NULL) return;
+    slotActivateMonitor();
     render->seekToFrame(pos);
-    emit renderPosition(render->seekFramePosition());
+    m_ruler->update();
 }
 
 void Monitor::checkOverlay()
 {
     if (m_overlay == NULL) return;
-    int pos = render->seekFramePosition();
+    QString overlayText;
+    int pos = m_timePos->getValue();//render->seekFramePosition();
     QPoint zone = m_ruler->zone();
-    if (pos == zone.x()) m_overlay->setOverlayText(i18n("In Point"));
-    else if (pos == zone.y()) m_overlay->setOverlayText(i18n("Out Point"));
+    if (pos == zone.x())
+        overlayText = i18n("In Point");
+    else if (pos == zone.y())
+        overlayText = i18n("Out Point");
     else {
         if (m_currentClip) {
-            QString markerComment = m_currentClip->markerComment(GenTime(pos, m_monitorManager->timecode().fps()));
-            if (markerComment.isEmpty()) m_overlay->setHidden(true);
-            else m_overlay->setOverlayText(markerComment, false);
-        } else m_overlay->setHidden(true);
+            overlayText = m_currentClip->markerComment(GenTime(pos, m_monitorManager->timecode().fps()));
+           if (!overlayText.isEmpty()) {
+               m_overlay->setOverlayText(overlayText, false);
+               return;
+           }
+       }
     }
+    if (m_overlay->isVisible() && overlayText.isEmpty()) m_overlay->setOverlayText(QString(), false);
+    else m_overlay->setOverlayText(overlayText);
 }
 
 void Monitor::slotStart()
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrame(0);
-    //emit renderPosition(0);
 }
 
 void Monitor::slotEnd()
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrame(render->getLength());
-    //emit renderPosition(render->seekFramePosition());
 }
 
 void Monitor::slotZoneStart()
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrame(m_ruler->zone().x());
-    emit renderPosition(render->seekFramePosition());
 }
 
 void Monitor::slotZoneEnd()
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrame(m_ruler->zone().y());
-    emit renderPosition(render->seekFramePosition());
 }
 
 void Monitor::slotRewind(double speed)
 {
-    activateMonitor();
+    slotActivateMonitor();
     if (speed == 0) {
         double currentspeed = render->playSpeed();
-        if (currentspeed >= 0) render->play(-2);
-        else render->play(currentspeed * 2);
+       if (currentspeed >= 0) render->play(-1);
+       else switch((int) currentspeed) {
+           case -1:
+               render->play(-2);
+               break;
+           case -2:
+               render->play(-3);
+               break;
+           case -3:
+               render->play(-5);
+               break;
+           default:
+               render->play(-8);
+       }
     } else render->play(speed);
-    m_playAction->setChecked(true);
+    //m_playAction->setChecked(true);
     m_playAction->setIcon(m_pauseIcon);
 }
 
 void Monitor::slotForward(double speed)
 {
-    activateMonitor();
+    slotActivateMonitor();
     if (speed == 0) {
         double currentspeed = render->playSpeed();
-        if (currentspeed <= 1) render->play(2);
-        else render->play(currentspeed * 2);
+       if (currentspeed <= 0) render->play(1);
+        else switch((int) currentspeed) {
+           case 1:
+               render->play(2);
+               break;
+           case 2:
+               render->play(3);
+               break;
+           case 3:
+               render->play(5);
+               break;
+           default:
+               render->play(8);
+       }
     } else render->play(speed);
-    m_playAction->setChecked(true);
+    //m_playAction->setChecked(true);
     m_playAction->setIcon(m_pauseIcon);
 }
 
 void Monitor::slotRewindOneFrame(int diff)
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrameDiff(-diff);
-    emit renderPosition(render->seekFramePosition());
+    m_ruler->update();
 }
 
 void Monitor::slotForwardOneFrame(int diff)
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrameDiff(diff);
-    emit renderPosition(render->seekFramePosition());
+    m_ruler->update();
 }
 
 void Monitor::seekCursor(int pos)
 {
-    activateMonitor();
     if (m_ruler->slotNewValue(pos)) {
-        checkOverlay();
-        if (m_frametimecode) m_timePos->setText(QString::number(pos));
-        else m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
+        m_timePos->setValue(pos);
+       checkOverlay();
     }
 }
 
 void Monitor::rendererStopped(int pos)
 {
     if (m_ruler->slotNewValue(pos)) {
-        checkOverlay();
-        if (m_frametimecode) m_timePos->setText(QString::number(pos));
-        else m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
+        m_timePos->setValue(pos);
+       checkOverlay();
     }
-    disconnect(m_playAction, SIGNAL(triggered()), this, SLOT(slotPlay()));
-    m_playAction->setChecked(false);
-    connect(m_playAction, SIGNAL(triggered()), this, SLOT(slotPlay()));
     m_playAction->setIcon(m_playIcon);
 }
 
-void Monitor::initMonitor()
-{
-    kDebug() << "/////// INITING MONITOR, ID: " << m_ui.video_frame->winId();
-}
-
-// virtual
-/*void Monitor::resizeEvent(QResizeEvent * event) {
-    QWidget::resizeEvent(event);
-    adjustRulerSize(-1);
-    if (render && m_isActive) render->doRefresh();
-    //
-}*/
-
 void Monitor::adjustRulerSize(int length)
 {
     if (length > 0) m_length = length;
@@ -676,123 +757,177 @@ 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)));
+    if (!isVisible() || !isActive()) return;
+    if (m_glWidget) m_glWidget->activateMonitor();
+    if (render) render->startConsumer();
 }
 
 void Monitor::refreshMonitor(bool visible)
 {
-    if (visible && render && !m_isActive) {
-        activateMonitor();
-        render->doRefresh(); //askForRefresh();
+    if (visible && render) {
+        if (!slotActivateMonitor()) {
+            // the monitor was already active, simply refreshClipThumbnail
+            render->doRefresh();
+        }
+    }
+}
+
+void Monitor::refreshMonitor()
+{
+    if (isActive()) {
+        render->doRefresh();
     }
 }
 
 void Monitor::pause()
 {
     if (render == NULL) return;
-    activateMonitor();
+    slotActivateMonitor();
     render->pause();
     //m_playAction->setChecked(true);
-    //m_playAction->setIcon(m_pauseIcon);
+    m_playAction->setIcon(m_playIcon);
+}
+
+void Monitor::unpause()
+{
 }
 
 void Monitor::slotPlay()
 {
     if (render == NULL) return;
-    activateMonitor();
-    if (render->playSpeed() == 0) {
-        m_playAction->setChecked(true);
+    slotActivateMonitor();
+    if (render->isPlaying()) {
+       m_playAction->setIcon(m_playIcon);
+        render->switchPlay(false);
+    }
+    else {
         m_playAction->setIcon(m_pauseIcon);
-    } else {
-        m_playAction->setChecked(false);
-        m_playAction->setIcon(m_playIcon);
+        render->switchPlay(true);
     }
-    render->switchPlay();
+    m_ruler->refreshRuler();
 }
 
 void Monitor::slotPlayZone()
 {
     if (render == NULL) return;
-    activateMonitor();
+    slotActivateMonitor();
     QPoint p = m_ruler->zone();
     render->playZone(GenTime(p.x(), m_monitorManager->timecode().fps()), GenTime(p.y(), m_monitorManager->timecode().fps()));
-    m_playAction->setChecked(true);
+    //m_playAction->setChecked(true);
     m_playAction->setIcon(m_pauseIcon);
 }
 
 void Monitor::slotLoopZone()
 {
     if (render == NULL) return;
-    activateMonitor();
+    slotActivateMonitor();
     QPoint p = m_ruler->zone();
     render->loopZone(GenTime(p.x(), m_monitorManager->timecode().fps()), GenTime(p.y(), m_monitorManager->timecode().fps()));
-    m_playAction->setChecked(true);
+    //m_playAction->setChecked(true);
+    m_playAction->setIcon(m_pauseIcon);
+}
+
+void Monitor::slotLoopClip()
+{
+    if (render == NULL || m_selectedClip == NULL)
+        return;
+    slotActivateMonitor();
+    render->loopZone(m_selectedClip->startPos(), m_selectedClip->endPos());
+    //m_playAction->setChecked(true);
     m_playAction->setIcon(m_pauseIcon);
 }
 
-void Monitor::slotSetXml(DocClipBase *clip, QPoint zone, const int position)
+void Monitor::updateClipProducer(Mlt::Producer *prod)
+{
+    if (render == NULL) return;
+    render->setProducer(prod, render->seekFramePosition());
+}
+
+void Monitor::slotSetClipProducer(DocClipBase *clip, QPoint zone, bool forceUpdate, int position)
 {
     if (render == NULL) return;
     if (clip == NULL && m_currentClip != NULL) {
+       m_currentClip->lastSeekPosition = render->seekFramePosition();
         m_currentClip = NULL;
         m_length = -1;
         render->setProducer(NULL, -1);
         return;
     }
-    if (m_currentClip != NULL) activateMonitor();
-    if (clip != m_currentClip) {
+
+    if (clip != m_currentClip || forceUpdate) {
+       if (m_currentClip) m_currentClip->lastSeekPosition = render->seekFramePosition();
         m_currentClip = clip;
+       if (position == -1) position = clip->lastSeekPosition;
         updateMarkers(clip);
-        if (render->setProducer(clip->producer(), position) == -1) {
+        Mlt::Producer *prod = NULL;
+        if (clip) prod = clip->getCloneProducer();
+        if (render->setProducer(prod, position) == -1) {
             // MLT CONSUMER is broken
             kDebug(QtWarningMsg) << "ERROR, Cannot start monitor";
+        } else start();
+    } else {
+        if (m_currentClip) {
+            slotActivateMonitor();
+            if (position == -1) position = render->seekFramePosition();
+            render->seek(position);
+           if (zone.isNull()) {
+               zone = m_currentClip->zone();
+               m_ruler->setZone(zone.x(), zone.y());
+               return;
+           }
         }
-    } else if (position != -1) render->seek(GenTime(position, m_monitorManager->timecode().fps()));
+    }
     if (!zone.isNull()) {
         m_ruler->setZone(zone.x(), zone.y());
-        render->seek(GenTime(zone.x(), m_monitorManager->timecode().fps()));
+        render->seek(zone.x());
     }
 }
 
 void Monitor::slotOpenFile(const QString &file)
 {
     if (render == NULL) return;
-    activateMonitor();
-    QDomDocument doc;
-    QDomElement mlt = doc.createElement("mlt");
-    doc.appendChild(mlt);
-    QDomElement prod = doc.createElement("producer");
-    mlt.appendChild(prod);
-    prod.setAttribute("mlt_service", "avformat");
-    prod.setAttribute("resource", file);
-    render->setSceneList(doc, 0);
+    slotActivateMonitor();
+    render->loadUrl(file);
 }
 
 void Monitor::slotSaveZone()
 {
     if (render == NULL) return;
-    emit saveZone(render, m_ruler->zone());
+    emit saveZone(render, m_ruler->zone(), m_currentClip);
 
     //render->setSceneList(doc, 0);
 }
 
+void Monitor::setCustomProfile(const QString &profile, const Timecode &tc)
+{
+    m_timePos->updateTimeCode(tc);
+    if (render == NULL) return;
+    if (!render->hasProfile(profile)) {
+        slotActivateMonitor();
+        render->resetProfile(profile);
+       if (m_glWidget) m_glWidget->setImageAspectRatio(render->dar());
+    }
+}
 
-void Monitor::resetProfile(const QString profile)
+void Monitor::resetProfile(const QString &profile)
 {
+    m_timePos->updateTimeCode(m_monitorManager->timecode());
     if (render == NULL) return;
-    render->resetProfile(profile);
+    if (!render->hasProfile(profile)) {
+        slotActivateMonitor();
+        render->resetProfile(profile);
+       if (m_glWidget) m_glWidget->setImageAspectRatio(render->dar());
+    }
+    if (m_effectWidget)
+        m_effectWidget->resetProfile(render);
 }
 
-void Monitor::saveSceneList(QString path, QDomElement info)
+void Monitor::saveSceneList(const QString &path, const QDomElement &info)
 {
     if (render == NULL) return;
     render->saveSceneList(path, info);
@@ -804,8 +939,7 @@ const QString Monitor::sceneList()
     return render->sceneList();
 }
 
-
-void Monitor::setClipZone(QPoint pos)
+void Monitor::setClipZone(const QPoint &pos)
 {
     if (m_currentClip == NULL) return;
     m_currentClip->setZone(pos);
@@ -821,33 +955,28 @@ void Monitor::slotSwitchMonitorInfo(bool show)
     KdenliveSettings::setDisplayMonitorInfo(show);
     if (show) {
         if (m_overlay) return;
-#ifndef Q_WS_MAC
-        m_overlay = new Overlay(m_monitorRefresh);
-        m_overlay->raise();
-        m_overlay->setHidden(true);
-#else
-        m_overlay = new Overlay(m_glWidget);
-#endif
+        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);
+        m_glWidget->setLayout(layout);
+        checkOverlay();
     } else {
         delete m_overlay;
         m_overlay = NULL;
     }
 }
 
+void Monitor::slotEditMarker()
+{
+    if (m_editMarker) m_editMarker->trigger();
+}
+
 void Monitor::updateTimecodeFormat()
 {
-    m_frametimecode = KdenliveSettings::frametimecode();
-    if (m_frametimecode) {
-        int frames = m_monitorManager->timecode().getFrameCount(m_timePos->text());
-        m_timePos->setValidator(new QIntValidator(this));
-        m_timePos->setInputMask(QString());
-        m_timePos->setText(QString::number(frames));
-    } else {
-        int pos = m_timePos->text().toInt();
-        m_timePos->setValidator(0);
-        m_timePos->setInputMask(m_monitorManager->timecode().inputMask());
-        m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
-    }
+    m_timePos->slotUpdateTimeCodeFormat();
 }
 
 QStringList Monitor::getZoneInfo() const
@@ -860,56 +989,170 @@ QStringList Monitor::getZoneInfo() const
     return result;
 }
 
+void Monitor::slotSetSelectedClip(AbstractClipItem* item)
+{
+    if (item) {
+        if (m_loopClipAction) m_loopClipAction->setEnabled(true);
+        m_selectedClip = item;
+    } else {
+        if (m_loopClipAction) m_loopClipAction->setEnabled(false);
+    }
+}
+
+void Monitor::slotSetSelectedClip(ClipItem* item)
+{
+    if (item || (!item && !m_loopClipTransition)) {
+        m_loopClipTransition = false;
+        slotSetSelectedClip((AbstractClipItem*)item);
+    }
+}
+
+void Monitor::slotSetSelectedClip(Transition* item)
+{
+    if (item || (!item && m_loopClipTransition)) {
+        m_loopClipTransition = true;
+        slotSetSelectedClip((AbstractClipItem*)item);
+    }
+}
+
+
+void Monitor::slotShowEffectScene(bool show, bool manuallyTriggered)
+{
+    if (m_id == Kdenlive::ProjectMonitor) {
+        if (!m_effectWidget->getVisibilityAction()->isChecked())
+            show = false;
+        if (m_effectWidget->isVisible() == show)
+            return;
+        setUpdatesEnabled(false);
+        if (show) {
+            m_glWidget->setVisible(false);
+            m_effectWidget->setVisible(true);
+            m_effectWidget->getScene()->slotZoomFit();
+            emit requestFrameForAnalysis(true);
+        } else {    
+            m_effectWidget->setVisible(false);
+            emit requestFrameForAnalysis(false);
+            m_glWidget->setVisible(true);
+        }
+        if (!manuallyTriggered)
+            m_effectWidget->showVisibilityButton(show);
+        setUpdatesEnabled(true);
+        videoBox->setEnabled(show);
+        //render->doRefresh();
+    }
+}
+
+MonitorEditWidget* Monitor::getEffectEdit()
+{
+    return m_effectWidget;
+}
+
+bool Monitor::effectSceneDisplayed()
+{
+    return m_effectWidget->isVisible();
+}
+
+void Monitor::slotSetVolume(int volume)
+{
+    KdenliveSettings::setVolume(volume);
+    KIcon icon;
+    if (volume == 0) icon = KIcon("audio-volume-muted");
+    else icon = KIcon("audio-volume-medium");
+    static_cast <QToolButton *>(m_volumeWidget)->setIcon(icon);
+    render->slotSetVolume(volume);
+}
 
-MonitorRefresh::MonitorRefresh(QWidget* parent) : \
-        QWidget(parent),
-        m_renderer(NULL)
+void Monitor::slotShowVolume()
 {
-    setAttribute(Qt::WA_PaintOnScreen);
-    setAttribute(Qt::WA_OpaquePaintEvent);
-    //setAttribute(Qt::WA_NoSystemBackground);
+    m_volumePopup->move(mapToGlobal(m_toolbar->geometry().topLeft()) + QPoint(mapToParent(m_volumeWidget->geometry().bottomLeft()).x(), -m_volumePopup->height()));
+    int vol = render->volume();
+    // Disable widget if we cannot get the volume
+    m_volumePopup->setEnabled(vol != -1);
+    m_audioSlider->blockSignals(true);
+    m_audioSlider->setValue(vol);
+    m_audioSlider->blockSignals(false);
+    m_volumePopup->show();
 }
 
-void MonitorRefresh::setRenderer(Render* render)
+AbstractRender *Monitor::abstractRender()
 {
-    m_renderer = render;
+    return render;
 }
 
-void MonitorRefresh::paintEvent(QPaintEvent * /*event*/)
+void Monitor::reloadProducer(const QString &id)
 {
-    if (m_renderer) m_renderer->doRefresh();
+    if (!m_currentClip) return;
+    if (m_currentClip->getId() == id)
+        slotSetClipProducer(m_currentClip, m_currentClip->zone(), true);
 }
 
+QString Monitor::getMarkerThumb(GenTime pos)
+{
+    if (!m_currentClip) return QString();
+    if (!m_currentClip->getClipHash().isEmpty()) {
+       QString url = m_monitorManager->getProjectFolder() + "thumbs/" + m_currentClip->getClipHash() + '#' + QString::number((int) pos.frames(m_monitorManager->timecode().fps())) + ".png";
+        if (QFile::exists(url)) return url;
+    }
+    return QString();
+}
+
+void Monitor::setPalette ( const QPalette & p)
+{
+    QWidget::setPalette(p);
+    if (m_ruler) m_ruler->updatePalette();
+    
+}
 
 Overlay::Overlay(QWidget* parent) :
-        QLabel(parent)
+    QLabel(parent)
 {
-    setAttribute(Qt::WA_TransparentForMouseEvents);
-    setAttribute(Qt::WA_OpaquePaintEvent);
-    //setAttribute(Qt::WA_NoSystemBackground);
-    setAutoFillBackground(false);
+    //setAttribute(Qt::WA_TransparentForMouseEvents);
+    setAutoFillBackground(true);
+    setBackgroundRole(QPalette::Base);
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+    setCursor(Qt::PointingHandCursor);
+
 }
 
-void Overlay::paintEvent(QPaintEvent * /*event*/)
+// virtual
+void Overlay::mouseReleaseEvent ( QMouseEvent * event )
 {
-    QPainter painter(this);
-    QColor col;
-    painter.setPen(Qt::white);
-    if (m_isZone) col = QColor(200, 0, 0);
-    else col = QColor(0, 0, 200);
-    painter.fillRect(rect(), col);
-    painter.drawText(rect(), Qt::AlignCenter, text());
+    event->ignore();
 }
 
+// virtual
+void Overlay::mousePressEvent( QMouseEvent * event )
+{
+    event->ignore();
+}
 
+// virtual
+void Overlay::mouseDoubleClickEvent ( QMouseEvent * event )
+{
+    emit editMarker();
+    event->ignore();
+}
 
 void Overlay::setOverlayText(const QString &text, bool isZone)
 {
+    if (text.isEmpty()) {
+       /*QPalette p;
+       p.setColor(QPalette::Base, KdenliveSettings::window_background());
+       setPalette(p);
+       setText(QString());
+       repaint();*/
+       setHidden(true);
+       return;
+    }
     setHidden(true);
-    m_isZone = isZone;
+    QPalette p;
+    p.setColor(QPalette::Text, Qt::white);
+    if (isZone) p.setColor(QPalette::Base, QColor(200, 0, 0));
+    else p.setColor(QPalette::Base, QColor(0, 0, 200));
+    setPalette(p);
     setText(' ' + text + ' ');
     setHidden(false);
-    update();
 }
 
+
 #include "monitor.moc"