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 }