CuteLogger
Fast and simple logging solution for Qt based applications
multitrackmodel.h
1 /*
2  * Copyright (c) 2013-2022 Meltytech, LLC
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef MULTITRACKMODEL_H
19 #define MULTITRACKMODEL_H
20 
21 #include <QAbstractItemModel>
22 #include <QList>
23 #include <QString>
24 #include <MltTractor.h>
25 #include <MltPlaylist.h>
26 #include <memory>
27 
28 typedef enum {
29  PlaylistTrackType = 0,
30  BlackTrackType,
31  SilentTrackType,
32  AudioTrackType,
33  VideoTrackType
34 } TrackType;
35 
36 typedef struct {
37  TrackType type;
38  int number;
39  int mlt_index;
40 } Track;
41 
42 typedef QList<Track> TrackList;
43 
44 class MultitrackModel : public QAbstractItemModel
45 {
46  Q_OBJECT
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)
50 
51 public:
53  enum {
54  NameRole = Qt::UserRole + 1,
55  CommentRole,
56  ResourceRole,
57  ServiceRole,
58  IsBlankRole,
59  StartRole,
60  DurationRole,
61  InPointRole,
62  OutPointRole,
63  FramerateRole,
64  IsMuteRole,
65  IsHiddenRole,
66  IsAudioRole,
67  AudioLevelsRole,
68  IsCompositeRole,
69  IsLockedRole,
70  FadeInRole,
71  FadeOutRole,
72  IsTransitionRole,
73  FileHashRole,
74  SpeedRole,
75  IsFilteredRole,
76  IsTopVideoRole,
77  IsBottomVideoRole,
78  IsTopAudioRole,
79  IsBottomAudioRole,
80  AudioIndexRole
81  };
82 
83  explicit MultitrackModel(QObject *parent = 0);
84  ~MultitrackModel();
85 
86  Mlt::Tractor *tractor() const
87  {
88  return m_tractor;
89  }
90  const TrackList &trackList() const
91  {
92  return m_trackList;
93  }
94 
95  int rowCount(const QModelIndex &parent = QModelIndex()) const;
96  int columnCount(const QModelIndex &parent) const;
97  QVariant data(const QModelIndex &index, int role) const;
98  QModelIndex index(int row, int column = 0,
99  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 QModelIndex &index);
104  bool createIfNeeded();
105  void addBackgroundTrack();
106  int addAudioTrack();
107  int addVideoTrack();
108  void removeTrack(int trackIndex);
109  void load();
110  void close();
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  double scaleFactor() const;
117  void setScaleFactor(double scale);
118  bool isTransition(Mlt::Playlist &playlist, int clipIndex) const;
119  void insertTrack(int trackIndex, TrackType type = VideoTrackType);
120  void moveTrack(int fromTrackIndex, int toTrackIndex);
121  void insertOrAdjustBlankAt(QList<int> tracks, int position, int length);
122  bool mergeClipWithNext(int trackIndex, int clipIndex, bool dryrun);
123  std::unique_ptr<Mlt::ClipInfo> findClipByUuid(const QUuid &uuid, int &trackIndex, int &clipIndex);
124  std::unique_ptr<Mlt::ClipInfo> getClipInfo(int trackIndex, int clipIndex);
125  QString getTrackName(int trackIndex);
126  int bottomVideoTrackIndex() const;
127  int mltIndexForTrack(int trackIndex) const;
128 
129 signals:
130  void created();
131  void loaded();
132  void closed();
133  void modified();
134  void seeked(int position, bool seekPlayer = true);
135  void trackHeightChanged();
136  void scaleFactorChanged();
137  void showStatusMessage(QString);
138  void durationChanged();
139  void filteredChanged();
140  void reloadRequested();
141  void appended(int trackIndex, int clipIndex);
142  void inserted(int trackIndex, int clipIndex);
143  void overWritten(int trackIndex, int clipIndex);
144 
145 public slots:
146  void refreshTrackList();
147  void setTrackName(int row, const QString &value);
148  void setTrackMute(int row, bool mute);
149  void setTrackHidden(int row, bool hidden);
150  void setTrackComposite(int row, bool composite);
151  void setTrackLock(int row, bool lock);
152  int trimClipIn(int trackIndex, int clipIndex, int delta, bool ripple, bool rippleAllTracks);
153  void notifyClipIn(int trackIndex, int clipIndex);
154  int trimClipOut(int trackIndex, int clipIndex, int delta, bool ripple, bool rippleAllTracks);
155  void notifyClipOut(int trackIndex, int clipIndex);
156  bool moveClip(int fromTrack, int toTrack, int clipIndex, int position, bool ripple,
157  bool rippleAllTracks);
158  int overwriteClip(int trackIndex, Mlt::Producer &clip, int position, bool seek = true);
159  QString overwrite(int trackIndex, Mlt::Producer &clip, int position, bool seek = true,
160  bool notify = true);
161  int insertClip(int trackIndex, Mlt::Producer &clip, int position, bool rippleAllTracks,
162  bool seek = true, bool notify = true);
163  int appendClip(int trackIndex, Mlt::Producer &clip);
164  void removeClip(int trackIndex, int clipIndex, bool rippleAllTracks);
165  void liftClip(int trackIndex, int clipIndex);
166  void splitClip(int trackIndex, int clipIndex, int position);
167  void joinClips(int trackIndex, int clipIndex);
168  void fadeIn(int trackIndex, int clipIndex, int duration);
169  void fadeOut(int trackIndex, int clipIndex, int duration);
170  bool addTransitionValid(int fromTrack, int toTrack, int clipIndex, int position, bool ripple);
171  int addTransition(int trackIndex, int clipIndex, int position, bool ripple, bool rippleAllTracks);
172  void removeTransition(int trackIndex, int clipIndex);
173  void removeTransitionByTrimIn(int trackIndex, int clipIndex, int delta);
174  void removeTransitionByTrimOut(int trackIndex, int clipIndex, int delta);
175  bool trimTransitionInValid(int trackIndex, int clipIndex, int delta);
176  void trimTransitionIn(int trackIndex, int clipIndex, int delta);
177  bool trimTransitionOutValid(int trackIndex, int clipIndex, int delta);
178  void trimTransitionOut(int trackIndex, int clipIndex, int delta);
179  bool addTransitionByTrimInValid(int trackIndex, int clipIndex, int delta);
180  int addTransitionByTrimIn(int trackIndex, int clipIndex, int delta);
181  bool addTransitionByTrimOutValid(int trackIndex, int clipIndex, int delta);
182  void addTransitionByTrimOut(int trackIndex, int clipIndex, int delta);
183  bool removeTransitionByTrimInValid(int trackIndex, int clipIndex, int delta);
184  bool removeTransitionByTrimOutValid(int trackIndex, int clipIndex, int delta);
185  void filterAddedOrRemoved(Mlt::Producer *producer);
186  void onFilterChanged(Mlt::Service *service);
187  void reload(bool asynchronous = false);
188  void replace(int trackIndex, int clipIndex, Mlt::Producer &clip, bool copyFilters = true);
189 
190 private:
191  Mlt::Tractor *m_tractor;
192  TrackList m_trackList;
193  bool m_isMakingTransition;
194 
195  void moveClipToEnd(Mlt::Playlist &playlist, int trackIndex, int clipIndex, int position,
196  bool ripple, bool rippleAllTracks);
197  void moveClipInBlank(Mlt::Playlist &playlist, int trackIndex, int clipIndex, int position,
198  bool ripple, bool rippleAllTracks, int duration = 0);
199  void consolidateBlanks(Mlt::Playlist &playlist, int trackIndex);
200  void consolidateBlanksAllTracks();
201  void getAudioLevels();
202  void addBlackTrackIfNeeded();
203  void convertOldDoc();
204  Mlt::Transition *getTransition(const QString &name, int trackIndex) const;
205  Mlt::Filter *getFilter(const QString &name, int trackIndex) const;
206  Mlt::Filter *getFilter(const QString &name, Mlt::Service *service) const;
207  void removeBlankPlaceholder(Mlt::Playlist &playlist, int trackIndex);
208  void retainPlaylist();
209  void loadPlaylist();
210  void removeRegion(int trackIndex, int position, int length);
211  void clearMixReferences(int trackIndex, int clipIndex);
212  bool isFiltered(Mlt::Producer *producer = 0) const;
213  int getDuration();
214  void adjustServiceFilterDurations(Mlt::Service &service, int duration);
215  bool warnIfInvalid(Mlt::Service &service);
216  Mlt::Transition *getVideoBlendTransition(int trackIndex) const;
217  void refreshVideoBlendTransitions();
218  int bottomVideoTrackMltIndex() const;
219 
220  friend class UndoHelper;
221 
222 private slots:
223  void adjustBackgroundDuration();
224  void adjustTrackFilters();
225 };
226 
227 #endif // MULTITRACKMODEL_H