From 058e5b25c526f1dd71dd2973efd51fc97686522c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Mar 2019 01:26:46 +1100 Subject: [PATCH] started on editing multiple effects at once --- effects/fields/boolfield.cpp | 8 ++++- effects/fields/doublefield.cpp | 6 +++- effects/internal/richtexteffect.cpp | 3 -- panels/effectcontrols.cpp | 28 ++++++++++-------- ui/effectui.cpp | 46 +++++++++++++++++++++++++++++ ui/effectui.h | 8 ++++- 6 files changed, 80 insertions(+), 19 deletions(-) diff --git a/effects/fields/boolfield.cpp b/effects/fields/boolfield.cpp index 33102544d..f47f1d5e3 100644 --- a/effects/fields/boolfield.cpp +++ b/effects/fields/boolfield.cpp @@ -31,7 +31,13 @@ void BoolField::UpdateWidgetValue(QWidget *widget, double timecode) cb->blockSignals(true); - cb->setChecked(GetBoolAt(timecode)); + if (qIsNaN(timecode)) { + cb->setTristate(true); + cb->setCheckState(Qt::PartiallyChecked); + } else { + cb->setTristate(false); + cb->setChecked(GetBoolAt(timecode)); + } cb->blockSignals(false); diff --git a/effects/fields/doublefield.cpp b/effects/fields/doublefield.cpp index 378d18879..900eb84b2 100644 --- a/effects/fields/doublefield.cpp +++ b/effects/fields/doublefield.cpp @@ -86,7 +86,11 @@ QWidget *DoubleField::CreateWidget() void DoubleField::UpdateWidgetValue(QWidget *widget, double timecode) { - static_cast(widget)->SetValue(GetDoubleAt(timecode)); + if (qIsNaN(timecode)) { + static_cast(widget)->SetValue(qSNaN()); + } else { + static_cast(widget)->SetValue(GetDoubleAt(timecode)); + } } void DoubleField::ValueHasBeenSet() diff --git a/effects/internal/richtexteffect.cpp b/effects/internal/richtexteffect.cpp index 84cb01f1f..34ab317bb 100644 --- a/effects/internal/richtexteffect.cpp +++ b/effects/internal/richtexteffect.cpp @@ -179,9 +179,6 @@ void RichTextEffect::redraw(double timecode) p.translate(-shadow_x_offset, -shadow_y_offset); clip_rect.translate(shadow_x_offset, shadow_y_offset); - - - } td.drawContents(&p, clip_rect); diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index dcc83bfbf..7ad83e43a 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -133,18 +133,7 @@ void EffectControls::menu_select(QAction* q) { void EffectControls::update_keyframes() { for (int i=0;iGetEffect(); - - for (int j=0;jrow_count();j++) { - - EffectRow* row = effect->row(j); - - for (int k=0;kFieldCount();k++) { - EffectField* field = row->Field(k); - - field->UpdateWidgetValue(ui->Widget(j, k), field->Now()); - } - } + ui->UpdateFromEffect(); } headers->update_zoom(zoom); @@ -607,7 +596,20 @@ void EffectControls::Load() { if (mode_ == kTransitionNone) { for (int j=0;jeffects.size();j++) { - open_effect(layout, c->effects.at(j).get()); + + // Check if we've already opened an effect of this type before + bool already_opened = false; + for (int k=0;kGetEffect()->meta == c->effects.at(j)->meta) { + open_effects_.at(k)->AddAdditionalEffect(c->effects.at(j).get()); + already_opened = true; + break; + } + } + + if (!already_opened) { + open_effect(layout, c->effects.at(j).get()); + } // Check if one of the open effects contains the row currently active in the graph editor. If not, we'll have // to clear the graph editor later. diff --git a/ui/effectui.cpp b/ui/effectui.cpp index 6ecec732c..b79b5243f 100644 --- a/ui/effectui.cpp +++ b/ui/effectui.cpp @@ -83,6 +83,11 @@ EffectUI::EffectUI(Effect* e) : connect(enabled_check, SIGNAL(toggled(bool)), e, SLOT(FieldChanged())); } +void EffectUI::AddAdditionalEffect(Effect *e) +{ + additional_effects_.append(e); +} + Effect *EffectUI::GetEffect() { return effect_; @@ -96,6 +101,47 @@ int EffectUI::GetRowY(int row, QWidget* mapToWidget) { - title_bar->height(); } +void EffectUI::UpdateFromEffect() +{ + Effect* effect = GetEffect(); + + for (int j=0;jrow_count();j++) { + + EffectRow* row = effect->row(j); + + for (int k=0;kFieldCount();k++) { + EffectField* field = row->Field(k); + + // Check if this UI object is attached to one effect or many + if (additional_effects_.isEmpty()) { + + field->UpdateWidgetValue(Widget(j, k), field->Now()); + + } else { + + bool same_value = true; + + for (int i=0;i 0 ? additional_effects_.at(i-1)->row(j)->Field(k) : field; + EffectField* additional_field = additional_effects_.at(i)->row(j)->Field(k); + + if (additional_field->GetValueAt(additional_field->Now()) != previous_field->GetValueAt(previous_field->Now())) { + same_value = false; + break; + } + } + + if (same_value) { + field->UpdateWidgetValue(Widget(j, k), field->Now()); + } else { + field->UpdateWidgetValue(Widget(j, k), qSNaN()); + } + + } + } + } +} + QWidget *EffectUI::Widget(int row, int field) { return widgets_.at(row).at(field); diff --git a/ui/effectui.h b/ui/effectui.h index 81de6871e..b63434b07 100644 --- a/ui/effectui.h +++ b/ui/effectui.h @@ -9,17 +9,23 @@ class EffectUI : public CollapsibleWidget { public: EffectUI(Effect* e); + void AddAdditionalEffect(Effect* e); + Effect* GetEffect(); int GetRowY(int row, QWidget *mapToWidget); - QWidget* Widget(int row, int field); + void UpdateFromEffect(); + signals: void CutRequested(); void CopyRequested(); void TitleBarContextMenuRequested(const QPoint&); private: + QWidget* Widget(int row, int field); + Effect* effect_; + QVector additional_effects_; QGridLayout* layout_; QVector labels_; QVector< QVector > widgets_;