From 137f5f914c68302519edd33bea98d1f8a106f987 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Fri, 9 Mar 2018 10:50:08 +0100 Subject: [PATCH] Fix clip monitor zone, snap to zone --- src/bin/bin.cpp | 2 -- src/monitor/glwidget.cpp | 2 ++ src/monitor/glwidget.h | 35 +++++++++++++++++++++-- src/monitor/monitor.cpp | 23 +++++++++++---- src/monitor/monitor.h | 2 ++ src/monitor/view/kdenliveclipmonitor.qml | 2 +- src/monitor/view/kdenlivemonitor.qml | 2 +- src/project/projectmanager.cpp | 1 + src/timeline2/model/timelinemodel.cpp | 10 +++++++ src/timeline2/model/timelinemodel.hpp | 10 +++++++ src/timeline2/view/timelinecontroller.cpp | 24 ++++++++++++++++ 11 files changed, 100 insertions(+), 13 deletions(-) diff --git a/src/bin/bin.cpp b/src/bin/bin.cpp index 9f0c88681..2abdc0574 100644 --- a/src/bin/bin.cpp +++ b/src/bin/bin.cpp @@ -1898,9 +1898,7 @@ void Bin::selectClip(const std::shared_ptr &clip) if (id.isValid() && id2.isValid()) { m_proxyModel->selectionModel()->select(QItemSelection(m_proxyModel->mapFromSource(id), m_proxyModel->mapFromSource(id2)), QItemSelectionModel::Select); } - selectProxyModel(m_proxyModel->mapFromSource(ix)); m_itemView->scrollTo(m_proxyModel->mapFromSource(ix)); - emit openClip(clip); } void Bin::slotOpenCurrent() diff --git a/src/monitor/glwidget.cpp b/src/monitor/glwidget.cpp index 567cac4a1..da36c05a1 100644 --- a/src/monitor/glwidget.cpp +++ b/src/monitor/glwidget.cpp @@ -1781,6 +1781,8 @@ void GLWidget::setRulerInfo(int duration, std::shared_ptr model { rootObject()->setProperty("duration", duration); if (model != nullptr) { + // we are resetting marker/snap model, reset zone + m_proxy->resetZone(); rootContext()->setContextProperty("markersModel", model.get()); } } diff --git a/src/monitor/glwidget.h b/src/monitor/glwidget.h index d5eae1373..4cb656c15 100644 --- a/src/monitor/glwidget.h +++ b/src/monitor/glwidget.h @@ -350,25 +350,52 @@ public: int zoneOut() const { return m_zoneOut; } void setZoneIn(int pos) { + if (m_zoneIn > 0) { + emit removeSnap(m_zoneIn); + } m_zoneIn = pos; + if (pos > 0) { + emit addSnap(pos); + } emit zoneChanged(); } void setZoneOut(int pos) { + if (m_zoneOut > 0) { + emit removeSnap(m_zoneOut); + } m_zoneOut = pos; + if (pos > 0) { + emit addSnap(pos); + } emit zoneChanged(); } Q_INVOKABLE void setZone(int in, int out) { + if (m_zoneIn > 0) { + emit removeSnap(m_zoneIn); + } + if (m_zoneOut > 0) { + emit removeSnap(m_zoneOut); + } m_zoneIn = in; m_zoneOut = out; + if (m_zoneIn > 0) { + emit addSnap(m_zoneIn); + } + if (m_zoneOut > 0) { + emit addSnap(m_zoneOut); + } emit zoneChanged(); } void setZone(QPoint zone) { - m_zoneIn = zone.x(); - m_zoneOut = zone.y(); - emit zoneChanged(); + setZone(zone.x(), zone.y()); + } + void resetZone() + { + m_zoneIn = 0; + m_zoneOut = -1; } QPoint zone() const { return QPoint(m_zoneIn, m_zoneOut); } signals: @@ -378,6 +405,8 @@ signals: void zoneChanged(); void markerCommentChanged(); void rulerHeightChanged(); + void addSnap(int); + void removeSnap(int); private: GLWidget *q; diff --git a/src/monitor/monitor.cpp b/src/monitor/monitor.cpp index d6a8b480c..e92eac901 100644 --- a/src/monitor/monitor.cpp +++ b/src/monitor/monitor.cpp @@ -637,10 +637,6 @@ int Monitor::position() GenTime Monitor::getSnapForPos(bool previous) { - QPoint zone = m_glMonitor->getControllerProxy()->zone(); - // TODO: move points with the zone - m_snaps->addPoint(zone.x()); - m_snaps->addPoint(zone.y()); int frame = previous ? m_snaps->getPreviousPoint(m_glMonitor->getCurrentPos()) : m_snaps->getNextPoint(m_glMonitor->getCurrentPos()); return GenTime(frame, pCore->getCurrentFps()); } @@ -1219,6 +1215,9 @@ void Monitor::adjustRulerSize(int length, std::shared_ptr marke connect(markerModel.get(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &, const QVector &)), this, SLOT(checkOverlay())); connect(markerModel.get(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(checkOverlay())); connect(markerModel.get(), SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(checkOverlay())); + if (m_controller) { + markerModel->registerSnapModel(m_snaps); + } } } @@ -1350,13 +1349,11 @@ void Monitor::slotOpenClip(std::shared_ptr controller, int in, int loadQmlScene(MonitorSceneDefault); m_snaps.reset(new SnapModel()); if (controller) { - m_controller->getMarkerModel()->registerSnapModel(m_snaps); connect(m_controller->getMarkerModel().get(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &, const QVector &)), this, SLOT(checkOverlay())); connect(m_controller->getMarkerModel().get(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(checkOverlay())); connect(m_controller->getMarkerModel().get(), SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(checkOverlay())); - m_snaps->addPoint(m_controller->frameDuration()); if (m_recManager->toolbar()->isVisible()) { // we are in record mode, don't display clip return; @@ -1364,7 +1361,10 @@ void Monitor::slotOpenClip(std::shared_ptr controller, int in, int m_glMonitor->setRulerInfo(m_controller->frameDuration(), controller->getMarkerModel()); m_timePos->setRange(0, m_controller->frameDuration()); updateMarkers(); + connect(m_glMonitor->getControllerProxy(), &MonitorProxy::addSnap, this, &Monitor::addSnapPoint, Qt::DirectConnection); + connect(m_glMonitor->getControllerProxy(), &MonitorProxy::removeSnap, this, &Monitor::removeSnapPoint, Qt::DirectConnection); m_glMonitor->getControllerProxy()->setZone(m_controller->zone()); + m_snaps->addPoint(m_controller->frameDuration()); // Loading new clip / zone, stop if playing if (m_playAction->isActive()) { m_playAction->setActive(false); @@ -2151,3 +2151,14 @@ void Monitor::slotEnd() m_glMonitor->switchPlay(false); m_glMonitor->seek(m_glMonitor->duration()); } + +void Monitor::addSnapPoint(int pos) +{ + m_snaps->addPoint(pos); +} + +void Monitor::removeSnapPoint(int pos) +{ + m_snaps->removePoint(pos); +} + diff --git a/src/monitor/monitor.h b/src/monitor/monitor.h index cd4a6a8c5..461bc40d1 100644 --- a/src/monitor/monitor.h +++ b/src/monitor/monitor.h @@ -275,6 +275,8 @@ private slots: /** @brief Project monitor zone changed, inform timeline */ void updateTimelineClipZone(); void slotSeekPosition(int); + void addSnapPoint(int pos); + void removeSnapPoint(int pos); public slots: void slotOpenDvdFile(const QString &); diff --git a/src/monitor/view/kdenliveclipmonitor.qml b/src/monitor/view/kdenliveclipmonitor.qml index 5af2456e2..a0f2959b6 100644 --- a/src/monitor/view/kdenliveclipmonitor.qml +++ b/src/monitor/view/kdenliveclipmonitor.qml @@ -194,7 +194,7 @@ Item { style: TextFieldStyle { textColor: "white" background: Rectangle { - color: "#66ff0000" + color: controller.position == controller.zoneIn ? "#9900ff00" : controller.position == controller.zoneOut ? "#99ff0000" : "#990000ff" width: marker.width } } diff --git a/src/monitor/view/kdenlivemonitor.qml b/src/monitor/view/kdenlivemonitor.qml index e4a191026..e7ee9fe9b 100644 --- a/src/monitor/view/kdenlivemonitor.qml +++ b/src/monitor/view/kdenlivemonitor.qml @@ -162,7 +162,7 @@ Item { style: TextFieldStyle { textColor: "white" background: Rectangle { - color: "#99ff0000" + color: controller.position == controller.zoneIn ? "#9900ff00" : controller.position == controller.zoneOut ? "#99ff0000" : "#990000ff" width: marker.width } } diff --git a/src/project/projectmanager.cpp b/src/project/projectmanager.cpp index d1e13a566..8a867a2fa 100644 --- a/src/project/projectmanager.cpp +++ b/src/project/projectmanager.cpp @@ -902,3 +902,4 @@ std::shared_ptr ProjectManager::undoStack() { return current()->commandStack(); } + diff --git a/src/timeline2/model/timelinemodel.cpp b/src/timeline2/model/timelinemodel.cpp index 73b907e80..5fbde712d 100644 --- a/src/timeline2/model/timelinemodel.cpp +++ b/src/timeline2/model/timelinemodel.cpp @@ -1443,6 +1443,16 @@ int TimelineModel::requestPreviousSnapPos(int pos) return m_snaps->getPreviousPoint(pos); } +void TimelineModel::addSnap(int pos) +{ + return m_snaps->addPoint(pos); +} + +void TimelineModel::removeSnap(int pos) +{ + return m_snaps->removePoint(pos); +} + void TimelineModel::registerComposition(const std::shared_ptr &composition) { int id = composition->getId(); diff --git a/src/timeline2/model/timelinemodel.hpp b/src/timeline2/model/timelinemodel.hpp index 5c782dba0..6f7417936 100644 --- a/src/timeline2/model/timelinemodel.hpp +++ b/src/timeline2/model/timelinemodel.hpp @@ -447,6 +447,16 @@ public: */ int requestPreviousSnapPos(int pos); + /* @brief Add a new snap point + @param pos is the current position + */ + void addSnap(int pos); + + /* @brief Remove snap point + @param pos is the current position + */ + void removeSnap(int pos); + /* @brief Request composition insertion at given position. This action is undoable Returns true on success. If it fails, nothing is modified. diff --git a/src/timeline2/view/timelinecontroller.cpp b/src/timeline2/view/timelinecontroller.cpp index 645d4f291..41b79cbf0 100644 --- a/src/timeline2/view/timelinecontroller.cpp +++ b/src/timeline2/view/timelinecontroller.cpp @@ -699,18 +699,42 @@ void TimelineController::onSeeked(int position) void TimelineController::setZone(const QPoint &zone) { + if (m_zone.x() > 0) { + m_model->removeSnap(m_zone.x()); + } + if (m_zone.y() > 0) { + m_model->removeSnap(m_zone.y()); + } + if (zone.x() > 0) { + m_model->addSnap(zone.x()); + } + if (zone.y() > 0) { + m_model->addSnap(zone.y()); + } m_zone = zone; emit zoneChanged(); } void TimelineController::setZoneIn(int inPoint) { + if (m_zone.x() > 0) { + m_model->removeSnap(m_zone.x()); + } + if (inPoint > 0) { + m_model->addSnap(inPoint); + } m_zone.setX(inPoint); emit zoneMoved(m_zone); } void TimelineController::setZoneOut(int outPoint) { + if (m_zone.y() > 0) { + m_model->removeSnap(m_zone.y()); + } + if (outPoint > 0) { + m_model->addSnap(outPoint); + } m_zone.setY(outPoint); emit zoneMoved(m_zone); } -- GitLab