From 1113c74c0065731cd082547de1234610318d0f80 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 25 Nov 2018 00:10:45 +1100 Subject: [PATCH] added controls for transitions --- effects/internal/crossdissolvetransition.cpp | 2 +- panels/effectcontrols.cpp | 246 +++++++------------ panels/effectcontrols.h | 6 +- panels/panels.cpp | 48 ++-- project/effect.cpp | 2 +- project/effect.h | 2 +- project/effectrow.cpp | 64 ++--- project/transition.cpp | 2 +- 8 files changed, 163 insertions(+), 209 deletions(-) diff --git a/effects/internal/crossdissolvetransition.cpp b/effects/internal/crossdissolvetransition.cpp index 527698fb6..ef2d684ac 100644 --- a/effects/internal/crossdissolvetransition.cpp +++ b/effects/internal/crossdissolvetransition.cpp @@ -5,7 +5,7 @@ CrossDissolveTransition::CrossDissolveTransition(Clip* c, Clip* s, const EffectMeta* em) : Transition(c, s, em) { enable_coords = true; - add_row("Smooth")->add_field(EFFECT_FIELD_BOOL, "smooth"); +// add_row("Smooth")->add_field(EFFECT_FIELD_BOOL, "smooth"); } void CrossDissolveTransition::process_coords(double progress, GLTextureCoords&, int data) { diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 727fa3bf5..2bb27b32b 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -24,7 +24,8 @@ EffectControls::EffectControls(QWidget *parent) : multiple(false), zoom(1), ui(new Ui::EffectControls), - panel_name("Effects: ") + panel_name("Effects: "), + mode(TA_NO_TRANSITION) { ui->setupUi(this); @@ -97,151 +98,68 @@ void EffectControls::delete_selected_keyframes() { } void EffectControls::show_effect_menu(bool video, bool transitions) { + video_menu = video; + transition_menu = transitions; + effects_loaded.lock(); - /*video_menu = video; - transition_menu = transitions; - - int lim; - QVector* effect_names; - if (transitions) { - if (video) { - lim = VIDEO_TRANSITION_COUNT; - effect_names = &video_transition_names; - } else { - lim = AUDIO_TRANSITION_COUNT; - effect_names = &audio_transition_names; - } - } else { - if (video) { - lim = VIDEO_EFFECT_COUNT; - effect_names = &video_effect_names; - } else { - lim = AUDIO_EFFECT_COUNT; - effect_names = &audio_effect_names; - } - } - + QVector& effect_list = (video) ? video_effects : audio_effects; QMenu effects_menu(this); + for (int i=0;isetText(effect_names->at(i)); - action->setData(i); + if ((em.type == EFFECT_TYPE_TRANSITION) == transition_menu) { + QAction* action = new QAction(&effects_menu); + action->setText(em.name); + action->setData(reinterpret_cast(&em)); - // sort alphabetically - bool added = false; - for (int j=0;jtext() > effect_names->at(i)) { - effects_menu.insertAction(comp_action, action); - added = true; - break; + QMenu* parent = &effects_menu; + if (!em.category.isEmpty()) { + bool found = false; + for (int j=0;jmenu() != NULL) { + if (action->menu()->title() == em.category) { + parent = action->menu(); + found = true; + break; + } + } + } + if (!found) { + parent = new QMenu(&effects_menu); + parent->setTitle(em.category); + + bool found = false; + for (int i=0;itext() > em.category) { + effects_menu.insertMenu(comp_action, parent); + found = true; + break; + } + } + if (!found) effects_menu.addMenu(parent); + } } + + bool found = false; + for (int i=0;iactions().size();i++) { + QAction* comp_action = parent->actions().at(i); + if (comp_action->text() > action->text()) { + parent->insertAction(comp_action, action); + found = true; + break; + } + } + if (!found) parent->addAction(action); } - if (!added) effects_menu.addAction(action); } + effects_loaded.unlock(); + connect(&effects_menu, SIGNAL(triggered(QAction*)), this, SLOT(menu_select(QAction*))); - - effects_menu.exec(QCursor::pos());*/ - - video_menu = video; - transition_menu = transitions; - - /*if (transition_menu) { - // TODO old effect/transition code grandfathered in, to be updated - - int lim; - QVector* effect_names; - if (video) { - lim = VIDEO_TRANSITION_COUNT; - effect_names = &video_transition_names; - } else { - lim = AUDIO_TRANSITION_COUNT; - effect_names = &audio_transition_names; - } - QMenu effects_menu(this); - for (int i=0;isetText(effect_names->at(i)); - action->setData(i); - - // sort alphabetically - bool added = false; - for (int j=0;jtext() > effect_names->at(i)) { - effects_menu.insertAction(comp_action, action); - added = true; - break; - } - } - if (!added) effects_menu.addAction(action); - } - connect(&effects_menu, SIGNAL(triggered(QAction*)), this, SLOT(menu_select(QAction*))); - effects_menu.exec(QCursor::pos()); - } else {*/ - 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)); - - QMenu* parent = &effects_menu; - if (!em.category.isEmpty()) { - bool found = false; - for (int j=0;jmenu() != NULL) { - if (action->menu()->title() == em.category) { - parent = action->menu(); - found = true; - break; - } - } - } - if (!found) { - parent = new QMenu(&effects_menu); - parent->setTitle(em.category); - - bool found = false; - for (int i=0;itext() > em.category) { - effects_menu.insertMenu(comp_action, parent); - found = true; - break; - } - } - if (!found) effects_menu.addMenu(parent); - } - } - - bool found = false; - for (int i=0;iactions().size();i++) { - QAction* comp_action = parent->actions().at(i); - if (comp_action->text() > action->text()) { - parent->insertAction(comp_action, action); - found = true; - break; - } - } - if (!found) parent->addAction(action); - } - } - - effects_loaded.unlock(); - - connect(&effects_menu, SIGNAL(triggered(QAction*)), this, SLOT(menu_select(QAction*))); - effects_menu.exec(QCursor::pos()); - //} + effects_menu.exec(QCursor::pos()); } void EffectControls::clear_effects(bool clear_cache) { @@ -277,10 +195,16 @@ void EffectControls::deselect_all_effects(QWidget* sender) { } } +void EffectControls::open_effect(QVBoxLayout* layout, Effect* e) { + CollapsibleWidget* container = e->container; + layout->addWidget(container); + connect(container, SIGNAL(deselect_others(QWidget*)), this, SLOT(deselect_all_effects(QWidget*))); +} + void EffectControls::load_effects() { ui->label_2->setVisible(multiple); - if (!multiple) { + if (!multiple) { // load in new clips for (int i=0;iclips.at(selected_clips.at(i)); @@ -292,12 +216,15 @@ void EffectControls::load_effects() { ui->acontainer->setVisible(true); layout = static_cast(ui->audio_effect_area->layout()); } - for (int j=0;jeffects.size();j++) { - Effect* e = c->effects.at(j); - CollapsibleWidget* container = e->container; - layout->addWidget(container); - connect(container, SIGNAL(deselect_others(QWidget*)), this, SLOT(deselect_all_effects(QWidget*))); - } + if (mode == TA_NO_TRANSITION) { + for (int j=0;jeffects.size();j++) { + open_effect(layout, c->effects.at(j)); + } + } else if (mode == TA_OPENING_TRANSITION && c->get_opening_transition() != NULL) { + open_effect(layout, c->get_opening_transition()); + } else if (mode == TA_CLOSING_TRANSITION && c->get_closing_transition() != NULL) { + open_effect(layout, c->get_closing_transition()); + } } if (selected_clips.size() > 0) { setWindowTitle(panel_name + sequence->clips.at(selected_clips.at(0))->name); @@ -311,22 +238,24 @@ void EffectControls::load_effects() { void EffectControls::delete_effects() { // load in new clips - EffectDeleteCommand* command = new EffectDeleteCommand(); - 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) { - command->clips.append(c); - command->fx.append(j); + if (mode == TA_NO_TRANSITION) { + EffectDeleteCommand* command = new EffectDeleteCommand(); + 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) { + command->clips.append(c); + command->fx.append(j); + } } } - } - if (command->clips.size() > 0) { - undo_stack.push(command); - panel_sequence_viewer->viewer_widget->update(); - } else { - delete command; + if (command->clips.size() > 0) { + undo_stack.push(command); + panel_sequence_viewer->viewer_widget->update(); + } else { + delete command; + } } } @@ -335,11 +264,12 @@ void EffectControls::reload_clips() { load_effects(); } -void EffectControls::set_clips(QVector& clips) { +void EffectControls::set_clips(QVector& clips, int m) { clear_effects(true); // replace clip vector selected_clips = clips; + mode = m; load_effects(); } diff --git a/panels/effectcontrols.h b/panels/effectcontrols.h index 4e54ff481..d80b10c39 100644 --- a/panels/effectcontrols.h +++ b/panels/effectcontrols.h @@ -10,6 +10,7 @@ class Effect; class TimelineHeader; class QScrollArea; class KeyframeView; +class QVBoxLayout; class EffectsArea : public QWidget { public: @@ -31,7 +32,7 @@ class EffectControls : public QDockWidget public: explicit EffectControls(QWidget *parent = 0); ~EffectControls(); - void set_clips(QVector& clips); + void set_clips(QVector& clips, int mode); void clear_effects(bool clear_cache); void delete_effects(); bool is_focused(); @@ -55,7 +56,6 @@ private slots: void deselect_all_effects(QWidget*); void on_add_video_transition_button_clicked(); - void on_add_audio_transition_button_clicked(); protected: void resizeEvent(QResizeEvent *event); @@ -63,10 +63,12 @@ private: void show_effect_menu(bool video, bool transitions); void load_effects(); void load_keyframes(); + void open_effect(QVBoxLayout* layout, Effect* e); bool video_menu; bool transition_menu; QString panel_name; + int mode; }; #endif // EFFECTCONTROLS_H diff --git a/panels/panels.cpp b/panels/panels.cpp index 07e87f288..8b458fcd1 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -5,6 +5,8 @@ #include "viewer.h" #include "project/sequence.h" #include "project/clip.h" +#include "project/transition.h" +#include "debug.h" Project* panel_project = 0; EffectControls* panel_effect_controls = 0; @@ -21,24 +23,42 @@ void update_effect_controls() { int vclip = -1; int aclip = -1; QVector selected_clips; + int mode = TA_NO_TRANSITION; if (sequence != NULL) { for (int i=0;iclips.size();i++) { Clip* clip = sequence->clips.at(i); - if (clip != NULL && panel_timeline->is_clip_selected(clip, true)) { - if (clip->track < 0 && vclip == -1) { - vclip = i; - } else if (clip->track >= 0 && aclip == -1) { - aclip = i; - } else { - vclip = -2; - aclip = -2; - panel_effect_controls->multiple = true; - break; - } + if (clip != NULL) { + for (int j=0;jselections.size();j++) { + const Selection& s = sequence->selections.at(j); + bool add = true; + if (clip->timeline_in >= s.in && clip->timeline_out <= s.out && clip->track == s.track) { + mode = TA_NO_TRANSITION; + } else if (selection_contains_transition(s, clip, TA_OPENING_TRANSITION)) { + mode = TA_OPENING_TRANSITION; + } else if (selection_contains_transition(s, clip, TA_CLOSING_TRANSITION)) { + mode = TA_CLOSING_TRANSITION; + } else { + add = false; + } + + if (add) { + if (clip->track < 0 && vclip == -1) { + vclip = i; + } else if (clip->track >= 0 && aclip == -1) { + aclip = i; + } else { + vclip = -2; + aclip = -2; + panel_effect_controls->multiple = true; + break; + } + } + } } } - // check if aclip is linked to vclip - if (!panel_effect_controls->multiple) { + + if (!panel_effect_controls->multiple) { + // check if aclip is linked to vclip if (vclip >= 0) selected_clips.append(vclip); if (aclip >= 0) selected_clips.append(aclip); if (vclip >= 0 && aclip >= 0) { @@ -58,7 +78,7 @@ void update_effect_controls() { } } } - panel_effect_controls->set_clips(selected_clips); + panel_effect_controls->set_clips(selected_clips, mode); } void update_ui(bool modified) { diff --git a/project/effect.cpp b/project/effect.cpp index f1d1fc30b..d2f6f1885 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -447,7 +447,7 @@ void Effect::copy_field_keyframes(Effect* e) { EffectRow* Effect::add_row(const QString& name) { EffectRow* row = new EffectRow(this, ui_layout, name, rows.size()); - rows.append(row); + rows.append(row); return row; } diff --git a/project/effect.h b/project/effect.h index 9c8eb062b..f24051b7d 100644 --- a/project/effect.h +++ b/project/effect.h @@ -117,7 +117,7 @@ public: QString name; CollapsibleWidget* container; - EffectRow* add_row(const QString &name); + EffectRow* add_row(const QString &name); EffectRow* row(int i); int row_count(); diff --git a/project/effectrow.cpp b/project/effectrow.cpp index c3804be1f..aac97d6b7 100644 --- a/project/effectrow.cpp +++ b/project/effectrow.cpp @@ -25,43 +25,45 @@ EffectRow::EffectRow(Effect *parent, QGridLayout *uilayout, const QString &n, in label = new QLabel(name); ui->addWidget(label, row, 0); - QSize button_size(20, 20); - QSize icon_size(12, 12); + if (parent_effect->meta->type != EFFECT_TYPE_TRANSITION) { + QSize button_size(20, 20); + QSize icon_size(12, 12); - QHBoxLayout* key_controls = new QHBoxLayout(); - key_controls->setSpacing(0); - key_controls->setMargin(0); - key_controls->addStretch(); + QHBoxLayout* key_controls = new QHBoxLayout(); + key_controls->setSpacing(0); + key_controls->setMargin(0); + key_controls->addStretch(); - left_key_nav = new QPushButton("<"); - left_key_nav->setVisible(false); - left_key_nav->setMaximumSize(button_size); - key_controls->addWidget(left_key_nav); - connect(left_key_nav, SIGNAL(clicked(bool)), this, SLOT(goto_previous_key())); + left_key_nav = new QPushButton("<"); + left_key_nav->setVisible(false); + left_key_nav->setMaximumSize(button_size); + key_controls->addWidget(left_key_nav); + connect(left_key_nav, SIGNAL(clicked(bool)), this, SLOT(goto_previous_key())); - key_addremove = new QPushButton("."); - key_addremove->setVisible(false); - key_addremove->setMaximumSize(button_size); - key_controls->addWidget(key_addremove); - connect(key_addremove, SIGNAL(clicked(bool)), this, SLOT(toggle_key())); + key_addremove = new QPushButton("."); + key_addremove->setVisible(false); + key_addremove->setMaximumSize(button_size); + key_controls->addWidget(key_addremove); + connect(key_addremove, SIGNAL(clicked(bool)), this, SLOT(toggle_key())); - right_key_nav = new QPushButton(">"); - right_key_nav->setVisible(false); - right_key_nav->setMaximumSize(button_size); - key_controls->addWidget(right_key_nav); - connect(right_key_nav, SIGNAL(clicked(bool)), this, SLOT(goto_next_key())); + right_key_nav = new QPushButton(">"); + right_key_nav->setVisible(false); + right_key_nav->setMaximumSize(button_size); + key_controls->addWidget(right_key_nav); + connect(right_key_nav, SIGNAL(clicked(bool)), this, SLOT(goto_next_key())); - keyframe_enable = new QPushButton(QIcon(":/icons/clock.png"), ""); - keyframe_enable->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); - keyframe_enable->setMaximumSize(button_size); - keyframe_enable->setIconSize(icon_size); - keyframe_enable->setCheckable(true); - keyframe_enable->setToolTip("Enable Keyframes"); - connect(keyframe_enable, SIGNAL(clicked(bool)), this, SLOT(set_keyframe_enabled(bool))); - connect(keyframe_enable, SIGNAL(toggled(bool)), this, SLOT(keyframe_ui_enabled(bool))); - key_controls->addWidget(keyframe_enable); + keyframe_enable = new QPushButton(QIcon(":/icons/clock.png"), ""); + keyframe_enable->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); + keyframe_enable->setMaximumSize(button_size); + keyframe_enable->setIconSize(icon_size); + keyframe_enable->setCheckable(true); + keyframe_enable->setToolTip("Enable Keyframes"); + connect(keyframe_enable, SIGNAL(clicked(bool)), this, SLOT(set_keyframe_enabled(bool))); + connect(keyframe_enable, SIGNAL(toggled(bool)), this, SLOT(keyframe_ui_enabled(bool))); + key_controls->addWidget(keyframe_enable); - ui->addLayout(key_controls, row, 6); + ui->addLayout(key_controls, row, 6); + } } bool EffectRow::isKeyframing() { diff --git a/project/transition.cpp b/project/transition.cpp index 51467c14e..be8db58ad 100644 --- a/project/transition.cpp +++ b/project/transition.cpp @@ -14,7 +14,7 @@ #include Transition::Transition(Clip* c, Clip* s, const EffectMeta* em) : Effect(c, em), secondary_clip(s) { - //add_row("Length:")->add_field(EFFECT_FIELD_DOUBLE); +// add_row("Length:", false)->add_field(EFFECT_FIELD_DOUBLE, "length"); } int Transition::copy(Clip *c, Clip* s) {