]> git.sesse.net Git - kdenlive/blobdiff - src/abstractmonitor.cpp
Const'ref
[kdenlive] / src / abstractmonitor.cpp
index 02ed9a99ddc9304ade7c0e3035acac75f44c53d0..eac998a99784ae16d177404a9011031ef7d0d1a5 100644 (file)
 
 #include <QPaintEvent>
 #include <QDesktopWidget>
+#include <QVBoxLayout>
 
 
 AbstractMonitor::AbstractMonitor(Kdenlive::MONITORID id, MonitorManager *manager, QWidget *parent): 
     QWidget(parent),
+    videoSurface(NULL),
     m_id(id),
     m_monitorManager(manager)
-{}
+{
+    videoBox = new VideoContainer(this);
+}
+
+
+AbstractMonitor::~AbstractMonitor()
+{
+    delete videoSurface;
+}
+
+void AbstractMonitor::createVideoSurface()
+{
+    QVBoxLayout *lay = new QVBoxLayout;
+    lay->setContentsMargins(0, 0, 0, 0);
+    videoSurface = new VideoSurface;
+    lay->addWidget(videoSurface);
+    videoBox->setLayout(lay);
+}
 
 bool AbstractMonitor::isActive() const
 {
     return m_monitorManager->isActive(m_id);
 }
 
-bool AbstractMonitor::slotActivateMonitor()
+bool AbstractMonitor::slotActivateMonitor(bool forceRefresh)
 {
-    return m_monitorManager->activateMonitor(m_id);
+    return m_monitorManager->activateMonitor(m_id, forceRefresh);
 }
 
 VideoContainer::VideoContainer(AbstractMonitor* monitor, QWidget *parent) :
@@ -50,8 +69,6 @@ VideoContainer::VideoContainer(AbstractMonitor* monitor, QWidget *parent) :
 {
     setFrameShape(QFrame::NoFrame);
     setFocusPolicy(Qt::ClickFocus);
-    setAttribute(Qt::WA_PaintOnScreen);
-    setAttribute(Qt::WA_OpaquePaintEvent);
     //setEnabled(false);
     setContentsMargins(0, 0, 0, 0);
     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
@@ -94,7 +111,6 @@ void VideoContainer::mouseDoubleClickEvent(QMouseEvent * event)
 void VideoContainer::switchFullScreen()
 {
     // TODO: disable screensaver?
-    m_monitor->pause();
     Qt::WindowFlags flags = windowFlags();
     if (!isFullScreen()) {
         // Check if we ahave a multiple monitor setup
@@ -142,5 +158,26 @@ void VideoContainer::switchFullScreen()
         setEnabled(false);
         show();
     }
-    m_monitor->unpause();
 }
+
+VideoSurface::VideoSurface(QWidget* parent) :
+    QWidget(parent)
+{
+    // MonitorRefresh is used as container for the SDL display (it's window id is passed to SDL)
+    setAttribute(Qt::WA_PaintOnScreen);
+    setAttribute(Qt::WA_OpaquePaintEvent);
+    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+    setAttribute(Qt::WA_NoSystemBackground);
+    //setUpdatesEnabled(false);
+}
+
+void VideoSurface::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event);
+    //WARNING: This might trigger unnecessary refreshes from MLT's producer, but without this,
+    // as soon as monitor is covered by a popup menu or another window, image is corrupted.
+    emit refreshMonitor();
+}
+
+
+#include "abstractmonitor.moc"