18 #ifndef TIMELINEDOCK_H
19 #define TIMELINEDOCK_H
21 #include <QDockWidget>
22 #include <QQuickWidget>
23 #include <QApplication>
26 #include "models/markersmodel.h"
27 #include "models/multitrackmodel.h"
28 #include "sharedframe.h"
29 #include "jobs/ffmpegjob.h"
38 class TimelineDock :
public QDockWidget
41 Q_PROPERTY(
int position READ position WRITE setPosition NOTIFY positionChanged)
42 Q_PROPERTY(
int currentTrack READ currentTrack WRITE setCurrentTrack NOTIFY currentTrackChanged)
43 Q_PROPERTY(QVariantList selection READ selectionForJS WRITE setSelectionFromJS NOTIFY
45 Q_PROPERTY(
bool isRecording READ isRecording NOTIFY isRecordingChanged)
48 explicit TimelineDock(QWidget *parent = 0);
56 MultitrackModel *model()
60 MarkersModel *markersModel()
62 return & m_markersModel;
68 void setPosition(
int position);
69 Mlt::Producer producerForClip(
int trackIndex,
int clipIndex);
70 int clipIndexAtPlayhead(
int trackIndex = -1);
71 int clipIndexAtPosition(
int trackIndex,
int position);
72 void chooseClipAtPosition(
int position,
int &trackIndex,
int &clipIndex);
73 void setCurrentTrack(
int currentTrack);
74 int currentTrack()
const;
75 int clipCount(
int trackIndex)
const;
76 void setSelectionFromJS(
const QVariantList &list);
77 void setSelection(QList<QPoint> selection = QList<QPoint>(),
int trackIndex = -1,
78 bool isMultitrack =
false);
79 QVariantList selectionForJS()
const;
80 const QList<QPoint> selection()
const;
81 const QVector<QUuid> selectionUuids();
82 void saveAndClearSelection();
83 Q_INVOKABLE
void restoreSelection();
84 void selectClipUnderPlayhead();
85 int centerOfClip(
int trackIndex,
int clipIndex);
86 bool isTrackLocked(
int trackIndex)
const;
87 void trimClipAtPlayhead(TrimLocation location,
bool ripple);
88 Q_INVOKABLE
bool isMultitrackSelected()
const
90 return m_selection.isMultitrackSelected;
92 Q_INVOKABLE
int selectedTrack()
const
94 return m_selection.selectedTrack;
96 Q_INVOKABLE
bool isFloating()
const
98 return QDockWidget::isFloating();
100 Q_INVOKABLE
static void openProperties();
101 void emitSelectedChanged(
const QVector<int> &roles);
102 void replaceClipsWithHash(
const QString &hash, Mlt::Producer &producer);
103 Q_INVOKABLE
void recordAudio();
104 Q_INVOKABLE
void stopRecording();
105 bool isRecording()
const
107 return m_isRecording;
111 void currentTrackChanged();
112 void selectionChanged();
113 void seeked(
int position);
114 void positionChanged();
115 void clipOpened(Mlt::Producer *producer);
116 void dragging(
const QPointF &pos,
int duration);
118 void dropAccepted(
const QString &xml);
119 void fadeInChanged(
int duration);
120 void fadeOutChanged(
int duration);
121 void selected(Mlt::Producer *producer);
123 void showStatusMessage(QString);
125 void clipMoved(
int fromTrack,
int toTrack,
int clipIndex,
int position,
bool ripple);
126 void filteredClicked();
127 void durationChanged();
128 void transitionAdded(
int trackIndex,
int clipIndex,
int position,
bool ripple);
132 void setZoom(
double value);
133 void markerRangesChanged();
134 void markerSeeked(
int markerIndex);
135 void isRecordingChanged(
bool);
136 void multitrackSelected();
137 void warnTrackLocked(
int trackIndex);
138 void refreshWaveforms();
139 void updateThumbnails(
int trackIndex,
int clipIndex);
142 void addAudioTrack();
143 void addVideoTrack();
144 void alignSelectedClips();
146 void onSeeked(
int position);
147 void append(
int trackIndex);
148 void remove(
int trackIndex,
int clipIndex);
149 bool mergeClipWithNext(
int trackIndex,
int clipIndex,
bool dryrun);
150 void lift(
int trackIndex,
int clipIndex);
151 void removeSelection(
bool withCopy =
false);
152 void liftSelection();
153 void incrementCurrentTrack(
int by);
154 void selectTrackHead(
int trackIndex);
155 void selectMultitrack();
156 void copy(
int trackIndex,
int clipIndex);
157 void setTrackName(
int trackIndex,
const QString &value);
158 void toggleTrackMute(
int trackIndex);
159 void toggleTrackHidden(
int trackIndex);
160 void setTrackComposite(
int trackIndex,
bool composite);
161 void setTrackLock(
int trackIndex,
bool lock);
162 bool moveClip(
int fromTrack,
int toTrack,
int clipIndex,
int position,
bool ripple);
163 void onClipMoved(
int fromTrack,
int toTrack,
int clipIndex,
int position,
bool ripple);
164 bool trimClipIn(
int trackIndex,
int clipIndex,
int oldClipIndex,
int delta,
bool ripple);
165 bool trimClipOut(
int trackIndex,
int clipIndex,
int delta,
bool ripple);
166 void insert(
int trackIndex,
int position = -1,
const QString &xml = QString(),
bool seek =
true);
167 void overwrite(
int trackIndex,
int position = -1,
const QString &xml = QString(),
bool seek =
true);
168 void appendFromPlaylist(Mlt::Playlist *playlist,
bool skipProxy);
169 void splitClip(
int trackIndex = -1,
int clipIndex = -1);
170 void fadeIn(
int trackIndex,
int clipIndex = -1,
int duration = -1);
171 void fadeOut(
int trackIndex,
int clipIndex = -1,
int duration = -1);
172 void seekPreviousEdit();
174 void seekInPoint(
int clipIndex);
175 void clearSelectionIfInvalid();
177 void insertAudioTrack();
178 void insertVideoTrack();
180 void moveTrack(
int fromTrackIndex,
int toTrackIndex);
182 void moveTrackDown();
183 void onProducerChanged(Mlt::Producer *);
184 void emitSelectedFromSelection();
185 void remakeAudioLevels(
int trackIndex,
int clipIndex,
bool force =
true);
186 void commitTrimCommand();
187 void onRowsInserted(
const QModelIndex &parent,
int first,
int last);
188 void onRowsRemoved(
const QModelIndex &parent,
int first,
int last);
189 void onRowsMoved(
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
191 void detachAudio(
int trackIndex,
int clipIndex);
193 void selectAllOnCurrentTrack();
194 bool blockSelection(
bool block);
195 void onProducerModified();
196 void replace(
int trackIndex,
int clipIndex,
const QString &xml = QString());
197 void createOrEditMarker();
198 void createOrEditSelectionMarker();
200 void editMarker(
int markerIndex);
201 void deleteMarker(
int markerIndex = -1);
202 void seekNextMarker();
203 void seekPrevMarker();
204 void onFilterModelChanged();
205 void trimClipIn(
bool ripple =
false);
206 void trimClipOut(
bool ripple =
false);
209 void dragEnterEvent(QDragEnterEvent *event);
210 void dragMoveEvent(QDragMoveEvent *event);
211 void dragLeaveEvent(QDragLeaveEvent *event);
212 void dropEvent(QDropEvent *event);
213 bool event(QEvent *event);
214 void keyPressEvent(QKeyEvent *event);
215 void keyReleaseEvent(QKeyEvent *event);
218 bool isBlank(
int trackIndex,
int clipIndex);
219 bool clipsAreSelected();
220 bool blankIsSelected();
221 bool isTransition(
int trackIndex,
int clipIndex);
222 void emitNonSeekableWarning();
223 void addTrackIfNeeded(
int mltTrackIndex, Mlt::Producer *srcTrack);
225 bool isMultitrackValid()
227 return m_model.tractor() && !m_model.trackList().empty();
230 QQuickWidget m_quickView;
231 MultitrackModel m_model;
232 MarkersModel m_markersModel;
234 QScopedPointer<Timeline::UpdateCommand> m_updateCommand;
235 bool m_ignoreNextPositionChange;
237 QList<QPoint> selectedClips;
239 bool isMultitrackSelected;
241 Selection m_selection;
242 int m_savedSelectedTrack;
243 bool m_savedIsMultitrackSelected;
244 QVector<QUuid> m_savedSelectionUuids;
245 QScopedPointer<Timeline::TrimCommand> m_trimCommand;
246 QScopedPointer<UndoHelper> m_undoHelper;
248 int m_transitionDelta;
249 bool m_blockSetSelection;
250 bool m_isRecording {
false};
251 QScopedPointer<AbstractJob> m_recordJob;
252 QTimer m_recordingTimer;
253 QDateTime m_recordingTime;
254 int m_recordingTrackIndex;
255 int m_recordingClipIndex;
256 int m_currentTrack {0};
261 void load(
bool force =
false);
262 void onTopLevelChanged(
bool floating);
263 void onTransitionAdded(
int trackIndex,
int clipIndex,
int position,
bool ripple);
264 void selectClip(
int trackIndex,
int clipIndex);
265 void onMultitrackClosed();
266 void reloadTimelineMarkers();
267 void onRecordStarted();
268 void updateRecording();
269 void onRecordFinished(AbstractJob *,
bool);
270 void onWarnTrackLocked();
271 void onTimelineRightClicked();
272 void onClipRightClicked();
275 class TimelineSelectionBlocker
278 TimelineSelectionBlocker(TimelineDock &timeline)
279 : m_timelineDock(timeline)
281 m_timelineDock.blockSelection(
true);
283 ~TimelineSelectionBlocker()
285 QCoreApplication::processEvents();
286 m_timelineDock.blockSelection(
false);
290 TimelineDock &m_timelineDock;
The SharedFrame provides thread safe access to Mlt::Frame data.
Definition: sharedframe.h:49