18#ifndef MULTITRACKMODEL_H
19#define MULTITRACKMODEL_H
21#include <MltPlaylist.h>
22#include <MltTractor.h>
23#include <QAbstractItemModel>
30 PlaylistTrackType = 0,
44typedef QList<Track> TrackList;
46class MultitrackModel :
public QAbstractItemModel
49 Q_PROPERTY(
int trackHeight READ trackHeight WRITE setTrackHeight NOTIFY trackHeightChanged)
50 Q_PROPERTY(
int trackHeaderWidth READ trackHeaderWidth WRITE setTrackHeaderWidth NOTIFY
51 trackHeaderWidthChanged FINAL)
52 Q_PROPERTY(
double scaleFactor READ scaleFactor WRITE setScaleFactor NOTIFY scaleFactorChanged)
53 Q_PROPERTY(
bool filtered READ isFiltered NOTIFY filteredChanged)
58 NameRole = Qt::UserRole + 1,
90 explicit MultitrackModel(QObject *parent = 0);
93 Mlt::Tractor *tractor()
const {
return m_tractor; }
94 const TrackList &trackList()
const {
return m_trackList; }
96 int rowCount(
const QModelIndex &parent = QModelIndex())
const;
97 int columnCount(
const QModelIndex &parent)
const;
98 QVariant data(
const QModelIndex &index,
int role)
const;
99 QModelIndex index(
int row,
int column = 0,
const QModelIndex &parent = QModelIndex())
const;
100 QModelIndex makeIndex(
int trackIndex,
int clipIndex)
const;
101 QModelIndex parent(
const QModelIndex &index)
const;
102 QHash<int, QByteArray> roleNames()
const;
103 Q_INVOKABLE
void audioLevelsReady(
const QPersistentModelIndex &index);
104 bool createIfNeeded();
105 void addBackgroundTrack();
108 void removeTrack(
int trackIndex);
111 int clipIndex(
int trackIndex,
int position);
112 bool trimClipInValid(
int trackIndex,
int clipIndex,
int delta,
bool ripple);
113 bool trimClipOutValid(
int trackIndex,
int clipIndex,
int delta,
bool ripple);
114 int trackHeight()
const;
115 void setTrackHeight(
int height);
116 int trackHeaderWidth()
const;
117 void setTrackHeaderWidth(
int width);
118 double scaleFactor()
const;
119 void setScaleFactor(
double scale);
120 bool isTransition(Mlt::Playlist &playlist,
int clipIndex)
const;
121 void insertTrack(
int trackIndex, TrackType type = VideoTrackType);
122 void moveTrack(
int fromTrackIndex,
int toTrackIndex);
123 void insertOrAdjustBlankAt(QList<int> tracks,
int position,
int length);
124 bool mergeClipWithNext(
int trackIndex,
int clipIndex,
bool dryrun);
125 std::unique_ptr<Mlt::ClipInfo> findClipByUuid(
const QUuid &uuid,
128 std::unique_ptr<Mlt::ClipInfo> getClipInfo(
int trackIndex,
int clipIndex);
129 QString getTrackName(
int trackIndex);
130 int bottomVideoTrackIndex()
const;
131 int mltIndexForTrack(
int trackIndex)
const;
132 bool checkForEmptyTracks(
int trackIndex);
139 void seeked(
int position,
bool seekPlayer =
true);
140 void trackHeightChanged();
141 void trackHeaderWidthChanged();
142 void scaleFactorChanged();
143 void showStatusMessage(QString);
144 void durationChanged();
145 void filteredChanged();
146 void reloadRequested();
147 void appended(
int trackIndex,
int clipIndex);
148 void inserted(
int trackIndex,
int clipIndex);
149 void overWritten(
int trackIndex,
int clipIndex);
150 void removing(Mlt::Service *service);
151 void noMoreEmptyTracks(
bool isAudio);
154 void refreshTrackList();
155 void setTrackName(
int row,
const QString &value);
156 void setTrackMute(
int row,
bool mute);
157 void setTrackHidden(
int row,
bool hidden);
158 void setTrackComposite(
int row,
bool composite);
159 void setTrackLock(
int row,
bool lock);
160 int trimClipIn(
int trackIndex,
int clipIndex,
int delta,
bool ripple,
bool rippleAllTracks);
161 void notifyClipIn(
int trackIndex,
int clipIndex);
162 int trimClipOut(
int trackIndex,
int clipIndex,
int delta,
bool ripple,
bool rippleAllTracks);
163 void notifyClipOut(
int trackIndex,
int clipIndex);
165 int fromTrack,
int toTrack,
int clipIndex,
int position,
bool ripple,
bool rippleAllTracks);
166 int overwriteClip(
int trackIndex, Mlt::Producer &clip,
int position,
bool seek =
true);
168 int trackIndex, Mlt::Producer &clip,
int position,
bool seek =
true,
bool notify =
true);
169 int insertClip(
int trackIndex,
172 bool rippleAllTracks,
175 int appendClip(
int trackIndex, Mlt::Producer &clip,
bool seek =
true,
bool notify =
true);
176 void removeClip(
int trackIndex,
int clipIndex,
bool rippleAllTracks);
177 void liftClip(
int trackIndex,
int clipIndex);
178 void splitClip(
int trackIndex,
int clipIndex,
int position);
179 void joinClips(
int trackIndex,
int clipIndex);
180 void changeGain(
int trackIndex,
int clipIndex,
double gain);
181 void fadeIn(
int trackIndex,
int clipIndex,
int duration);
182 void fadeOut(
int trackIndex,
int clipIndex,
int duration);
183 bool addTransitionValid(
int fromTrack,
int toTrack,
int clipIndex,
int position,
bool ripple);
184 int addTransition(
int trackIndex,
int clipIndex,
int position,
bool ripple,
bool rippleAllTracks);
185 void removeTransition(
int trackIndex,
int clipIndex);
186 void removeTransitionByTrimIn(
int trackIndex,
int clipIndex,
int delta);
187 void removeTransitionByTrimOut(
int trackIndex,
int clipIndex,
int delta);
188 bool trimTransitionInValid(
int trackIndex,
int clipIndex,
int delta);
189 void trimTransitionIn(
int trackIndex,
int clipIndex,
int delta,
bool slip =
false);
190 bool trimTransitionOutValid(
int trackIndex,
int clipIndex,
int delta);
191 void trimTransitionOut(
int trackIndex,
int clipIndex,
int delta,
bool slip =
false);
192 bool addTransitionByTrimInValid(
int trackIndex,
int clipIndex,
int delta);
193 int addTransitionByTrimIn(
int trackIndex,
int clipIndex,
int delta);
194 bool addTransitionByTrimOutValid(
int trackIndex,
int clipIndex,
int delta);
195 void addTransitionByTrimOut(
int trackIndex,
int clipIndex,
int delta);
196 bool removeTransitionByTrimInValid(
int trackIndex,
int clipIndex,
int delta);
197 bool removeTransitionByTrimOutValid(
int trackIndex,
int clipIndex,
int delta);
198 void filterAddedOrRemoved(Mlt::Producer *producer);
199 void onFilterChanged(Mlt::Service *service);
200 void reload(
bool asynchronous =
false);
201 void replace(
int trackIndex,
int clipIndex, Mlt::Producer &clip,
bool copyFilters =
true);
204 Mlt::Tractor *m_tractor;
205 TrackList m_trackList;
206 bool m_isMakingTransition;
208 void moveClipToEnd(Mlt::Playlist &playlist,
213 bool rippleAllTracks);
214 void moveClipInBlank(Mlt::Playlist &playlist,
219 bool rippleAllTracks,
221 void consolidateBlanks(Mlt::Playlist &playlist,
int trackIndex);
222 void consolidateBlanksAllTracks();
223 void getAudioLevels();
224 void addBlackTrackIfNeeded();
225 void convertOldDoc();
226 Mlt::Transition *getTransition(
const QString &name,
int trackIndex)
const;
227 Mlt::Filter *getFilter(
const QString &name,
int trackIndex)
const;
228 Mlt::Filter *getFilter(
const QString &name, Mlt::Service *service)
const;
229 void removeBlankPlaceholder(Mlt::Playlist &playlist,
int trackIndex);
230 void retainPlaylist();
232 void removeRegion(
int trackIndex,
int position,
int length);
233 void clearMixReferences(
int trackIndex,
int clipIndex);
234 bool isFiltered(Mlt::Producer *producer = 0)
const;
236 void adjustServiceFilterDurations(Mlt::Service &service,
int duration);
237 bool warnIfInvalid(Mlt::Service &service);
238 Mlt::Transition *getVideoBlendTransition(
int trackIndex)
const;
239 void refreshVideoBlendTransitions();
240 int bottomVideoTrackMltIndex()
const;
241 bool hasEmptyTrack(TrackType trackType)
const;
243 friend class UndoHelper;
246 void adjustBackgroundDuration();
247 void adjustTrackFilters();