fixed copying clips between sequences with different frame rates

This commit is contained in:
itsmattkc
2018-11-29 14:08:44 +11:00
parent fc65b3c831
commit fb1851884d
8 changed files with 61 additions and 29 deletions
+4
View File
@@ -0,0 +1,4 @@
#include "clipboard.h"
int clipboard_type = CLIPBOARD_TYPE_CLIP;
QVector<void*> clipboard;
+12
View File
@@ -0,0 +1,12 @@
#ifndef CLIPBOARD_H
#define CLIPBOARD_H
#include <QVector>
#define CLIPBOARD_TYPE_CLIP 0
#define CLIPBOARD_TYPE_EFFECT 1
extern int clipboard_type;
extern QVector<void*> clipboard;
#endif // CLIPBOARD_H
+4 -2
View File
@@ -89,7 +89,8 @@ SOURCES += \
project/effectrow.cpp \
project/effectfield.cpp \
effects/internal/cubetransition.cpp \
project/effectgizmo.cpp
project/effectgizmo.cpp \
io/clipboard.cpp
HEADERS += \
mainwindow.h \
@@ -158,7 +159,8 @@ HEADERS += \
project/effectrow.h \
project/effectfield.h \
effects/internal/cubetransition.h \
project/effectgizmo.h
project/effectgizmo.h \
io/clipboard.h
FORMS += \
mainwindow.ui \
+12 -9
View File
@@ -21,6 +21,7 @@
#include "dialogs/newsequencedialog.h"
#include "dialogs/mediapropertiesdialog.h"
#include "dialogs/loaddialog.h"
#include "io/clipboard.h"
#include "debug.h"
#include <QFileDialog>
@@ -317,15 +318,17 @@ void Project::get_all_media_from_table(QList<QTreeWidgetItem*> items, QList<QTre
}
bool delete_clips_in_clipboard_with_media(ComboAction* ca, Media* m) {
int delete_count = 0;
for (int i=0;i<panel_timeline->clip_clipboard.size();i++) {
Clip* c = panel_timeline->clip_clipboard.at(i);
if (c->media == m) {
ca->append(new RemoveClipsFromClipboard(i-delete_count));
delete_count++;
}
}
return (delete_count > 0);
int delete_count = 0;
if (clipboard_type == CLIPBOARD_TYPE_CLIP) {
for (int i=0;i<clipboard.size();i++) {
Clip* c = static_cast<Clip*>(clipboard.at(i));
if (c->media == m) {
ca->append(new RemoveClipsFromClipboard(i-delete_count));
delete_count++;
}
}
}
return (delete_count > 0);
}
void Project::delete_selected_media() {
+24 -12
View File
@@ -18,6 +18,7 @@
#include "project/effect.h"
#include "project/transition.h"
#include "io/media.h"
#include "io/clipboard.h"
#include "debug.h"
#include <QTime>
@@ -838,13 +839,17 @@ void Timeline::copy(bool del) {
for (int j=0;j<sequence->selections.size();j++) {
const Selection& s = sequence->selections.at(j);
if (s.track == c->track && !((c->timeline_in <= s.in && c->timeline_out <= s.in) || (c->timeline_in >= s.out && c->timeline_out >= s.out))) {
clipboard_type = CLIPBOARD_TYPE_CLIP;
if (!cleared) {
clip_clipboard.clear();
clipboard.clear();
cleared = true;
}
Clip* copied_clip = c->copy(NULL);
copied_clip->cached_fr = sequence->frame_rate;
// copy linked IDs (we correct these later in paste())
copied_clip->linked = c->linked;
@@ -866,16 +871,16 @@ void Timeline::copy(bool del) {
copied_clip->load_id = i;
clip_clipboard.append(copied_clip);
clipboard.append(copied_clip);
}
}
}
}
for (int i=0;i<clip_clipboard.size();i++) {
for (int i=0;i<clipboard.size();i++) {
// initialize all timeline_ins to 0 or offsets of
clip_clipboard[i]->timeline_in -= min_in;
clip_clipboard[i]->timeline_out -= min_in;
static_cast<Clip*>(clipboard.at(i))->timeline_in -= min_in;
static_cast<Clip*>(clipboard.at(i))->timeline_out -= min_in;
}
if (del && copied) {
@@ -899,7 +904,7 @@ void Timeline::relink_clips_using_ids(QVector<int>& old_clips, QVector<Clip*>& n
}
void Timeline::paste(bool insert) {
if (clip_clipboard.size() > 0) {
if (clipboard_type == CLIPBOARD_TYPE_CLIP && clipboard.size() > 0) {
ComboAction* ca = new ComboAction();
// create copies and delete areas that we'll be pasting to
@@ -907,11 +912,17 @@ void Timeline::paste(bool insert) {
QVector<Clip*> pasted_clips;
long paste_start = LONG_MAX;
long paste_end = LONG_MIN;
for (int i=0;i<clip_clipboard.size();i++) {
Clip* c = clip_clipboard.at(i);
for (int i=0;i<clipboard.size();i++) {
Clip* c = static_cast<Clip*>(clipboard.at(i));
// create copy of clip and offset by playhead
Clip* cc = c->copy(sequence);
// convert frame rates
cc->timeline_in = refactor_frame_number(cc->timeline_in, c->cached_fr, sequence->frame_rate);
cc->timeline_out = refactor_frame_number(cc->timeline_out, c->cached_fr, sequence->frame_rate);
cc->clip_in = refactor_frame_number(cc->clip_in, c->cached_fr, sequence->frame_rate);
cc->timeline_in += sequence->playhead;
cc->timeline_out += sequence->playhead;
cc->track = c->track;
@@ -938,13 +949,14 @@ void Timeline::paste(bool insert) {
}
// correct linked clips
for (int i=0;i<clip_clipboard.size();i++) {
for (int i=0;i<clipboard.size();i++) {
// these indices should correspond
Clip* oc = clip_clipboard.at(i);
Clip* oc = static_cast<Clip*>(clipboard.at(i));
for (int j=0;j<oc->linked.size();j++) {
for (int k=0;k<clip_clipboard.size();k++) { // find clip with that ID
if (clip_clipboard.at(k)->load_id == oc->linked.at(j)) {
for (int k=0;k<clipboard.size();k++) { // find clip with that ID
Clip* comp = static_cast<Clip*>(clipboard.at(k));
if (comp->load_id == oc->linked.at(j)) {
pasted_clips.at(i)->linked.append(k);
}
}
-3
View File
@@ -185,9 +185,6 @@ public:
const EffectMeta* transition_tool_meta;
int transition_tool_side;
// clipboard
QVector<Clip*> clip_clipboard;
Ui::Timeline *ui;
public slots:
void repaint_timeline();
+1
View File
@@ -67,6 +67,7 @@ struct Clip
int media_type;
int media_stream;
double speed;
double cached_fr;
bool reverse;
bool maintain_audio_pitch;
bool autoscale;
+4 -3
View File
@@ -21,6 +21,7 @@
#include "ui/viewerwidget.h"
#include "project/marker.h"
#include "mainwindow.h"
#include "io/clipboard.h"
#include "debug.h"
QUndoStack undo_stack;
@@ -1254,13 +1255,13 @@ RemoveClipsFromClipboard::~RemoveClipsFromClipboard() {
}
void RemoveClipsFromClipboard::undo() {
panel_timeline->clip_clipboard.insert(pos, clip);
clipboard.insert(pos, clip);
done = false;
}
void RemoveClipsFromClipboard::redo() {
clip = panel_timeline->clip_clipboard.at(pos);
panel_timeline->clip_clipboard.removeAt(pos);
clip = static_cast<Clip*>(clipboard.at(pos));
clipboard.removeAt(pos);
done = true;
}