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