CuteLogger
Fast and simple logging solution for Qt based applications
multitrackmodel.h
1 /*
2  * Copyright (c) 2013-2018 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 
112 signals:
113  void created();
114  void loaded();
115  void closed();
116  void modified();
117  void seeked(int position);
118  void trackHeightChanged();
119  void scaleFactorChanged();
120  void showStatusMessage(QString);
121  void durationChanged();
122  void filteredChanged();
123  void filterInChanged(int delta, Mlt::Filter*);
124  void filterOutChanged(int delta, Mlt::Filter*);
125  void reloadRequested();
126 
127 public slots:
128  void refreshTrackList();
129  void setTrackName(int row, const QString &value);
130  void setTrackMute(int row, bool mute);
131  void setTrackHidden(int row, bool hidden);
132  void setTrackComposite(int row, bool composite);
133  void setTrackLock(int row, bool lock);
134  int trimClipIn(int trackIndex, int clipIndex, int delta, bool ripple);
135  void notifyClipIn(int trackIndex, int clipIndex);
136  int trimClipOut(int trackIndex, int clipIndex, int delta, bool ripple);
137  void notifyClipOut(int trackIndex, int clipIndex);
138  bool moveClipValid(int fromTrack, int toTrack, int clipIndex, int position, bool ripple);
139  bool moveClip(int fromTrack, int toTrack, int clipIndex, int position, bool ripple);
140  int overwriteClip(int trackIndex, Mlt::Producer& clip, int position, bool seek = true);
141  QString overwrite(int trackIndex, Mlt::Producer& clip, int position, bool seek = true);
142  int insertClip(int trackIndex, Mlt::Producer& clip, int position);
143  int appendClip(int trackIndex, Mlt::Producer &clip);
144  void removeClip(int trackIndex, int clipIndex);
145  void liftClip(int trackIndex, int clipIndex);
146  void splitClip(int trackIndex, int clipIndex, int position);
147  void joinClips(int trackIndex, int clipIndex);
148  void appendFromPlaylist(Mlt::Playlist* playlist, int trackIndex);
149  void overwriteFromPlaylist(Mlt::Playlist& playlist, int trackIndex, int position);
150  void fadeIn(int trackIndex, int clipIndex, int duration);
151  void fadeOut(int trackIndex, int clipIndex, int duration);
152  bool addTransitionValid(int fromTrack, int toTrack, int clipIndex, int position);
153  int addTransition(int trackIndex, int clipIndex, int position, bool ripple);
154  void removeTransition(int trackIndex, int clipIndex);
155  void removeTransitionByTrimIn(int trackIndex, int clipIndex, int delta);
156  void removeTransitionByTrimOut(int trackIndex, int clipIndex, int delta);
157  bool trimTransitionInValid(int trackIndex, int clipIndex, int delta);
158  void trimTransitionIn(int trackIndex, int clipIndex, int delta);
159  bool trimTransitionOutValid(int trackIndex, int clipIndex, int delta);
160  void trimTransitionOut(int trackIndex, int clipIndex, int delta);
161  bool addTransitionByTrimInValid(int trackIndex, int clipIndex, int delta);
162  void addTransitionByTrimIn(int trackIndex, int clipIndex, int delta);
163  bool addTransitionByTrimOutValid(int trackIndex, int clipIndex, int delta);
164  void addTransitionByTrimOut(int trackIndex, int clipIndex, int delta);
165  bool removeTransitionByTrimInValid(int trackIndex, int clipIndex, int delta);
166  bool removeTransitionByTrimOutValid(int trackIndex, int clipIndex, int delta);
167  void filterAddedOrRemoved(Mlt::Producer *producer);
168  void onFilterChanged(Mlt::Filter* filter);
169  void reload(bool asynchronous = false);
170 
171 private:
172  Mlt::Tractor* m_tractor;
173  TrackList m_trackList;
174  bool m_isMakingTransition;
175 
176  bool moveClipToTrack(int fromTrack, int toTrack, int clipIndex, int position, bool ripple);
177  void moveClipToEnd(Mlt::Playlist& playlist, int trackIndex, int clipIndex, int position, bool ripple);
178  void relocateClip(Mlt::Playlist& playlist, int trackIndex, int clipIndex, int position, bool ripple);
179  void moveClipInBlank(Mlt::Playlist& playlist, int trackIndex, int clipIndex, int position, bool ripple, 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  void adjustClipFilters(Mlt::Producer& producer, int in, int out, int inDelta, int outDelta);
203 };
204 
205 #endif // MULTITRACKMODEL_H