#include "monitorscene.h"
#include "renderer.h"
+#include "onmonitoritems/onmonitorrectitem.h"
+#include "kdenlivesettings.h"
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
-#include <QtCore>
+#include <QGraphicsSceneMouseEvent>
MonitorScene::MonitorScene(Render *renderer, QObject* parent) :
QGraphicsScene(parent),
- m_renderer(renderer)
+ m_renderer(renderer),
+ m_view(NULL),
+ m_backgroundImage(QImage()),
+ m_enabled(true),
+ m_zoom(1.0)
{
-}
-
-void MonitorScene::setUp()
-{
- setBackgroundBrush(QBrush(QColor(0, 0, 255)));
+ 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_lastUpdate = QTime::currentTime();
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);
- connect(m_renderer, SIGNAL(rendererPosition(int)), this, SLOT(slotUpdateBackground()));
- connect(m_renderer, SIGNAL(frameUpdated(int)), this, SLOT(slotUpdateBackground()));
- slotUpdateBackground();
- views().at(0)->fitInView(m_frameBorder, Qt::KeepAspectRatio);
- views().at(0)->centerOn(m_frameBorder);
+ connect(m_renderer, SIGNAL(frameUpdated(QImage)), this, SLOT(slotSetBackgroundImage(QImage)));
+}
+
+void MonitorScene::setUp()
+{
+ if (views().count() > 0) {
+ m_view = views().at(0);
+ m_view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
+ } else {
+ m_view = NULL;
+ }
+}
+
+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()
{
- if (views().count() > 0 && views().at(0)->isVisible()) {
- if (m_lastUpdate.elapsed() > 200) {
- m_background->setPixmap(QPixmap::fromImage(m_renderer->extractFrame(m_renderer->seekFramePosition())));
- views().at(0)->fitInView(m_frameBorder, Qt::KeepAspectRatio);
- views().at(0)->centerOn(m_frameBorder);
- m_lastUpdate.start();
+ if (m_view && m_view->isVisible()) {
+ if (m_lastUpdate.msecsTo(QTime::currentTime()) > 100) {
+ m_background->setPixmap(QPixmap::fromImage(m_backgroundImage));
+ m_lastUpdate = QTime::currentTime();
}
}
}
-void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent* event)
+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()
{
- QGraphicsScene::mousePressEvent(event);
+ slotZoom(100);
+ if (m_view)
+ m_view->centerOn(m_frameBorder);
+}
+
+void MonitorScene::slotZoomOut(int by)
+{
+ slotZoom(qMax(0, (int)(m_zoom * 100 - by)));
+}
+
+void MonitorScene::slotZoomIn(int by)
+{
+ slotZoom(qMin(300, (int)(m_zoom * 100 + by + 0.5)));
+}
+
+void MonitorScene::slotSetCursor(const QCursor &cursor)
+{
+ if (m_view)
+ m_view->setCursor(cursor);
}
-void MonitorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
+void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
- QGraphicsScene::mouseReleaseEvent(event);
- emit actionFinished();
+ emit mousePressed(event);
+
+ if (!event->isAccepted())
+ QGraphicsScene::mousePressEvent(event);
+}
+
+void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ emit mouseMoved(event);
+
+ if (!event->isAccepted())
+ QGraphicsScene::mouseMoveEvent(event);
+}
+
+void MonitorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ emit mouseReleased(event);
+
+ if (!event->isAccepted())
+ QGraphicsScene::mouseReleaseEvent(event);
+}
+
+void MonitorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
+{
+ Q_UNUSED(event);
+
+ if (!m_enabled)
+ emit addKeyframe();
+}
+
+void MonitorScene::wheelEvent(QGraphicsSceneWheelEvent* event)
+{
+ if (event->modifiers() == Qt::ControlModifier) {
+ if (event->delta() > 0)
+ slotZoomIn(5);
+ else
+ slotZoomOut(5);
+
+ event->accept();
+ } else {
+ QGraphicsScene::wheelEvent(event);
+ }
}
#include "monitorscene.moc"