CuteLogger
Fast and simple logging solution for Qt based applications
timelinedock.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 TIMELINEDOCK_H
19 #define TIMELINEDOCK_H
20 
21 #include <QDockWidget>
22 #include <QQuickWidget>
23 #include <QApplication>
24 #include "models/multitrackmodel.h"
25 #include "sharedframe.h"
26 
27 namespace Ui {
28 class TimelineDock;
29 }
30 namespace Timeline {
31 class UpdateCommand;
32 class TrimCommand;
33 }
34 class UndoHelper;
35 
36 class TimelineDock : public QDockWidget
37 {
38  Q_OBJECT
39  Q_PROPERTY(int position READ position WRITE setPosition NOTIFY positionChanged)
40  Q_PROPERTY(int currentTrack READ currentTrack WRITE setCurrentTrack NOTIFY currentTrackChanged)
41  Q_PROPERTY(QVariantList selection READ selectionForJS WRITE setSelectionFromJS NOTIFY selectionChanged)
42 
43 public:
44  explicit TimelineDock(QWidget *parent = 0);
45  ~TimelineDock();
46 
47  enum TrimLocation {
48  TrimInPoint,
49  TrimOutPoint
50  };
51 
52  MultitrackModel* model() { return &m_model; }
53  int position() const { return m_position; }
54  void setPosition(int position);
55  Mlt::ClipInfo* getClipInfo(int trackIndex, int clipIndex);
56  Mlt::Producer producerForClip(int trackIndex, int clipIndex);
57  int clipIndexAtPlayhead(int trackIndex = -1);
58  int clipIndexAtPosition(int trackIndex, int position);
59  void chooseClipAtPosition(int position, int& trackIndex, int& clipIndex);
60  void setCurrentTrack(int currentTrack);
61  int currentTrack() const;
62  int clipCount(int trackIndex) const;
63  void zoomIn();
64  void zoomOut();
65  void resetZoom();
66  void makeTracksShorter();
67  void makeTracksTaller();
68  void setSelectionFromJS(const QVariantList& list);
69  void setSelection(QList<QPoint> selection = QList<QPoint>(), int trackIndex = -1, bool isMultitrack = false);
70  QVariantList selectionForJS() const;
71  QList<QPoint> selection() const;
72  QVector<QUuid> selectionUuids();
73  void saveAndClearSelection();
74  void restoreSelection();
75  void selectClipUnderPlayhead();
76  int centerOfClip(int trackIndex, int clipIndex);
77  bool isTrackLocked(int trackIndex) const;
78  void trimClipAtPlayhead(TrimLocation location, bool ripple);
79  bool isRipple() const;
80  Q_INVOKABLE bool isMultitrackSelected() const { return m_selection.isMultitrackSelected; }
81  Q_INVOKABLE int selectedTrack() const { return m_selection.selectedTrack; }
82  Q_INVOKABLE bool isFloating() const { return QDockWidget::isFloating(); }
83  Q_INVOKABLE void copyToSource();
84  Q_INVOKABLE static void openProperties();
85  void emitSelectedChanged(const QVector<int> &roles);
86  void replaceClipsWithHash(const QString& hash, Mlt::Producer& producer);
87 
88 signals:
89  void currentTrackChanged();
90  void selectionChanged();
91  void seeked(int position);
92  void positionChanged();
93  void clipOpened(Mlt::Producer* producer);
94  void dragging(const QPointF& pos, int duration);
95  void dropped();
96  void dropAccepted(const QString &xml);
97  void fadeInChanged(int duration);
98  void fadeOutChanged(int duration);
99  void selected(Mlt::Producer* producer);
100  void clipClicked();
101  void showStatusMessage(QString);
102  void clipCopied();
103  void clipMoved(int fromTrack, int toTrack, int clipIndex, int position, bool ripple);
104  void filteredClicked();
105  void durationChanged();
106  void transitionAdded(int trackIndex, int clipIndex, int position, bool ripple);
107 
108 public slots:
109  void addAudioTrack();
110  void addVideoTrack();
111  void onShowFrame(const SharedFrame& frame);
112  void onSeeked(int position);
113  void append(int trackIndex);
114  void remove(int trackIndex, int clipIndex);
115  bool mergeClipWithNext(int trackIndex, int clipIndex, bool dryrun);
116  void lift(int trackIndex, int clipIndex);
117  void removeSelection(bool withCopy = false);
118  void liftSelection();
119  void selectTrack(int by);
120  void selectTrackHead(int trackIndex);
121  void selectMultitrack();
122  void copyClip(int trackIndex, int clipIndex);
123  void setTrackName(int trackIndex, const QString& value);
124  void toggleTrackMute(int trackIndex);
125  void toggleTrackHidden(int trackIndex);
126  void setTrackComposite(int trackIndex, bool composite);
127  void setTrackLock(int trackIndex, bool lock);
128  bool moveClip(int fromTrack, int toTrack, int clipIndex, int position, bool ripple);
129  void onClipMoved(int fromTrack, int toTrack, int clipIndex, int position, bool ripple);
130  bool trimClipIn(int trackIndex, int clipIndex, int oldClipIndex, int delta, bool ripple);
131  bool trimClipOut(int trackIndex, int clipIndex, int delta, bool ripple);
132  void insert(int trackIndex, int position = -1, const QString &xml = QString(), bool seek = true);
133  void overwrite(int trackIndex, int position = -1, const QString &xml = QString(), bool seek = true);
134  void appendFromPlaylist(Mlt::Playlist* playlist);
135  void splitClip(int trackIndex = -1, int clipIndex = -1);
136  void fadeIn(int trackIndex, int clipIndex = -1, int duration = -1);
137  void fadeOut(int trackIndex, int clipIndex = -1, int duration = -1);
138  void seekPreviousEdit();
139  void seekNextEdit();
140  void seekInPoint(int clipIndex);
141  void clearSelectionIfInvalid();
142  void insertTrack();
143  void removeTrack();
144  void onProducerChanged(Mlt::Producer*);
145  void emitSelectedFromSelection();
146  void remakeAudioLevels(int trackIndex, int clipIndex, bool force = true);
147  void commitTrimCommand();
148  void onRowsInserted(const QModelIndex& parent, int first, int last);
149  void onRowsRemoved(const QModelIndex& parent, int first, int last);
150  void detachAudio(int trackIndex, int clipIndex);
151  void selectAll();
152  bool blockSelection(bool block);
153  void onProducerModified();
154  void replace(int trackIndex, int clipIndex, const QString& xml = QString());
155 
156 protected:
157  void dragEnterEvent(QDragEnterEvent* event);
158  void dragMoveEvent(QDragMoveEvent* event);
159  void dragLeaveEvent(QDragLeaveEvent* event);
160  void dropEvent(QDropEvent* event);
161  bool event(QEvent *event);
162  void keyPressEvent(QKeyEvent* event);
163  void keyReleaseEvent(QKeyEvent* event);
164 
165 private:
166  bool isBlank(int trackIndex, int clipIndex);
167  void pulseLockButtonOnTrack(int trackIndex);
168 
169  Ui::TimelineDock *ui;
170  QQuickWidget m_quickView;
171  MultitrackModel m_model;
172  int m_position;
173  QScopedPointer<Timeline::UpdateCommand> m_updateCommand;
174  bool m_ignoreNextPositionChange;
175  struct Selection {
176  QList<QPoint> selectedClips; // x is the clip index, y is the track index
177  int selectedTrack;
178  bool isMultitrackSelected;
179  };
180  Selection m_selection;
181  Selection m_savedSelection;
182  QScopedPointer<Timeline::TrimCommand> m_trimCommand;
183  QScopedPointer<UndoHelper> m_undoHelper;
184  int m_trimDelta;
185  int m_transitionDelta;
186  bool m_blockSetSelection;
187 
188 private slots:
189  void load(bool force = false);
190  void onTopLevelChanged(bool floating);
191  void onTransitionAdded(int trackIndex, int clipIndex, int position, bool ripple);
192  void onInserted(int trackIndex, int clipIndex);
193  void onOverWritten(int trackIndex, int clipIndex);
194 };
195 
196 class TimelineSelectionBlocker
197 {
198 public:
199  TimelineSelectionBlocker(TimelineDock& timeline)
200  : m_timelineDock(timeline)
201  {
202  m_timelineDock.blockSelection(true);
203  }
204  ~TimelineSelectionBlocker()
205  {
206  QCoreApplication::processEvents();
207  m_timelineDock.blockSelection(false);
208  }
209 
210 private:
211  TimelineDock& m_timelineDock;
212 };
213 
214 #endif // TIMELINEDOCK_H
SharedFrame
The SharedFrame provides thread safe access to Mlt::Frame data.
Definition: sharedframe.h:48