From 9d72b0890b0b6ee5d0476ca11d712c4a1c66d583 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 15 May 2018 19:49:13 +0200 Subject: [PATCH] Fix lift zone random behavior --- src/mainwindow.cpp | 2 +- src/timeline2/model/clipmodel.cpp | 4 +++- src/timeline2/model/timelinefunctions.cpp | 13 +++++++----- src/timeline2/model/trackmodel.cpp | 21 ++++++-------------- src/timeline2/view/timelinecontroller.cpp | 24 ++--------------------- src/timeline2/view/timelinecontroller.h | 8 ++++---- 6 files changed, 24 insertions(+), 48 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4e8179b30..f1e32b703 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2528,7 +2528,7 @@ void MainWindow::slotExtractZone() void MainWindow::slotLiftZone() { - getMainTimeline()->controller()->liftZone(m_clipMonitor->getZoneInfo()); + getMainTimeline()->controller()->extractZone(m_clipMonitor->getZoneInfo(), true); } void MainWindow::slotPreviewRender() diff --git a/src/timeline2/model/clipmodel.cpp b/src/timeline2/model/clipmodel.cpp index bfe51dc85..4a36ca46e 100644 --- a/src/timeline2/model/clipmodel.cpp +++ b/src/timeline2/model/clipmodel.cpp @@ -69,7 +69,6 @@ int ClipModel::construct(const std::shared_ptr &parent, const QSt state = stateFromBool(videoAudio); std::shared_ptr cutProducer = binClip->getTimelineProducer(id, state, 1.); - std::shared_ptr clip(new ClipModel(parent, cutProducer, binClipId, id, state)); clip->setClipState_lambda(state)(); parent->registerClip(clip); @@ -483,6 +482,9 @@ bool ClipModel::setClipState(PlaylistState::ClipState state, Fun &undo, Fun &red if (state == PlaylistState::AudioOnly && !canBeAudio()) { return false; } + if (state == m_currentState) { + return true; + } auto old_state = m_currentState; auto operation = setClipState_lambda(state); if (operation()) { diff --git a/src/timeline2/model/timelinefunctions.cpp b/src/timeline2/model/timelinefunctions.cpp index b361c04c9..5b430012d 100644 --- a/src/timeline2/model/timelinefunctions.cpp +++ b/src/timeline2/model/timelinefunctions.cpp @@ -222,12 +222,12 @@ bool TimelineFunctions::extractZone(std::shared_ptr timeline, // Start undoable command std::function undo = []() { return true; }; std::function redo = []() { return true; }; - bool result = false; + bool result = true; for (int trackId : tracks) { - result = TimelineFunctions::liftZone(timeline, trackId, zone, undo, redo); - if (result && !liftOnly) { - result = TimelineFunctions::removeSpace(timeline, trackId, zone, undo, redo); - } + result = result && TimelineFunctions::liftZone(timeline, trackId, zone, undo, redo); + } + if (result && !liftOnly) { + result = TimelineFunctions::removeSpace(timeline, -1, zone, undo, redo); } pCore->pushUndo(undo, redo, liftOnly ? i18n("Lift zone") : i18n("Extract zone")); return result; @@ -305,6 +305,9 @@ bool TimelineFunctions::removeSpace(std::shared_ptr timeline, if (result) { result = timeline->requestClipUngroup(clipId, undo, redo); } + if (!result) { + undo(); + } } } else { // only 1 clip to be moved diff --git a/src/timeline2/model/trackmodel.cpp b/src/timeline2/model/trackmodel.cpp index 0227dfebf..356640c15 100644 --- a/src/timeline2/model/trackmodel.cpp +++ b/src/timeline2/model/trackmodel.cpp @@ -594,24 +594,15 @@ int TrackModel::getClipByRow(int row) const std::unordered_set TrackModel::getClipsAfterPosition(int position, int end) { READ_LOCK(); - // TODO: this function doesn't take into accounts the fact that there are two tracks std::unordered_set ids; - int ix = m_playlists[0].get_clip_index_at(position); - if (end > -1) { - end = m_playlists[0].get_clip_index_at(end); - if (end < m_playlists[0].count()) { - end++; - } - } else { - end = m_playlists[0].count(); - } - while (ix < end) { - QSharedPointer prod(m_playlists[0].get_clip(ix)); - ix++; - if (prod->is_blank()) { + for (auto clp : m_allClips) { + int pos = clp.second->getPosition(); + if (end > -1 && pos >= end) { continue; } - ids.insert(prod->get_int("_kdenlive_cid")); + if (pos >= position) { + ids.insert(clp.first); + } } return ids; } diff --git a/src/timeline2/view/timelinecontroller.cpp b/src/timeline2/view/timelinecontroller.cpp index 21ceb8193..6e9c09529 100644 --- a/src/timeline2/view/timelinecontroller.cpp +++ b/src/timeline2/view/timelinecontroller.cpp @@ -1384,7 +1384,7 @@ void TimelineController::switchCompositing(int mode) pCore->requestMonitorRefresh(); } -void TimelineController::extractZone(QPoint zone) +void TimelineController::extractZone(QPoint zone, bool liftOnly) { QVector tracks; if (audioTarget() >= 0) { @@ -1401,7 +1401,7 @@ void TimelineController::extractZone(QPoint zone) zone.setY(timelinePosition() + zone.y() - zone.x()); zone.setX(timelinePosition()); } - TimelineFunctions::extractZone(m_model, tracks, m_zone == QPoint() ? zone : m_zone, false); + TimelineFunctions::extractZone(m_model, tracks, m_zone == QPoint() ? zone : m_zone, liftOnly); } void TimelineController::extract(int clipId) @@ -1413,26 +1413,6 @@ void TimelineController::extract(int clipId) TimelineFunctions::extractZone(m_model, QVector() << track, zone, false); } -void TimelineController::liftZone(QPoint zone) -{ - QVector tracks; - if (audioTarget() >= 0) { - tracks << audioTarget(); - } - if (videoTarget() >= 0) { - tracks << videoTarget(); - } - if (tracks.isEmpty()) { - tracks << m_activeTrack; - } - if (m_zone == QPoint()) { - // Use current timeline position and clip zone length - zone.setY(timelinePosition() + zone.y() - zone.x()); - zone.setX(timelinePosition()); - } - TimelineFunctions::extractZone(m_model, tracks, m_zone == QPoint() ? zone : m_zone, true); -} - int TimelineController::insertZone(const QString &binId, QPoint zone, bool overwrite) { std::shared_ptr clip = pCore->bin()->getBinClip(binId); diff --git a/src/timeline2/view/timelinecontroller.h b/src/timeline2/view/timelinecontroller.h index 4f3957b0e..2ccfcd9f7 100644 --- a/src/timeline2/view/timelinecontroller.h +++ b/src/timeline2/view/timelinecontroller.h @@ -343,10 +343,10 @@ public: /** @brief Change a clip item's speed in timeline */ Q_INVOKABLE void changeItemSpeed(int clipId, int speed); - /** @brief Delete selected zone and fill gap by moving following clips*/ - void extractZone(QPoint zone); - /** @brief Delete selected zone */ - void liftZone(QPoint zone); + /** @brief Delete selected zone and fill gap by moving following clips + * @param lift if true, the zone will simply be deleted but clips won't be moved + */ + void extractZone(QPoint zone, bool liftOnly = false); /** @brief Insert clip monitor into timeline * @returns the zone end position or -1 on fail */ -- GitLab