diff --git a/io/clipboard.cpp b/io/clipboard.cpp new file mode 100644 index 000000000..c674841a2 --- /dev/null +++ b/io/clipboard.cpp @@ -0,0 +1,4 @@ +#include "clipboard.h" + +int clipboard_type = CLIPBOARD_TYPE_CLIP; +QVector clipboard; diff --git a/io/clipboard.h b/io/clipboard.h new file mode 100644 index 000000000..e96344a62 --- /dev/null +++ b/io/clipboard.h @@ -0,0 +1,12 @@ +#ifndef CLIPBOARD_H +#define CLIPBOARD_H + +#include + +#define CLIPBOARD_TYPE_CLIP 0 +#define CLIPBOARD_TYPE_EFFECT 1 + +extern int clipboard_type; +extern QVector clipboard; + +#endif // CLIPBOARD_H diff --git a/olive.pro b/olive.pro index 368d37887..547c460f2 100644 --- a/olive.pro +++ b/olive.pro @@ -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 \ diff --git a/panels/project.cpp b/panels/project.cpp index 3db428698..593d52a4b 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -21,6 +21,7 @@ #include "dialogs/newsequencedialog.h" #include "dialogs/mediapropertiesdialog.h" #include "dialogs/loaddialog.h" +#include "io/clipboard.h" #include "debug.h" #include @@ -317,15 +318,17 @@ void Project::get_all_media_from_table(QList items, QListclip_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.at(i)); + if (c->media == m) { + ca->append(new RemoveClipsFromClipboard(i-delete_count)); + delete_count++; + } + } + } + return (delete_count > 0); } void Project::delete_selected_media() { diff --git a/panels/timeline.cpp b/panels/timeline.cpp index e269dd095..6459bcb40 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -18,6 +18,7 @@ #include "project/effect.h" #include "project/transition.h" #include "io/media.h" +#include "io/clipboard.h" #include "debug.h" #include @@ -838,13 +839,17 @@ void Timeline::copy(bool del) { for (int j=0;jselections.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;itimeline_in -= min_in; - clip_clipboard[i]->timeline_out -= min_in; + static_cast(clipboard.at(i))->timeline_in -= min_in; + static_cast(clipboard.at(i))->timeline_out -= min_in; } if (del && copied) { @@ -899,7 +904,7 @@ void Timeline::relink_clips_using_ids(QVector& old_clips, QVector& 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 pasted_clips; long paste_start = LONG_MAX; long paste_end = LONG_MIN; - for (int i=0;i(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(clipboard.at(i)); for (int j=0;jlinked.size();j++) { - for (int k=0;kload_id == oc->linked.at(j)) { + for (int k=0;k(clipboard.at(k)); + if (comp->load_id == oc->linked.at(j)) { pasted_clips.at(i)->linked.append(k); } } diff --git a/panels/timeline.h b/panels/timeline.h index eb14d5631..db73a87da 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -185,9 +185,6 @@ public: const EffectMeta* transition_tool_meta; int transition_tool_side; - // clipboard - QVector clip_clipboard; - Ui::Timeline *ui; public slots: void repaint_timeline(); diff --git a/project/clip.h b/project/clip.h index 1c96e217d..ea0fc6e85 100644 --- a/project/clip.h +++ b/project/clip.h @@ -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; diff --git a/project/undo.cpp b/project/undo.cpp index 48dd2989f..71b474b7f 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -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(clipboard.at(pos)); + clipboard.removeAt(pos); done = true; }