#include "monitorscene.h"
#include "renderer.h"
-#include "onmonitoritems/onmonitorrectitem.h"
+#include "onmonitoritems/rotoscoping/bpointitem.h"
+#include "onmonitoritems/rotoscoping/splineitem.h"
#include "kdenlivesettings.h"
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QGraphicsSceneMouseEvent>
+#include <QScrollBar>
+
MonitorScene::MonitorScene(Render *renderer, QObject* parent) :
QGraphicsScene(parent),
m_view(NULL),
m_backgroundImage(QImage()),
m_enabled(true),
- m_zoom(1.0)
+ m_zoom(1.0),
+ m_groupMove(false)
{
setBackgroundBrush(QBrush(QColor(KdenliveSettings::window_background().name())));
connect(m_renderer, SIGNAL(frameUpdated(QImage)), this, SLOT(slotSetBackgroundImage(QImage)));
}
+void MonitorScene::centerView()
+{
+ if (m_view) m_view->centerOn(m_frameBorder);
+}
+
+void MonitorScene::cleanup()
+{
+ // Reset scene rect
+ setSceneRect(m_frameBorder->boundingRect());
+}
+
void MonitorScene::setUp()
{
- if (views().count() > 0) {
+ if (!views().isEmpty()) {
m_view = views().at(0);
m_view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
} else {
void MonitorScene::slotUpdateBackground()
{
if (m_view && m_view->isVisible()) {
- if (m_lastUpdate.msecsTo(QTime::currentTime()) > 100) {
+ if (m_lastUpdate.msecsTo(QTime::currentTime()) > 50) {
m_background->setPixmap(QPixmap::fromImage(m_backgroundImage));
m_lastUpdate = QTime::currentTime();
}
slotZoom(qMin(300, (int)(m_zoom * 100 + by + 0.5)));
}
-void MonitorScene::slotSetCursor(const QCursor &cursor)
+void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
- if (m_view)
- m_view->setCursor(cursor);
-}
+ QList <QGraphicsItem *> selected = selectedItems();
+ QGraphicsScene::mousePressEvent(event);
-void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- emit mousePressed(event);
+ if (selected.count() < selectedItems().count()) {
+ // mouse click on item not in selection group
+ // -> select only this item
+ foreach (QGraphicsItem *item, selected) {
+ if (item)
+ item->setSelected(false);
+ }
+ }
+
+ if (event->isAccepted() && selectedItems().count() > 1) {
+ // multiple items selected + mouse pressed on an item
+ selected = selectedItems();
+ foreach (QGraphicsItem *item, selected) {
+ if (qgraphicsitem_cast<BPointItem*>(item)) {
+ // works with rotoscoping only for now
+ m_groupMove = true;
+ m_lastPos = event->scenePos();
+ return;
+ }
+ }
+ }
- if (!event->isAccepted())
- QGraphicsScene::mousePressEvent(event);
+ if (!event->isAccepted() && event->buttons() & Qt::LeftButton) {
+ if (event->modifiers() == Qt::ControlModifier)
+ m_view->setDragMode(QGraphicsView::ScrollHandDrag);
+ else if (event->modifiers() == Qt::ShiftModifier)
+ m_view->setDragMode(QGraphicsView::RubberBandDrag);
+ }
}
void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
- emit mouseMoved(event);
+ if (m_groupMove) {
+ // we want to move multiple items
+ // rotoscoping only for now
+ QPointF diff = event->scenePos() - m_lastPos;
+ if (diff != QPointF(0, 0)) {
+ m_lastPos = event->scenePos();
+ QList <QGraphicsItem *> selected = selectedItems();
+ int first = -1;
+ int i = 0;
+ foreach (QGraphicsItem *item, selected) {
+ BPointItem *bpoint = qgraphicsitem_cast<BPointItem *>(item);
+ if (bpoint) {
+ if (first < 0)
+ first = i;
+ BPoint p = bpoint->getPoint();
+ p.setP(p.p + diff);
+ bpoint->setPoint(p);
+ }
+ ++i;
+ }
- if (!event->isAccepted())
+ if (first >= 0) {
+ QGraphicsItem *item = selected.at(first);
+ if (item->parentItem()) {
+ SplineItem *parent = qgraphicsitem_cast<SplineItem*>(item->parentItem());
+ if (parent)
+ parent->updateSpline(true);
+ }
+ }
+ }
+ } else {
QGraphicsScene::mouseMoveEvent(event);
+ }
}
-void MonitorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+void MonitorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
{
- emit mouseReleased(event);
-
- if (!event->isAccepted())
- QGraphicsScene::mouseReleaseEvent(event);
+ if (m_groupMove) {
+ QList <QGraphicsItem *> selected = selectedItems();
+ foreach (QGraphicsItem *item, selected) {
+ if (qgraphicsitem_cast<BPointItem*>(item) && item->parentItem()) {
+ SplineItem *parent = qgraphicsitem_cast<SplineItem*>(item->parentItem());
+ if (parent) {
+ parent->updateSpline(false);
+ break;
+ }
+ }
+ }
+ m_groupMove = false;
+ }
+ QGraphicsScene::mouseReleaseEvent(event);
+ m_view->setDragMode(QGraphicsView::NoDrag);
}
-
void MonitorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
{
- Q_UNUSED(event);
+ Q_UNUSED(event)
if (!m_enabled)
emit addKeyframe();
void MonitorScene::wheelEvent(QGraphicsSceneWheelEvent* event)
{
if (event->modifiers() == Qt::ControlModifier) {
- if (event->delta() > 0)
+ if (event->delta() > 0) {
+ m_view->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
slotZoomIn(5);
- else
+ m_view->setTransformationAnchor(QGraphicsView::AnchorViewCenter);
+ } else {
slotZoomOut(5);
+ }
} else {
- QGraphicsScene::wheelEvent(event);
+ QAbstractSlider::SliderAction action;
+ if (event->delta() > 0)
+ action = QAbstractSlider::SliderSingleStepSub;
+ else
+ action = QAbstractSlider::SliderSingleStepAdd;
+ if (event->orientation() == Qt::Horizontal)
+ m_view->horizontalScrollBar()->triggerAction(action);
+ else
+ m_view->verticalScrollBar()->triggerAction(action);
}
event->accept();