]> git.sesse.net Git - kdenlive/blobdiff - src/monitorscene.cpp
Implement document notes:
[kdenlive] / src / monitorscene.cpp
index 96c7b7f511ef02a25d19acb6fa003965ccb27fd8..655425e27ed769deec4dc8e86452593711e9aa57 100644 (file)
@@ -22,7 +22,6 @@
 #include "renderer.h"
 #include "kdenlivesettings.h"
 
-#include <QtCore>
 #include <QGraphicsView>
 #include <QGraphicsPixmapItem>
 #include <QGraphicsSceneMouseEvent>
@@ -34,25 +33,30 @@ MonitorScene::MonitorScene(Render *renderer, QObject* parent) :
         m_selectedItem(NULL),
         m_resizeMode(NoResize),
         m_clickPoint(0, 0),
-        m_backgroundImage(QImage())
+        m_backgroundImage(QImage()),
+        m_enabled(true),
+        m_modified(false),
+        m_zoom(1.0)
 {
     setBackgroundBrush(QBrush(QColor(KdenliveSettings::window_background().name())));
 
     QPen framepen(Qt::DotLine);
     framepen.setColor(Qt::red);
 
-    m_frameBorder = new QGraphicsRectItem(QRectF(0, 0, m_renderer->renderWidth(), m_renderer->renderHeight()));
+    m_frameBorder = new QGraphicsRectItem(QRectF(0, 0, m_renderer->frameRenderWidth(), m_renderer->renderHeight()));
     m_frameBorder->setPen(framepen);
-    m_frameBorder->setZValue(-9);
+    m_frameBorder->setZValue(-1);
     m_frameBorder->setBrush(Qt::transparent);
     m_frameBorder->setFlags(0);
     addItem(m_frameBorder);
 
     m_lastUpdate.start();
     m_background = new QGraphicsPixmapItem();
-    m_background->setZValue(-10);
+    m_background->setZValue(-2);
     m_background->setFlags(0);
-    QPixmap bg(m_renderer->renderWidth(), m_renderer->renderHeight());
+    m_background->setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
+    m_background->setTransformationMode(Qt::FastTransformation);
+    QPixmap bg(m_renderer->frameRenderWidth(), m_renderer->renderHeight());
     bg.fill();
     m_background->setPixmap(bg);
     addItem(m_background);
@@ -67,32 +71,88 @@ void MonitorScene::setUp()
         m_view = views().at(0);
     else
         m_view = NULL;
-    slotUpdateBackground(true);
+
+    m_view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
+}
+
+void MonitorScene::resetProfile()
+{
+    const QRectF border(0, 0, m_renderer->frameRenderWidth(), m_renderer->renderHeight());
+    m_frameBorder->setRect(border);
+}
+
+void MonitorScene::setEnabled(bool enabled)
+{
+    m_enabled = enabled;
 }
 
-void MonitorScene::slotUpdateBackground(bool fit)
+void MonitorScene::slotUpdateBackground()
 {
     if (m_view && m_view->isVisible()) {
-        if (m_lastUpdate.elapsed() > 200) {
+        if (m_lastUpdate.elapsed() > 100) {
             m_background->setPixmap(QPixmap::fromImage(m_backgroundImage));
-            if (fit) {
-                m_view->fitInView(m_frameBorder, Qt::KeepAspectRatio);
-                m_view->centerOn(m_frameBorder);
-            }
             m_lastUpdate.start();
         }
     }
 }
 
-void MonitorScene::slotSetBackgroundImage(QImage image)
+void MonitorScene::slotSetDirectUpdate(bool directUpdate)
+{
+    KdenliveSettings::setMonitorscene_directupdate(directUpdate);
+}
+
+void MonitorScene::slotSetBackgroundImage(const QImage &image)
+{
+    if (m_view && m_view->isVisible()) {
+        m_backgroundImage = image;
+        slotUpdateBackground();
+    }
+}
+
+
+void MonitorScene::slotZoom(int value)
+{
+    if (m_view) {
+        m_zoom = value / 100.0;
+        m_view->resetTransform();
+        m_view->scale(m_renderer->renderWidth() * m_zoom / m_renderer->frameRenderWidth(), m_zoom);
+        emit zoomChanged(value);
+    }
+}
+
+void MonitorScene::slotZoomFit()
+{
+    if (m_view) {
+        int xzoom = 100 * m_view->viewport()->height() / m_renderer->renderHeight();
+        int yzoom = 100 * m_view->viewport()->width() / m_renderer->renderWidth();
+        slotZoom(qMin(xzoom, yzoom));
+        m_view->centerOn(m_frameBorder);
+    }
+}
+
+void MonitorScene::slotZoomOriginal()
+{
+    slotZoom(100);
+    if (m_view)
+        m_view->centerOn(m_frameBorder);
+}
+
+void MonitorScene::slotZoomOut()
+{
+    slotZoom(qMax(0, (int)(m_zoom * 100 - 1)));
+}
+
+void MonitorScene::slotZoomIn()
 {
-    m_backgroundImage = image;
-    slotUpdateBackground();
+    int newzoom = (100 * m_zoom + 0.5);
+    newzoom++;
+    slotZoom(qMin(300, newzoom));
 }
 
+
 resizeModes MonitorScene::getResizeMode(QGraphicsRectItem *item, QPoint pos)
 {
-    if(!m_view)
+    if (!m_view)
         return NoResize;
 
     QRectF rect = item->rect().normalized();
@@ -133,6 +193,9 @@ resizeModes MonitorScene::getResizeMode(QGraphicsRectItem *item, QPoint pos)
 
 void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
 {
+    if (!m_enabled)
+        return;
+
     m_resizeMode = NoResize;
     m_selectedItem = NULL;
 
@@ -155,6 +218,17 @@ void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
 
 void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
 {
+    if (!m_enabled) {
+        if (m_view)
+            m_view->setCursor(Qt::ArrowCursor);
+        return;
+    }
+
+    /*if (event->buttons() != Qt::NoButton && (event->screenPos() - m_screenClickPoint).manhattanLength() < QApplication::startDragDistance()) {
+        event->accept();
+        return;
+    }*/
+
     QPointF mousePos = event->scenePos();
 
     if (m_selectedItem && event->buttons() & Qt::LeftButton) {
@@ -169,6 +243,7 @@ void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
                 if (mousePos.x() < pos.x() + rect.height() && mousePos.y() < pos.y() + rect.height()) {
                     item->setRect(rect.adjusted(0, 0, -mousePosInRect.x(), -mousePosInRect.y()));
                     item->setPos(mousePos);
+                    m_modified = true;
                 }
                 break;
             case Top:
@@ -176,6 +251,7 @@ void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
                     rect.setBottom(rect.height() - mousePosInRect.y());
                     item->setRect(rect);
                     item->setPos(QPointF(pos.x(), mousePos.y()));
+                    m_modified = true;
                 }
                 break;
             case TopRight:
@@ -183,6 +259,7 @@ void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
                     rect.setBottomRight(QPointF(mousePosInRect.x(), rect.bottom() - mousePosInRect.y()));
                     item->setRect(rect);
                     item->setPos(QPointF(pos.x(), mousePos.y()));
+                    m_modified = true;
                 }
                 break;
             case Left:
@@ -190,12 +267,14 @@ void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
                     rect.setRight(rect.width() - mousePosInRect.x());
                     item->setRect(rect);
                     item->setPos(QPointF(mousePos.x(), pos.y()));
+                    m_modified = true;
                 }
                 break;
             case Right:
                 if (mousePos.x() > pos.x()) {
                     rect.setRight(mousePosInRect.x());
                     item->setRect(rect);
+                    m_modified = true;
                 }
                 break;
             case BottomLeft:
@@ -203,24 +282,28 @@ void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
                     rect.setBottomRight(QPointF(rect.width() - mousePosInRect.x(), mousePosInRect.y()));
                     item->setRect(rect);
                     item->setPos(QPointF(mousePos.x(), pos.y()));
+                    m_modified = true;
                 }
                 break;
             case Bottom:
                 if (mousePos.y() > pos.y()) {
                     rect.setBottom(mousePosInRect.y());
                     item->setRect(rect);
+                    m_modified = true;
                 }
                 break;
             case BottomRight:
                 if (mousePos.x() > pos.x() && mousePos.y() > pos.y()) {
                     rect.setBottomRight(mousePosInRect);
                     item->setRect(rect);
+                    m_modified = true;
                 }
                 break;
             default:
                 QPointF diff = mousePos - m_clickPoint;
                 m_clickPoint = mousePos;
                 item->moveBy(diff.x(), diff.y());
+                m_modified = true;
                 break;
             }
         }
@@ -229,7 +312,7 @@ void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
         bool itemFound = false;
         QList<QGraphicsItem *> itemList = items(QRectF(mousePos, QSizeF(4, 4)).toRect());
 
-        foreach (const QGraphicsItem* item, itemList) {
+        foreach(const QGraphicsItem* item, itemList) {
             if (item->zValue() >= 0 && item->flags() &QGraphicsItem::ItemIsMovable) {
                 // Rect
                 if (item->type() == 3) {
@@ -263,17 +346,37 @@ void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
             }
         }
 
-        if (!itemFound && m_view != NULL)
+        if (!itemFound && m_view)
             m_view->setCursor(Qt::ArrowCursor);
 
         QGraphicsScene::mouseMoveEvent(event);
     }
+    if (m_modified && KdenliveSettings::monitorscene_directupdate()) {
+        emit actionFinished();
+        m_modified = false;
+    }
 }
 
 void MonitorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 {
-    QGraphicsScene::mouseReleaseEvent(event);
-    emit actionFinished();
+    Q_UNUSED(event);
+
+    if (!m_enabled)
+        return;
+
+    if (m_modified) {
+        m_modified = false;
+        emit actionFinished();
+    }
 }
 
+void MonitorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
+{
+    Q_UNUSED(event);
+
+    if (!m_enabled)
+        emit addKeyframe();
+}
+
+
 #include "monitorscene.moc"