File indexing completed on 2024-05-05 04:54:18

0001 /*
0002     SPDX-FileCopyrightText: 2017 Nicolas Carion
0003     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005 
0006 #include "transitionstackview.hpp"
0007 #include "assets/keyframes/model/keyframemodellist.hpp"
0008 #include "assets/model/assetparametermodel.hpp"
0009 #include "core.h"
0010 #include "monitor/monitor.h"
0011 
0012 #include <KLocalizedString>
0013 #include <QComboBox>
0014 #include <QDebug>
0015 #include <QHBoxLayout>
0016 #include <QLabel>
0017 #include <QSignalBlocker>
0018 
0019 TransitionStackView::TransitionStackView(QWidget *parent)
0020     : AssetParameterView(parent)
0021 {
0022     connect(this, &AssetParameterView::seekToPos, [this](int pos) {
0023         // at this point, the effects returns a pos relative to the clip. We need to convert it to a global time
0024         int clipIn = pCore->getItemPosition(m_model->getOwnerId());
0025         Q_EMIT seekToTransPos(pos + clipIn);
0026     });
0027 }
0028 
0029 void TransitionStackView::refreshTracks()
0030 {
0031     if (!m_trackBox || !m_model) {
0032         return;
0033     }
0034     QSignalBlocker bk(m_trackBox);
0035     m_trackBox->clear();
0036     QPair<int, int> aTrack = pCore->getCompositionATrack(m_model->getOwnerId().itemId);
0037     m_trackBox->addItem(i18n("Automatic"), -1);
0038     QMapIterator<int, QString> i(pCore->getTrackNames(true));
0039     i.toBack();
0040     while (i.hasPrevious()) {
0041         i.previous();
0042         if (i.key() < aTrack.second) {
0043             m_trackBox->addItem(i.value(), i.key());
0044         }
0045     }
0046     m_trackBox->addItem(i18n("Background"), 0);
0047     if (!pCore->compositionAutoTrack(m_model->getOwnerId().itemId)) {
0048         m_trackBox->setCurrentIndex(m_trackBox->findData(aTrack.first));
0049     }
0050 }
0051 
0052 void TransitionStackView::setModel(const std::shared_ptr<AssetParameterModel> &model, QSize frameSize, bool addSpacer)
0053 {
0054     auto *lay = new QHBoxLayout;
0055     m_trackBox = new QComboBox(this);
0056     AssetParameterView::setModel(model, frameSize, addSpacer);
0057     model->setActive(true);
0058     refreshTracks();
0059     QLabel *title = new QLabel(i18n("Composition track:"), this);
0060     lay->addWidget(title);
0061     lay->addWidget(m_trackBox);
0062     m_lay->insertLayout(0, lay);
0063     auto kfr = model->getKeyframeModel();
0064     if (kfr) {
0065         connect(kfr.get(), &KeyframeModelList::modelChanged, this, &AssetParameterView::slotRefresh);
0066     }
0067     connect(model.get(), &AssetParameterModel::compositionTrackChanged, this, &TransitionStackView::checkCompoTrack);
0068     connect(m_trackBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTrack(int)));
0069     Q_EMIT initKeyframeView(true);
0070     pCore->getMonitor(m_model->monitorId)->slotShowEffectScene(needsMonitorEffectScene());
0071     m_lay->addStretch(10);
0072 }
0073 
0074 void TransitionStackView::unsetModel()
0075 {
0076     if (m_model) {
0077         m_model->setActive(false);
0078         disconnect(m_model.get(), &AssetParameterModel::compositionTrackChanged, this, &TransitionStackView::checkCompoTrack);
0079         auto kfr = m_model->getKeyframeModel();
0080         if (kfr) {
0081             disconnect(kfr.get(), &KeyframeModelList::modelChanged, this, &AssetParameterView::slotRefresh);
0082         }
0083         pCore->getMonitor(m_model->monitorId)->slotShowEffectScene(MonitorSceneDefault);
0084         delete m_trackBox;
0085         m_trackBox = nullptr;
0086     }
0087     AssetParameterView::unsetModel();
0088 }
0089 
0090 void TransitionStackView::updateTrack(int newTrack)
0091 {
0092     Q_UNUSED(newTrack)
0093     qDebug() << "// Update transition TRACK to: " << m_trackBox->currentData().toInt();
0094     pCore->setCompositionATrack(m_model->getOwnerId().itemId, m_trackBox->currentData().toInt());
0095 }
0096 
0097 ObjectId TransitionStackView::stackOwner() const
0098 {
0099     if (m_model) {
0100         return m_model->getOwnerId();
0101     }
0102     return ObjectId();
0103 }
0104 
0105 void TransitionStackView::checkCompoTrack()
0106 {
0107     refreshTracks();
0108     bool autoTrack = pCore->compositionAutoTrack(m_model->getOwnerId().itemId);
0109     QPair<int, int> aTrack = autoTrack ? QPair<int, int>(-1, -1) : pCore->getCompositionATrack(m_model->getOwnerId().itemId);
0110     if (m_trackBox->currentData().toInt() != aTrack.first) {
0111         const QSignalBlocker blocker(m_trackBox);
0112         m_trackBox->setCurrentIndex(m_trackBox->findData(aTrack.first));
0113     }
0114 }