1 /*
2 SPDX-FileCopyrightText: 2017 Nicolas Carion
3 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
4 */
5
6 #include "transitionstackview.hpp"
7 #include "assets/keyframes/model/keyframemodellist.hpp"
8 #include "assets/model/assetparametermodel.hpp"
9 #include "core.h"
10 #include "monitor/monitor.h"
11
12 #include <QComboBox>
13 #include <QSignalBlocker>
14 #include <QDebug>
15 #include <QHBoxLayout>
16 #include <QLabel>
17 #include <klocalizedstring.h>
18
TransitionStackView(QWidget * parent)19 TransitionStackView::TransitionStackView(QWidget *parent)
20 : AssetParameterView(parent)
21 {
22 connect(this, &AssetParameterView::seekToPos, [this](int pos) {
23 // at this point, the effects returns a pos relative to the clip. We need to convert it to a global time
24 int clipIn = pCore->getItemPosition(m_model->getOwnerId());
25 emit seekToTransPos(pos + clipIn);
26 });
27 }
28
refreshTracks()29 void TransitionStackView::refreshTracks()
30 {
31 if (!m_trackBox || !m_model) {
32 return;
33 }
34 QSignalBlocker bk(m_trackBox);
35 m_trackBox->clear();
36 QPair<int, int> aTrack = pCore->getCompositionATrack(m_model->getOwnerId().second);
37 m_trackBox->addItem(i18n("Automatic"), -1);
38 QMapIterator<int, QString> i(pCore->getTrackNames(true));
39 i.toBack();
40 while (i.hasPrevious()) {
41 i.previous();
42 if (i.key() < aTrack.second) {
43 m_trackBox->addItem(i.value(), i.key());
44 }
45 }
46 m_trackBox->addItem(i18n("Background"), 0);
47 if (!pCore->compositionAutoTrack(m_model->getOwnerId().second)) {
48 m_trackBox->setCurrentIndex(m_trackBox->findData(aTrack.first));
49 }
50 }
51
setModel(const std::shared_ptr<AssetParameterModel> & model,QSize frameSize,bool addSpacer)52 void TransitionStackView::setModel(const std::shared_ptr<AssetParameterModel> &model, QSize frameSize, bool addSpacer)
53 {
54 auto *lay = new QHBoxLayout;
55 m_trackBox = new QComboBox(this);
56 AssetParameterView::setModel(model, frameSize, addSpacer);
57 model->setActive(true);
58 refreshTracks();
59 QLabel *title = new QLabel(i18n("Composition track:"), this);
60 lay->addWidget(title);
61 lay->addWidget(m_trackBox);
62 m_lay->insertLayout(0, lay);
63 auto kfr = model->getKeyframeModel();
64 if (kfr) {
65 connect(kfr.get(), &KeyframeModelList::modelChanged, this, &AssetParameterView::slotRefresh);
66 }
67 connect(model.get(), &AssetParameterModel::compositionTrackChanged, this, &TransitionStackView::checkCompoTrack);
68 connect(m_trackBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTrack(int)));
69 emit initKeyframeView(true);
70 pCore->getMonitor(m_model->monitorId)->slotShowEffectScene(needsMonitorEffectScene());
71 m_lay->addStretch(10);
72 slotRefresh();
73 }
74
unsetModel()75 void TransitionStackView::unsetModel()
76 {
77 if (m_model) {
78 m_model->setActive(false);
79 disconnect(m_model.get(), &AssetParameterModel::compositionTrackChanged, this, &TransitionStackView::checkCompoTrack);
80 auto kfr = m_model->getKeyframeModel();
81 if (kfr) {
82 disconnect(kfr.get(), &KeyframeModelList::modelChanged, this, &AssetParameterView::slotRefresh);
83 }
84 pCore->getMonitor(m_model->monitorId)->slotShowEffectScene(MonitorSceneDefault);
85 delete m_trackBox;
86 m_trackBox = nullptr;
87 }
88 AssetParameterView::unsetModel();
89 }
90
updateTrack(int newTrack)91 void TransitionStackView::updateTrack(int newTrack)
92 {
93 Q_UNUSED(newTrack)
94 qDebug() << "// Update transition TRACK to: " << m_trackBox->currentData().toInt();
95 pCore->setCompositionATrack(m_model->getOwnerId().second, m_trackBox->currentData().toInt());
96 }
97
stackOwner() const98 ObjectId TransitionStackView::stackOwner() const
99 {
100 if (m_model) {
101 return m_model->getOwnerId();
102 }
103 return ObjectId(ObjectType::NoItem, -1);
104 }
105
checkCompoTrack()106 void TransitionStackView::checkCompoTrack()
107 {
108 refreshTracks();
109 bool autoTrack = pCore->compositionAutoTrack(m_model->getOwnerId().second);
110 QPair<int, int> aTrack = autoTrack ? QPair<int, int>(-1, -1) : pCore->getCompositionATrack(m_model->getOwnerId().second);
111 if (m_trackBox->currentData().toInt() != aTrack.first) {
112 const QSignalBlocker blocker(m_trackBox);
113 m_trackBox->setCurrentIndex(m_trackBox->findData(aTrack.first));
114 }
115 }
116