#include "renderer.h"
#include "kdenlivesettings.h"
-#include <QtCore>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QGraphicsSceneMouseEvent>
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);
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();
void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
+ if (!m_enabled)
+ return;
+
m_resizeMode = NoResize;
m_selectedItem = NULL;
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) {
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:
rect.setBottom(rect.height() - mousePosInRect.y());
item->setRect(rect);
item->setPos(QPointF(pos.x(), mousePos.y()));
+ m_modified = true;
}
break;
case TopRight:
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:
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:
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;
}
}
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) {
}
}
- 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"