CuteLogger
Fast and simple logging solution for Qt based applications
multitrackmodel.h
1 /*
2  * Copyright (c) 2013-2020 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 
27 typedef enum {
28  PlaylistTrackType = 0,
29  BlackTrackType,
30  SilentTrackType,
31  AudioTrackType,
32  VideoTrackType
33 } TrackType;
34 
35 typedef struct {
36  TrackType type;
37  int number;
38  int mlt_index;
39 } Track;
40 
41 typedef QList<Track> TrackList;
42 
43 class MultitrackModel : public QAbstractItemModel
44 {
45  Q_OBJECT
46  Q_PROPERTY(int trackHeight READ trackHeight WRITE setTrackHeight NOTIFY trackHeightChanged)
47  Q_PROPERTY(double scaleFactor READ scaleFactor WRITE setScaleFactor NOTIFY scaleFactorChanged)
48  Q_PROPERTY(bool filtered READ isFiltered NOTIFY filteredChanged)
49 
50 public:
52  enum {
53  NameRole = Qt::UserRole + 1,
54  ResourceRole,
55  ServiceRole,
56  IsBlankRole,
57  StartRole,
58  DurationRole,
59  InPointRole,
60  OutPointRole,
61  FramerateRole,
62  IsMuteRole,
63  IsHiddenRole,
64  IsAudioRole,
65  AudioLevelsRole,
66  IsCompositeRole,
67  IsLockedRole,
68  FadeInRole,
69  FadeOutRole,
70  IsTransitionRole,
71  FileHashRole,
72  SpeedRole,
73  IsFilteredRole,
74  IsBottomVideoRole,
75  AudioIndexRole
76  };
77 
78  explicit MultitrackModel(QObject *parent = 0);
79  ~MultitrackModel();
80 
81  Mlt::Tractor* tractor() const { return m_tractor; }
82  const TrackList& trackList() const { return m_trackList; }
83 
84  int rowCount(const QModelIndex &parent = QModelIndex()) const;
85  int columnCount(const QModelIndex &parent) const;
86  QVariant data(const QModelIndex &index, int role) const;
87  QModelIndex index(int row, int column = 0,
88  const QModelIndex &parent = QModelIndex()) const;
89  QModelIndex makeIndex(int trackIndex, int clipIndex) const;
90  QModelIndex parent(const QModelIndex &index) const;
91  QHash<int, QByteArray> roleNames() const;
92  Q_INVOKABLE void audioLevelsReady(const QModelIndex &index);
93  bool createIfNeeded();
94  void addBackgroundTrack();
95  int addAudioTrack();
96  int addVideoTrack();
97  void removeTrack(int trackIndex);
98  void load();
99  void close();
100  int clipIndex(int trackIndex, int position);
101  bool trimClipInValid(int trackIndex, int clipIndex, int delta, bool ripple);
102  bool trimClipOutValid(int trackIndex, int clipIndex, int delta, bool ripple);
103  int trackHeight() const;
104  void setTrackHeight(int height);
105  double scaleFactor() const;
106  void setScaleFactor(double scale);
107  bool isTransition(Mlt::Playlist& playlist, int clipIndex) const;
108  void insertTrack(int trackIndex, TrackType type = VideoTrackType);
109  void insertOrAdjustBlankAt(QList<int> tracks, int position, int length);
110  bool mergeClipWithNext(int trackIndex, int clipIndex, bool dryrun);
111  void adjustClipFilters(Mlt::Producer& producer, int in, int out, int inDelta, int outDelta);
112  Mlt::ClipInfo *findClipByUuid(const QUuid& uuid, int& trackIndex, int& clipIndex);
113 
114 signals:
115  void created();
116  void loaded();
117  void closed();
118  void modified();
119  void seeked(int position, bool seekPlayer = true);
120  void trackHeightChanged();
121  void scaleFactorChanged();
122  void showStatusMessage(QString);
123  void durationChanged();
124  void filteredChanged();
125  void filterInChanged(int delta, Mlt::Filter*);
126  void filterOutChanged(int delta, Mlt::Filter*);
127  void reloadRequested();
128  void inserted(int trackIndex, int clipIndex);
129  void overWritten(int trackIndex, int clipIndex);
130 
131 public slots:
132  void refreshTrackList();
133  void setTrackName(int row, const QString &value);
134  void setTrackMute(int row, bool mute);
135  void setTrackHidden(int row, bool hidden);
136  void setTrackComposite(int row, bool composite);
137  void setTrackLock(int row, bool lock);
138  int trimClipIn(int trackIndex, int clipIndex, int delta, bool ripple, bool rippleAllTracks);
139  void notifyClipIn(int trackIndex, int clipIndex);
140  int trimClipOut(int trackIndex, int clipIndex, int delta, bool ripple, bool rippleAllTracks);
141  void notifyClipOut(int trackIndex, int clipIndex);
142  bool moveClip(int fromTrack, int toTrack, int clipIndex, int position, bool ripple, bool rippleAllTracks);
143  int overwriteClip(int trackIndex, Mlt::Producer& clip, int position, bool seek = true);
144  QString overwrite(int trackIndex, Mlt::Producer& clip, int position, bool seek = true);
145  int insertClip(int trackIndex, Mlt::Producer& clip, int position, bool rippleAllTracks, bool seek = true);
146  int appendClip(int trackIndex, Mlt::Producer &clip);
147  void removeClip(int trackIndex, int clipIndex, bool rippleAllTracks);
148  void liftClip(int trackIndex, int clipIndex);
149  void splitClip(int trackIndex, int clipIndex, int position);
150  void joinClips(int trackIndex, int clipIndex);
151  void fadeIn(int trackIndex, int clipIndex, int duration);
152  void fadeOut(int trackIndex, int clipIndex, int duration);
153  bool addTransitionValid(int fromTrack, int toTrack, int clipIndex, int position, bool ripple);
154  int addTransition(int trackIndex, int clipIndex, int position, bool ripple, bool rippleAllTracks);
155  void removeTransition(int trackIndex, int clipIndex);
156  void removeTransitionByTrimIn(int trackIndex, int clipIndex, int delta);
157  void removeTransitionByTrimOut(int trackIndex, int clipIndex, int delta);
158  bool trimTransitionInValid(int trackIndex, int clipIndex, int delta);
159  void trimTransitionIn(int trackIndex, int clipIndex, int delta);
160  bool trimTransitionOutValid(int trackIndex, int clipIndex, int delta);
161  void trimTransitionOut(int trackIndex, int clipIndex, int delta);
162  bool addTransitionByTrimInValid(int trackIndex, int clipIndex, int delta);
163  void addTransitionByTrimIn(int trackIndex, int clipIndex, int delta);
164  bool addTransitionByTrimOutValid(int trackIndex, int clipIndex, int delta);
165  void addTransitionByTrimOut(int trackIndex, int clipIndex, int delta);
166  bool removeTransitionByTrimInValid(int trackIndex, int clipIndex, int delta);
167  bool removeTransitionByTrimOutValid(int trackIndex, int clipIndex, int delta);
168  void filterAddedOrRemoved(Mlt::Producer *producer);
169  void onFilterChanged(Mlt::Filter* filter);
170  void reload(bool asynchronous = false);
171  void replace(int trackIndex, int clipIndex, Mlt::Producer& clip, bool copyFilters = true);
172 
173 private:
174  Mlt::Tractor* m_tractor;
175  TrackList m_trackList;
176  bool m_isMakingTransition;
177 
178  void moveClipToEnd(Mlt::Playlist& playlist, int trackIndex, int clipIndex, int position, bool ripple, bool rippleAllTracks);
179  void moveClipInBlank(Mlt::Playlist& playlist, int trackIndex, int clipIndex, int position, bool ripple, bool rippleAllTracks, int duration = 0);
180  void consolidateBlanks(Mlt::Playlist& playlist, int trackIndex);
181  void consolidateBlanksAllTracks();
182  void getAudioLevels();
183  void addBlackTrackIfNeeded();
184  void convertOldDoc();
185  Mlt::Transition* getTransition(const QString& name, int trackIndex) const;
186  Mlt::Filter* getFilter(const QString& name, int trackIndex) const;
187  Mlt::Filter* getFilter(const QString& name, Mlt::Service* service) const;
188  void removeBlankPlaceholder(Mlt::Playlist& playlist, int trackIndex);
189  void retainPlaylist();
190  void loadPlaylist();
191  void removeRegion(int trackIndex, int position, int length);
192  void clearMixReferences(int trackIndex, int clipIndex);
193  bool isFiltered(Mlt::Producer* producer = 0) const;
194  int getDuration();
195  void adjustServiceFilterDurations(Mlt::Service& service, int duration);
196 
197  friend class UndoHelper;
198 
199 private slots:
200  void adjustBackgroundDuration();
201  void adjustTrackFilters();
202 };
203 
204 #endif // MULTITRACKMODEL_H