fixed copying clips between sequences with different frame rates
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
#include "clipboard.h"
|
||||
|
||||
int clipboard_type = CLIPBOARD_TYPE_CLIP;
|
||||
QVector<void*> clipboard;
|
||||
@@ -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
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user