CuteLogger
Fast and simple logging solution for Qt based applications
multitrackmodel.h
1 /*
2  * Copyright (c) 2013-2017 Meltytech, LLC
3  * Author: Dan Dennedy <dan@dennedy.org>
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #ifndef MULTITRACKMODEL_H
20 #define MULTITRACKMODEL_H
21 
22 #include <QAbstractItemModel>
23 #include <QList>
24 #include <QString>
25 #include <MltTractor.h>
26 #include <MltPlaylist.h>
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  ResourceRole,
56  ServiceRole,
57  IsBlankRole,
58  StartRole,
59  DurationRole,
60  InPointRole,
61  OutPointRole,
62  FramerateRole,
63  IsMuteRole,
64  IsHiddenRole,
65  IsAudioRole,
66  AudioLevelsRole,
67  IsCompositeRole,
68  IsLockedRole,
69  FadeInRole,
70  FadeOutRole,
71  IsTransitionRole,
72  FileHashRole,
73  SpeedRole,
74  IsFilteredRole
75  };
76 
77  explicit MultitrackModel(QObject *parent = 0);
78  ~MultitrackModel();
79 
80  Mlt::Tractor* tractor() const { return m_tractor; }
81  const TrackList& trackList() const { return m_trackList; }
82 
83  int rowCount(const QModelIndex &parent) const;
84  int columnCount(const QModelIndex &parent) const;
85  QVariant data(const QModelIndex &index, int role) const;
86  QModelIndex index(int row, int column = 0,
87  const QModelIndex &parent = QModelIndex()) const;
88  QModelIndex makeIndex(int trackIndex, int clipIndex) const;
89  QModelIndex parent(const QModelIndex &index) const;
90  QHash<int, QByteArray> roleNames() const;
91  void audioLevelsReady(const QModelIndex &index);
92  bool createIfNeeded();
93  void addBackgroundTrack();
94  int addAudioTrack();
95  int addVideoTrack();
96  void removeTrack(int trackIndex);
97  void load();
98  Q_INVOKABLE void reload();
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 
124 public slots:
125  void refreshTrackList();
126  void setTrackName(int row, const QString &value);
127  void setTrackMute(int row, bool mute);
128  void setTrackHidden(int row, bool hidden);
129  void setTrackComposite(int row, bool composite);
130  void setTrackLock(int row, bool lock);
131  int trimClipIn(int trackIndex, int clipIndex, int delta, bool ripple);
132  void notifyClipIn(int trackIndex, int clipIndex);
133  int trimClipOut(int trackIndex, int clipIndex, int delta, bool ripple);
134  void notifyClipOut(int trackIndex, int clipIndex);
135  bool moveClipValid(int fromTrack, int toTrack, int clipIndex, int position);
136  bool moveClip(int fromTrack, int toTrack, int clipIndex, int position);
137  int overwriteClip(int trackIndex, Mlt::Producer& clip, int position, bool seek = true);
138  QString overwrite(int trackIndex, Mlt::Producer& clip, int position, bool seek = true);
139  int insertClip(int trackIndex, Mlt::Producer& clip, int position);
140  int appendClip(int trackIndex, Mlt::Producer &clip);
141  void removeClip(int trackIndex, int clipIndex);
142  void liftClip(int trackIndex, int clipIndex);
143  void splitClip(int trackIndex, int clipIndex, int position);
144  void joinClips(int trackIndex, int clipIndex);
145  void appendFromPlaylist(Mlt::Playlist* playlist, int trackIndex);
146  void overwriteFromPlaylist(Mlt::Playlist& playlist, int trackIndex, int position);
147  void fadeIn(int trackIndex, int clipIndex, int duration);
148  void fadeOut(int trackIndex, int clipIndex, int duration);
149  bool addTransitionValid(int fromTrack, int toTrack, int clipIndex, int position);
150  int addTransition(int trackIndex, int clipIndex, int position);
151  void removeTransition(int trackIndex, int clipIndex);
152  void removeTransitionByTrimIn(int trackIndex, int clipIndex, int delta);
153  void removeTransitionByTrimOut(int trackIndex, int clipIndex, int delta);
154  bool trimTransitionInValid(int trackIndex, int clipIndex, int delta);
155  void trimTransitionIn(int trackIndex, int clipIndex, int delta);
156  bool trimTransitionOutValid(int trackIndex, int clipIndex, int delta);
157  void trimTransitionOut(int trackIndex, int clipIndex, int delta);
158  bool addTransitionByTrimInValid(int trackIndex, int clipIndex, int delta);
159  void addTransitionByTrimIn(int trackIndex, int clipIndex, int delta);
160  bool addTransitionByTrimOutValid(int trackIndex, int clipIndex, int delta);
161  void addTransitionByTrimOut(int trackIndex, int clipIndex, int delta);
162  bool removeTransitionByTrimInValid(int trackIndex, int clipIndex, int delta);
163  bool removeTransitionByTrimOutValid(int trackIndex, int clipIndex, int delta);
164  void filterAddedOrRemoved(Mlt::Producer *producer);
165 
166 private:
167  Mlt::Tractor* m_tractor;
168  TrackList m_trackList;
169  bool m_isMakingTransition;
170 
171  bool moveClipToTrack(int fromTrack, int toTrack, int clipIndex, int position);
172  void moveClipToEnd(Mlt::Playlist& playlist, int trackIndex, int clipIndex, int position);
173  void relocateClip(Mlt::Playlist& playlist, int trackIndex, int clipIndex, int position);
174  void moveClipInBlank(Mlt::Playlist& playlist, int trackIndex, int clipIndex, int position);
175  void consolidateBlanks(Mlt::Playlist& playlist, int trackIndex);
176  void consolidateBlanksAllTracks();
177  void getAudioLevels();
178  void addBlackTrackIfNeeded();
179  void convertOldDoc();
180  Mlt::Transition* getTransition(const QString& name, int trackIndex) const;
181  Mlt::Filter* getFilter(const QString& name, int trackIndex) const;
182  Mlt::Filter* getFilter(const QString& name, Mlt::Service* service) const;
183  void removeBlankPlaceholder(Mlt::Playlist& playlist, int trackIndex);
184  void retainPlaylist();
185  void loadPlaylist();
186  void removeRegion(int trackIndex, int position, int length);
187  void clearMixReferences(int trackIndex, int clipIndex);
188  bool isFiltered(Mlt::Producer* producer = 0) const;
189 
190  friend class UndoHelper;
191 
192 private slots:
193  void adjustBackgroundDuration();
194 
195 };
196 
197 #endif // MULTITRACKMODEL_H