From 832cc986b7282cfea05b481ebe55f9c4a4039a7b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 17 Apr 2020 02:16:04 +1000 Subject: [PATCH] timeline/block: reimplemented enabling/disabling blocks --- app/node/block/block.cpp | 20 +++++++++++++++++- app/node/block/block.h | 8 +++++++ app/node/output/track/track.cpp | 6 +++++- app/panel/timeline/timeline.cpp | 5 +++++ app/panel/timeline/timeline.h | 2 ++ app/widget/menu/menushared.cpp | 2 +- app/widget/panel/panel.h | 2 ++ app/widget/timelinewidget/timelinewidget.cpp | 21 +++++++++++++++++++ app/widget/timelinewidget/timelinewidget.h | 2 ++ app/widget/timelinewidget/undo/undo.cpp | 18 ++++++++++++++++ app/widget/timelinewidget/undo/undo.h | 17 +++++++++++++++ .../view/timelineviewblockitem.cpp | 18 +++++++++++++--- 12 files changed, 115 insertions(+), 6 deletions(-) diff --git a/app/node/block/block.cpp b/app/node/block/block.cpp index 33cba06ad..fe14d9a8a 100644 --- a/app/node/block/block.cpp +++ b/app/node/block/block.cpp @@ -47,6 +47,12 @@ Block::Block() : media_in_input_->set_is_keyframable(false); AddInput(media_in_input_); + enabled_input_ = new NodeInput("enabled_in", NodeParam::kBoolean); + enabled_input_->SetConnectable(false); + enabled_input_->set_is_keyframable(false); + enabled_input_->set_standard_value(true); + AddInput(enabled_input_); + speed_input_ = new NodeInput("speed_in", NodeParam::kRational); speed_input_->set_standard_value(QVariant::fromValue(rational(1))); speed_input_->SetConnectable(false); @@ -168,6 +174,18 @@ bool Block::is_reversed() const return speed() < 0; } +bool Block::is_enabled() const +{ + return enabled_input_->get_standard_value().toBool(); +} + +void Block::set_enabled(bool e) +{ + enabled_input_->set_standard_value(e); + + emit EnabledChanged(); +} + QString Block::block_name() const { return name_input_->get_standard_value().toString(); @@ -177,7 +195,7 @@ void Block::set_block_name(const QString &name) { name_input_->set_standard_value(name); - // FIXME: Signal the name has changed to update UI objects + emit NameChanged(); } rational Block::SequenceToMediaTime(const rational &sequence_time) const diff --git a/app/node/block/block.h b/app/node/block/block.h index f8a74a782..a0feb41a9 100644 --- a/app/node/block/block.h +++ b/app/node/block/block.h @@ -75,6 +75,9 @@ public: bool is_still() const; bool is_reversed() const; + bool is_enabled() const; + void set_enabled(bool e); + QString block_name() const; void set_block_name(const QString& name); @@ -110,6 +113,10 @@ signals: void LinksChanged(); + void NameChanged(); + + void EnabledChanged(); + protected: rational SequenceToMediaTime(const rational& sequence_time) const; @@ -127,6 +134,7 @@ private: NodeInput* length_input_; NodeInput* media_in_input_; NodeInput* speed_input_; + NodeInput* enabled_input_; rational in_point_; rational out_point_; diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index 32fc313c0..f6aba73bb 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -198,7 +198,11 @@ Block *TrackOutput::BlockAtTime(const rational &time) const if (block && block->in() <= time && block->out() > time) { - return block; + if (block->is_enabled()) { + return block; + } else { + break; + } } } diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp index 015badff1..f6c77a1eb 100644 --- a/app/panel/timeline/timeline.cpp +++ b/app/panel/timeline/timeline.cpp @@ -153,6 +153,11 @@ void TimelinePanel::RippleDeleteInToOut() static_cast(GetTimeBasedWidget())->DeleteInToOut(true); } +void TimelinePanel::ToggleSelectedEnabled() +{ + static_cast(GetTimeBasedWidget())->ToggleSelectedEnabled(); +} + void TimelinePanel::InsertFootageAtPlayhead(const QList &footage) { static_cast(GetTimeBasedWidget())->InsertFootageAtPlayhead(footage); diff --git a/app/panel/timeline/timeline.h b/app/panel/timeline/timeline.h index f1b2825a7..83a53954d 100644 --- a/app/panel/timeline/timeline.h +++ b/app/panel/timeline/timeline.h @@ -77,6 +77,8 @@ public: virtual void RippleDeleteInToOut() override; + virtual void ToggleSelectedEnabled() override; + void InsertFootageAtPlayhead(const QList &footage); void OverwriteFootageAtPlayhead(const QList &footage); diff --git a/app/widget/menu/menushared.cpp b/app/widget/menu/menushared.cpp index 9faab0009..c493dc853 100644 --- a/app/widget/menu/menushared.cpp +++ b/app/widget/menu/menushared.cpp @@ -195,7 +195,7 @@ void MenuShared::DuplicateTriggered() void MenuShared::EnableDisableTriggered() { - qDebug() << "FIXME: Stub"; + PanelManager::instance()->CurrentlyFocused()->ToggleSelectedEnabled(); } void MenuShared::NestTriggered() diff --git a/app/widget/panel/panel.h b/app/widget/panel/panel.h index 72d2842d1..5e8ef8f16 100644 --- a/app/widget/panel/panel.h +++ b/app/widget/panel/panel.h @@ -154,6 +154,8 @@ public: virtual void RippleDeleteInToOut(){} + virtual void ToggleSelectedEnabled(){} + protected: /** * @brief paintEvent diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index c6fa5e4e2..1ea795671 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -730,6 +730,25 @@ void TimelineWidget::DeleteInToOut(bool ripple) Core::instance()->undo_stack()->push(command); } +void TimelineWidget::ToggleSelectedEnabled() +{ + QList items = GetSelectedBlocks(); + + if (items.isEmpty()) { + return; + } + + QUndoCommand* command = new QUndoCommand(); + + foreach (TimelineViewBlockItem* i, items) { + new BlockEnableDisableCommand(i->block(), + !i->block()->is_enabled(), + command); + } + + Core::instance()->undo_stack()->pushIfHasChildren(command); +} + QList TimelineWidget::GetSelectedBlocks() { QList list; @@ -988,6 +1007,8 @@ void TimelineWidget::AddBlock(Block *block, TrackReference track) connect(block, &Block::Refreshed, this, &TimelineWidget::BlockChanged); connect(block, &Block::LinksChanged, this, &TimelineWidget::PreviewUpdated); + connect(block, &Block::NameChanged, this, &TimelineWidget::PreviewUpdated); + connect(block, &Block::EnabledChanged, this, &TimelineWidget::PreviewUpdated); if (block->type() == Block::kClip) { connect(static_cast(block), &ClipBlock::PreviewUpdated, this, &TimelineWidget::PreviewUpdated); diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index a5acb759e..a00027602 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -88,6 +88,8 @@ public: void DeleteInToOut(bool ripple); + void ToggleSelectedEnabled(); + QList GetSelectedBlocks(); signals: diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index 3e52cafb0..826682f39 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -799,4 +799,22 @@ BlockLinkManyCommand::BlockLinkManyCommand(const QList blocks, bool lin } } +BlockEnableDisableCommand::BlockEnableDisableCommand(Block *block, bool enabled, QUndoCommand *parent) : + UndoCommand(parent), + block_(block), + old_enabled_(block_->is_enabled()), + new_enabled_(enabled) +{ +} + +void BlockEnableDisableCommand::redo_internal() +{ + block_->set_enabled(new_enabled_); +} + +void BlockEnableDisableCommand::undo_internal() +{ + block_->set_enabled(old_enabled_); +} + OLIVE_NAMESPACE_EXIT diff --git a/app/widget/timelinewidget/undo/undo.h b/app/widget/timelinewidget/undo/undo.h index 170e47aef..3098863c7 100644 --- a/app/widget/timelinewidget/undo/undo.h +++ b/app/widget/timelinewidget/undo/undo.h @@ -375,6 +375,23 @@ private: }; +class BlockEnableDisableCommand : public UndoCommand { +public: + BlockEnableDisableCommand(Block* block, bool enabled, QUndoCommand* parent = nullptr); + +protected: + virtual void redo_internal() override; + virtual void undo_internal() override; + +private: + Block* block_; + + bool old_enabled_; + + bool new_enabled_; + +}; + OLIVE_NAMESPACE_EXIT #endif // TIMELINEUNDOABLE_H diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.cpp b/app/widget/timelinewidget/view/timelineviewblockitem.cpp index a4edf3c4b..1f022450a 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.cpp +++ b/app/widget/timelinewidget/view/timelineviewblockitem.cpp @@ -80,8 +80,15 @@ void TimelineViewBlockItem::paint(QPainter *painter, const QStyleOptionGraphicsI QLinearGradient grad; grad.setStart(0, rect().top()); grad.setFinalStop(0, rect().bottom()); - grad.setColorAt(0.0, QColor(160, 160, 240)); - grad.setColorAt(1.0, QColor(128, 128, 192)); + + if (block_->is_enabled()) { + grad.setColorAt(0.0, QColor(160, 160, 240)); + grad.setColorAt(1.0, QColor(128, 128, 192)); + } else { + grad.setColorAt(0.0, QColor(160, 160, 160)); + grad.setColorAt(1.0, QColor(128, 128, 128)); + } + painter->fillRect(rect(), grad); if (option->state & QStyle::State_Selected) { @@ -121,7 +128,12 @@ void TimelineViewBlockItem::paint(QPainter *painter, const QStyleOptionGraphicsI painter->drawLine(rect().topLeft(), QPointF(rect().right(), rect().top())); painter->drawLine(rect().topLeft(), QPointF(rect().left(), rect().bottom() - 1)); - painter->setPen(Qt::white); + // Draw text + if (block_->is_enabled()) { + painter->setPen(Qt::white); + } else { + painter->setPen(Qt::lightGray); + } painter->drawText(rect(), static_cast(Qt::AlignLeft | Qt::AlignTop), block_->block_name()); // Linked clips are underlined