diff --git a/effects/internal/transformeffect.cpp b/effects/internal/transformeffect.cpp index cfa7260ef..41e249a5e 100644 --- a/effects/internal/transformeffect.cpp +++ b/effects/internal/transformeffect.cpp @@ -97,7 +97,7 @@ TransformEffect::TransformEffect(Clip* c, const EffectMeta* em) : Effect(c, em) } void TransformEffect::refresh() { - if (parent_clip->sequence != NULL) { + if (parent_clip != NULL && parent_clip->sequence != NULL) { double default_pos_x = parent_clip->sequence->width/2; double default_pos_y = parent_clip->sequence->height/2; diff --git a/io/clipboard.cpp b/io/clipboard.cpp index c674841a2..bca0912df 100644 --- a/io/clipboard.cpp +++ b/io/clipboard.cpp @@ -1,4 +1,17 @@ #include "clipboard.h" +#include "project/clip.h" + int clipboard_type = CLIPBOARD_TYPE_CLIP; QVector clipboard; + +void clear_clipboard() { + for (int i=0;i(clipboard.at(i)); + } else if (clipboard_type == CLIPBOARD_TYPE_EFFECT) { + delete static_cast(clipboard.at(i)); + } + } + clipboard.clear(); +} diff --git a/io/clipboard.h b/io/clipboard.h index e96344a62..d76b7fa59 100644 --- a/io/clipboard.h +++ b/io/clipboard.h @@ -8,5 +8,6 @@ extern int clipboard_type; extern QVector clipboard; +void clear_clipboard(); #endif // CLIPBOARD_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 612c4996c..c04e467be 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -385,19 +385,27 @@ void MainWindow::openSpeedDialog() { } void MainWindow::cut() { - if (panel_timeline->focused() && sequence != NULL) { - panel_timeline->copy(true); - } + if (sequence != NULL) { + if (panel_timeline->focused()) { + panel_timeline->copy(true); + } else if (panel_effect_controls->is_focused()) { + panel_effect_controls->copy(true); + } + } } void MainWindow::copy() { - if (panel_timeline->focused() && sequence != NULL) { - panel_timeline->copy(false); - } + if (sequence != NULL) { + if (panel_timeline->focused()) { + panel_timeline->copy(false); + } else if (panel_effect_controls->is_focused()) { + panel_effect_controls->copy(false); + } + } } void MainWindow::paste() { - if (panel_timeline->focused() && sequence != NULL) { + if ((panel_timeline->focused() || panel_effect_controls->is_focused()) && sequence != NULL) { panel_timeline->paste(false); } } diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index b4b0cdeee..18e0baffc 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -17,6 +17,7 @@ #include "panels/timeline.h" #include "panels/viewer.h" #include "ui/viewerwidget.h" +#include "io/clipboard.h" #include "debug.h" EffectControls::EffectControls(QWidget *parent) : @@ -65,9 +66,9 @@ void EffectControls::menu_select(QAction* q) { ComboAction* ca = new ComboAction(); for (int i=0;iclips.at(selected_clips.at(i)); - if ((c->track < 0) == video_menu) { + if ((c->track < 0) == (effect_menu_subtype == EFFECT_TYPE_VIDEO)) { const EffectMeta* meta = reinterpret_cast(q->data().value()); - if (transition_menu) { + if (effect_menu_type == EFFECT_TYPE_TRANSITION) { if (c->get_opening_transition() == NULL) { ca->append(new AddTransitionCommand(c, NULL, NULL, meta, TA_OPENING_TRANSITION, 30)); } @@ -80,7 +81,7 @@ void EffectControls::menu_select(QAction* q) { } } undo_stack.push(ca); - if (transition_menu) { + if (effect_menu_type == EFFECT_TYPE_TRANSITION) { update_ui(true); } else { reload_clips(); @@ -94,21 +95,57 @@ void EffectControls::update_keyframes() { } void EffectControls::delete_selected_keyframes() { - ui->keyframeView->delete_selected_keyframes(); + ui->keyframeView->delete_selected_keyframes(); } -void EffectControls::show_effect_menu(bool video, bool transitions) { - video_menu = video; - transition_menu = transitions; +void EffectControls::copy(bool del) { + if (mode == TA_NO_TRANSITION) { + bool cleared = false; + + ComboAction* ca = new ComboAction(); + EffectDeleteCommand* del_com = (del) ? new EffectDeleteCommand() : NULL; + for (int i=0;iclips.at(selected_clips.at(i)); + for (int j=0;jeffects.size();j++) { + Effect* effect = c->effects.at(j); + if (effect->container->selected) { + if (!cleared) { + clipboard_type = CLIPBOARD_TYPE_EFFECT; + clear_clipboard(); + cleared = true; + } + + clipboard.append(effect->copy(NULL)); + + if (del_com != NULL) { + del_com->clips.append(c); + del_com->fx.append(j); + } + } + } + } + if (del_com != NULL) { + if (del_com->clips.size() > 0) { + ca->append(del_com); + } else { + delete del_com; + } + } + undo_stack.push(ca); + } +} + +void EffectControls::show_effect_menu(int type, int subtype) { + effect_menu_type = type; + effect_menu_subtype = subtype; effects_loaded.lock(); - QVector& effect_list = (video) ? video_effects : audio_effects; QMenu effects_menu(this); - for (int i=0;isetText(em.name); action->setData(reinterpret_cast(&em)); @@ -275,24 +312,20 @@ void EffectControls::set_clips(QVector& clips, int m) { load_effects(); } -void EffectControls::on_add_video_effect_button_clicked() -{ - show_effect_menu(true, false); +void EffectControls::on_add_video_effect_button_clicked() { + show_effect_menu(EFFECT_TYPE_EFFECT, EFFECT_TYPE_VIDEO); } -void EffectControls::on_add_audio_effect_button_clicked() -{ - show_effect_menu(false, false); +void EffectControls::on_add_audio_effect_button_clicked() { + show_effect_menu(EFFECT_TYPE_EFFECT, EFFECT_TYPE_AUDIO); } -void EffectControls::on_add_video_transition_button_clicked() -{ - show_effect_menu(true, true); +void EffectControls::on_add_video_transition_button_clicked() { + show_effect_menu(EFFECT_TYPE_TRANSITION, EFFECT_TYPE_VIDEO); } -void EffectControls::on_add_audio_transition_button_clicked() -{ - show_effect_menu(false, true); +void EffectControls::on_add_audio_transition_button_clicked() { + show_effect_menu(EFFECT_TYPE_TRANSITION, EFFECT_TYPE_AUDIO); } void EffectControls::resizeEvent(QResizeEvent*) { diff --git a/panels/effectcontrols.h b/panels/effectcontrols.h index d80b10c39..6e2bdb807 100644 --- a/panels/effectcontrols.h +++ b/panels/effectcontrols.h @@ -40,6 +40,7 @@ public: void set_zoom(bool in); bool keyframe_focus(); void delete_selected_keyframes(); + void copy(bool del); bool multiple; QVector selected_clips; @@ -60,13 +61,13 @@ private slots: protected: void resizeEvent(QResizeEvent *event); private: - void show_effect_menu(bool video, bool transitions); + void show_effect_menu(int type, int subtype); void load_effects(); void load_keyframes(); void open_effect(QVBoxLayout* layout, Effect* e); - bool video_menu; - bool transition_menu; + int effect_menu_type; + int effect_menu_subtype; QString panel_name; int mode; }; diff --git a/panels/project.cpp b/panels/project.cpp index 593d52a4b..5b5eb05e0 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -812,10 +812,9 @@ QTreeWidgetItem* Project::find_loaded_folder_by_id(int id) { } const EffectMeta* get_meta_from_name(const QString& name, int type) { - QVector& effect_list = (type == EFFECT_TYPE_VIDEO) ? video_effects : audio_effects; - 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) { - clipboard.clear(); + clear_clipboard(); cleared = true; + clipboard_type = CLIPBOARD_TYPE_CLIP; } Clip* copied_clip = c->copy(NULL); @@ -904,73 +903,88 @@ void Timeline::relink_clips_using_ids(QVector& old_clips, QVector& n } void Timeline::paste(bool insert) { - if (clipboard_type == CLIPBOARD_TYPE_CLIP && clipboard.size() > 0) { - ComboAction* ca = new ComboAction(); + if (clipboard.size() > 0) { + if (clipboard_type == CLIPBOARD_TYPE_CLIP) { + ComboAction* ca = new ComboAction(); - // create copies and delete areas that we'll be pasting to - QVector delete_areas; - QVector pasted_clips; - long paste_start = LONG_MAX; - long paste_end = LONG_MIN; - for (int i=0;i(clipboard.at(i)); + // create copies and delete areas that we'll be pasting to + QVector delete_areas; + 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); + // 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); + // 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; + cc->timeline_in += sequence->playhead; + cc->timeline_out += sequence->playhead; + cc->track = c->track; - paste_start = qMin(paste_start, cc->timeline_in); - paste_end = qMax(paste_end, cc->timeline_out); + paste_start = qMin(paste_start, cc->timeline_in); + paste_end = qMax(paste_end, cc->timeline_out); - pasted_clips.append(cc); + pasted_clips.append(cc); - if (!insert) { - Selection s; - s.in = cc->timeline_in; - s.out = cc->timeline_out; - s.track = c->track; - delete_areas.append(s); + if (!insert) { + Selection s; + s.in = cc->timeline_in; + s.out = cc->timeline_out; + s.track = c->track; + delete_areas.append(s); + } + } + if (insert) { + split_cache.clear(); + split_all_clips_at_point(ca, sequence->playhead); + ca->append(new RippleCommand(sequence, paste_start, paste_end - paste_start)); + } else { + delete_areas_and_relink(ca, delete_areas); } - } - if (insert) { - split_cache.clear(); - split_all_clips_at_point(ca, sequence->playhead); - ca->append(new RippleCommand(sequence, paste_start, paste_end - paste_start)); - } else { - delete_areas_and_relink(ca, delete_areas); - } - // correct linked clips - for (int i=0;i(clipboard.at(i)); + // correct linked clips + for (int i=0;i(clipboard.at(i)); - for (int j=0;jlinked.size();j++) { - for (int k=0;k(clipboard.at(k)); - if (comp->load_id == oc->linked.at(j)) { - pasted_clips.at(i)->linked.append(k); + for (int j=0;jlinked.size();j++) { + for (int k=0;k(clipboard.at(k)); + if (comp->load_id == oc->linked.at(j)) { + pasted_clips.at(i)->linked.append(k); + } } } } - } - ca->append(new AddClipCommand(sequence, pasted_clips)); + ca->append(new AddClipCommand(sequence, pasted_clips)); - undo_stack.push(ca); + undo_stack.push(ca); - update_ui(true); + update_ui(true); - if (config.paste_seeks) { - panel_sequence_viewer->seek(paste_end); + if (config.paste_seeks) { + panel_sequence_viewer->seek(paste_end); + } + } else if (clipboard_type == CLIPBOARD_TYPE_EFFECT) { + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); + if (c != NULL && is_clip_selected(c, true)) { + for (int j=0;j(clipboard.at(j)); + if ((c->track < 0) == (e->meta->subtype == EFFECT_TYPE_VIDEO)) { + c->effects.append(e->copy(c)); + } + } + } + } + update_ui(true); } } } @@ -1466,9 +1480,9 @@ void Timeline::on_toolTransitionButton_clicked() { QMenu transition_menu(this); - for (int i=0;isetObjectName("v"); a->setData(reinterpret_cast(&em)); @@ -1477,9 +1491,9 @@ void Timeline::on_toolTransitionButton_clicked() { transition_menu.addSeparator(); - for (int i=0;isetObjectName("a"); a->setData(reinterpret_cast(&em)); diff --git a/project/effect.cpp b/project/effect.cpp index 3be8ec413..011d7dfc2 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -38,8 +38,7 @@ #include #include -QVector video_effects; -QVector audio_effects; +QVector effects; QMutex effects_loaded; Effect* create_effect(Clip* c, const EffectMeta* em) { @@ -67,16 +66,11 @@ Effect* create_effect(Clip* c, const EffectMeta* em) { } const EffectMeta* get_internal_meta(int internal_id, int type) { - for (int i=0;i video_effects; -extern QVector audio_effects; +extern QVector effects; double log_volume(double linear); void init_effects();