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