diff --git a/src/transitions/view/transitionstackview.cpp b/src/transitions/view/transitionstackview.cpp index b5fb63dfd..73251149f 100644 --- a/src/transitions/view/transitionstackview.cpp +++ b/src/transitions/view/transitionstackview.cpp @@ -1,130 +1,131 @@ /*************************************************************************** * Copyright (C) 2017 by Nicolas Carion * * This file is part of Kdenlive. See www.kdenlive.org. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) version 3 or any later version accepted by the * * membership of KDE e.V. (or its successor approved by the membership * * of KDE e.V.), which shall act as a proxy defined in Section 14 of * * version 3 of the license. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * ***************************************************************************/ #include "transitionstackview.hpp" #include "assets/keyframes/model/keyframemodellist.hpp" #include "assets/model/assetparametermodel.hpp" #include "core.h" #include "monitor/monitor.h" #include #include #include #include #include #include #include TransitionStackView::TransitionStackView(QWidget *parent) : AssetParameterView(parent) , m_trackBox(nullptr) { } void TransitionStackView::refreshTracks() { if (!m_trackBox || !m_model) { return; } QSignalBlocker bk(m_trackBox); m_trackBox->clear(); - QMapIterator i(pCore->getVideoTrackNames()); QPair aTrack = pCore->getCompositionATrack(m_model->getOwnerId().second); m_trackBox->addItem(i18n("Automatic"), -1); - while (i.hasNext()) { - i.next(); + QMapIterator i(pCore->getVideoTrackNames()); + i.toBack(); + while (i.hasPrevious()) { + i.previous(); if (i.key() < aTrack.second) { m_trackBox->addItem(i.value(), i.key()); } } m_trackBox->addItem(i18n("Background"), 0); if (!pCore->compositionAutoTrack(m_model->getOwnerId().second)) { m_trackBox->setCurrentIndex(m_trackBox->findData(aTrack.first)); } } void TransitionStackView::setModel(const std::shared_ptr &model, QSize frameSize, bool addSpacer) { auto *lay = new QHBoxLayout; m_trackBox = new QComboBox(this); AssetParameterView::setModel(model, frameSize, addSpacer); refreshTracks(); QLabel *title = new QLabel(i18n("Composition track:"), this); lay->addWidget(title); lay->addWidget(m_trackBox); m_lay->insertLayout(0, lay); auto kfr = model->getKeyframeModel(); if (kfr) { connect(kfr.get(), &KeyframeModelList::modelChanged, this, &AssetParameterView::slotRefresh); } connect(model.get(), &AssetParameterModel::compositionTrackChanged, this, &TransitionStackView::checkCompoTrack); connect(m_trackBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTrack(int))); connect(this, &AssetParameterView::seekToPos, [this](int pos) { // at this point, the effects returns a pos relative to the clip. We need to convert it to a global time int clipIn = pCore->getItemPosition(m_model->getOwnerId()); emit seekToTransPos(pos + clipIn); }); initKeyframeView(true); pCore->getMonitor(m_model->monitorId)->slotShowEffectScene(needsMonitorEffectScene()); m_lay->addStretch(10); slotRefresh(); } void TransitionStackView::unsetModel() { if (m_model) { disconnect(m_model.get(), &AssetParameterModel::compositionTrackChanged, this, &TransitionStackView::checkCompoTrack); auto kfr = m_model->getKeyframeModel(); if (kfr) { disconnect(kfr.get(), &KeyframeModelList::modelChanged, this, &AssetParameterView::slotRefresh); } pCore->getMonitor(m_model->monitorId)->slotShowEffectScene(MonitorSceneDefault); delete m_trackBox; m_trackBox = nullptr; } AssetParameterView::unsetModel(); } void TransitionStackView::updateTrack(int newTrack) { Q_UNUSED(newTrack) qDebug() << "// Update transition TRACK to: " << m_trackBox->currentData().toInt(); pCore->setCompositionATrack(m_model->getOwnerId().second, m_trackBox->currentData().toInt()); } ObjectId TransitionStackView::stackOwner() const { if (m_model) { return m_model->getOwnerId(); } return ObjectId(ObjectType::NoItem, -1); } void TransitionStackView::checkCompoTrack() { refreshTracks(); bool autoTrack = pCore->compositionAutoTrack(m_model->getOwnerId().second); QPair aTrack = autoTrack ? QPair(-1, -1) : pCore->getCompositionATrack(m_model->getOwnerId().second); if (m_trackBox->currentData().toInt() != aTrack.first) { const QSignalBlocker blocker(m_trackBox); m_trackBox->setCurrentIndex(m_trackBox->findData(aTrack.first)); } }