18#ifndef MULTITRACKMODEL_H
19#define MULTITRACKMODEL_H
21#include <QAbstractItemModel>
24#include <MltTractor.h>
25#include <MltPlaylist.h>
29 PlaylistTrackType = 0,
42typedef QList<Track> TrackList;
44class MultitrackModel :
public QAbstractItemModel
47 Q_PROPERTY(
int trackHeight READ trackHeight WRITE setTrackHeight NOTIFY trackHeightChanged)
48 Q_PROPERTY(
double scaleFactor READ scaleFactor WRITE setScaleFactor NOTIFY scaleFactorChanged)
49 Q_PROPERTY(
bool filtered READ isFiltered NOTIFY filteredChanged)
54 NameRole = Qt::UserRole + 1,
84 explicit MultitrackModel(QObject *parent = 0);
87 Mlt::Tractor *tractor()
const
91 const TrackList &trackList()
const
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,
100 const QModelIndex &parent = QModelIndex())
const;
101 QModelIndex makeIndex(
int trackIndex,
int clipIndex)
const;
102 QModelIndex parent(
const QModelIndex &index)
const;
103 QHash<int, QByteArray> roleNames()
const;
104 Q_INVOKABLE
void audioLevelsReady(
const QPersistentModelIndex &index);
105 bool createIfNeeded();
106 void addBackgroundTrack();
109 void removeTrack(
int trackIndex);
112 int clipIndex(
int trackIndex,
int position);
113 bool trimClipInValid(
int trackIndex,
int clipIndex,
int delta,
bool ripple);
114 bool trimClipOutValid(
int trackIndex,
int clipIndex,
int delta,
bool ripple);
115 int trackHeight()
const;
116 void setTrackHeight(
int height);
117 double scaleFactor()
const;
118 void setScaleFactor(
double scale);
119 bool isTransition(Mlt::Playlist &playlist,
int clipIndex)
const;
120 void insertTrack(
int trackIndex, TrackType type = VideoTrackType);
121 void moveTrack(
int fromTrackIndex,
int toTrackIndex);
122 void insertOrAdjustBlankAt(QList<int> tracks,
int position,
int length);
123 bool mergeClipWithNext(
int trackIndex,
int clipIndex,
bool dryrun);
124 std::unique_ptr<Mlt::ClipInfo> findClipByUuid(
const QUuid &uuid,
int &trackIndex,
int &clipIndex);
125 std::unique_ptr<Mlt::ClipInfo> getClipInfo(
int trackIndex,
int clipIndex);
126 QString getTrackName(
int trackIndex);
127 int bottomVideoTrackIndex()
const;
128 int mltIndexForTrack(
int trackIndex)
const;
129 bool checkForEmptyTracks(
int trackIndex);
136 void seeked(
int position,
bool seekPlayer =
true);
137 void trackHeightChanged();
138 void scaleFactorChanged();
139 void showStatusMessage(QString);
140 void durationChanged();
141 void filteredChanged();
142 void reloadRequested();
143 void appended(
int trackIndex,
int clipIndex);
144 void inserted(
int trackIndex,
int clipIndex);
145 void overWritten(
int trackIndex,
int clipIndex);
146 void removing(Mlt::Service *service);
147 void noMoreEmptyTracks(
bool isAudio);
150 void refreshTrackList();
151 void setTrackName(
int row,
const QString &value);
152 void setTrackMute(
int row,
bool mute);
153 void setTrackHidden(
int row,
bool hidden);
154 void setTrackComposite(
int row,
bool composite);
155 void setTrackLock(
int row,
bool lock);
156 int trimClipIn(
int trackIndex,
int clipIndex,
int delta,
bool ripple,
bool rippleAllTracks);
157 void notifyClipIn(
int trackIndex,
int clipIndex);
158 int trimClipOut(
int trackIndex,
int clipIndex,
int delta,
bool ripple,
bool rippleAllTracks);
159 void notifyClipOut(
int trackIndex,
int clipIndex);
160 bool moveClip(
int fromTrack,
int toTrack,
int clipIndex,
int position,
bool ripple,
161 bool rippleAllTracks);
162 int overwriteClip(
int trackIndex, Mlt::Producer &clip,
int position,
bool seek =
true);
163 QString overwrite(
int trackIndex, Mlt::Producer &clip,
int position,
bool seek =
true,
165 int insertClip(
int trackIndex, Mlt::Producer &clip,
int position,
bool rippleAllTracks,
166 bool seek =
true,
bool notify =
true);
167 int appendClip(
int trackIndex, Mlt::Producer &clip,
bool seek =
true,
bool notify =
true);
168 void removeClip(
int trackIndex,
int clipIndex,
bool rippleAllTracks);
169 void liftClip(
int trackIndex,
int clipIndex);
170 void splitClip(
int trackIndex,
int clipIndex,
int position);
171 void joinClips(
int trackIndex,
int clipIndex);
172 void fadeIn(
int trackIndex,
int clipIndex,
int duration);
173 void fadeOut(
int trackIndex,
int clipIndex,
int duration);
174 bool addTransitionValid(
int fromTrack,
int toTrack,
int clipIndex,
int position,
bool ripple);
175 int addTransition(
int trackIndex,
int clipIndex,
int position,
bool ripple,
bool rippleAllTracks);
176 void removeTransition(
int trackIndex,
int clipIndex);
177 void removeTransitionByTrimIn(
int trackIndex,
int clipIndex,
int delta);
178 void removeTransitionByTrimOut(
int trackIndex,
int clipIndex,
int delta);
179 bool trimTransitionInValid(
int trackIndex,
int clipIndex,
int delta);
180 void trimTransitionIn(
int trackIndex,
int clipIndex,
int delta);
181 bool trimTransitionOutValid(
int trackIndex,
int clipIndex,
int delta);
182 void trimTransitionOut(
int trackIndex,
int clipIndex,
int delta);
183 bool addTransitionByTrimInValid(
int trackIndex,
int clipIndex,
int delta);
184 int addTransitionByTrimIn(
int trackIndex,
int clipIndex,
int delta);
185 bool addTransitionByTrimOutValid(
int trackIndex,
int clipIndex,
int delta);
186 void addTransitionByTrimOut(
int trackIndex,
int clipIndex,
int delta);
187 bool removeTransitionByTrimInValid(
int trackIndex,
int clipIndex,
int delta);
188 bool removeTransitionByTrimOutValid(
int trackIndex,
int clipIndex,
int delta);
189 void filterAddedOrRemoved(Mlt::Producer *producer);
190 void onFilterChanged(Mlt::Service *service);
191 void reload(
bool asynchronous =
false);
192 void replace(
int trackIndex,
int clipIndex, Mlt::Producer &clip,
bool copyFilters =
true);
195 Mlt::Tractor *m_tractor;
196 TrackList m_trackList;
197 bool m_isMakingTransition;
199 void moveClipToEnd(Mlt::Playlist &playlist,
int trackIndex,
int clipIndex,
int position,
200 bool ripple,
bool rippleAllTracks);
201 void moveClipInBlank(Mlt::Playlist &playlist,
int trackIndex,
int clipIndex,
int position,
202 bool ripple,
bool rippleAllTracks,
int duration = 0);
203 void consolidateBlanks(Mlt::Playlist &playlist,
int trackIndex);
204 void consolidateBlanksAllTracks();
205 void getAudioLevels();
206 void addBlackTrackIfNeeded();
207 void convertOldDoc();
208 Mlt::Transition *getTransition(
const QString &name,
int trackIndex)
const;
209 Mlt::Filter *getFilter(
const QString &name,
int trackIndex)
const;
210 Mlt::Filter *getFilter(
const QString &name, Mlt::Service *service)
const;
211 void removeBlankPlaceholder(Mlt::Playlist &playlist,
int trackIndex);
212 void retainPlaylist();
214 void removeRegion(
int trackIndex,
int position,
int length);
215 void clearMixReferences(
int trackIndex,
int clipIndex);
216 bool isFiltered(Mlt::Producer *producer = 0)
const;
218 void adjustServiceFilterDurations(Mlt::Service &service,
int duration);
219 bool warnIfInvalid(Mlt::Service &service);
220 Mlt::Transition *getVideoBlendTransition(
int trackIndex)
const;
221 void refreshVideoBlendTransitions();
222 int bottomVideoTrackMltIndex()
const;
223 bool hasEmptyTrack(TrackType trackType)
const;
225 friend class UndoHelper;
228 void adjustBackgroundDuration();
229 void adjustTrackFilters();