diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index 204a675de..21fea333d 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -246,6 +246,7 @@ void NodeParamView::SetContexts(const QVector &contexts, bool group_mode foreach (Node *ctx, contexts_) { disconnect(ctx, &Node::NodeAddedToContext, this, &NodeParamView::NodeAddedToContext); + disconnect(ctx, &Node::NodeRemovedFromContext, this, &NodeParamView::NodeRemovedFromContext); } contexts_ = contexts; @@ -257,6 +258,7 @@ void NodeParamView::SetContexts(const QVector &contexts, bool group_mode // Queued so that if any further work is done in connecting this node to the context, it'll be // done before our sorting function is called connect(ctx, &Node::NodeAddedToContext, this, &NodeParamView::NodeAddedToContext, Qt::QueuedConnection); + connect(ctx, &Node::NodeRemovedFromContext, this, &NodeParamView::NodeRemovedFromContext, Qt::QueuedConnection); } if (keyframe_view_) { @@ -275,7 +277,7 @@ void NodeParamView::SetContexts(const QVector &contexts, bool group_mode item->setVisible(true); for (auto it=ctx->GetContextPositions().cbegin(); it!=ctx->GetContextPositions().cend(); it++) { - AddNode(it.key(), item); + AddNode(it.key(), ctx, item); } } @@ -389,7 +391,7 @@ void NodeParamView::QueueKeyframePositionUpdate() QMetaObject::invokeMethod(this, &NodeParamView::UpdateElementY, Qt::QueuedConnection); } -void NodeParamView::AddNode(Node *n, NodeParamViewContext *context) +void NodeParamView::AddNode(Node *n, Node *ctx, NodeParamViewContext *context) { if ((n->GetFlags() & Node::kDontShowInParamView) && !group_mode_) { return; @@ -402,6 +404,7 @@ void NodeParamView::AddNode(Node *n, NodeParamViewContext *context) connect(item, &NodeParamViewItem::PinToggled, this, &NodeParamView::PinNode); connect(item, &NodeParamViewItem::InputCheckedChanged, this, &NodeParamView::InputCheckBoxChanged); + item->SetContext(ctx); item->SetTimeTarget(GetTimeTarget()); item->SetTimebase(timebase()); item->SetTime(GetTime()); @@ -608,11 +611,19 @@ void NodeParamView::NodeAddedToContext(Node *n) Node *ctx = static_cast(sender()); NodeParamViewContext *item = GetContextItemFromContext(ctx); - AddNode(n, item); + AddNode(n, ctx, item); SortItemsInContext(item); } +void NodeParamView::NodeRemovedFromContext(Node *n) +{ + Node *ctx = static_cast(sender()); + NodeParamViewContext *item = GetContextItemFromContext(ctx); + + item->RemoveNode(n, ctx); +} + void NodeParamView::InputCheckBoxChanged(const NodeInput &input, bool e) { NodeGroup *group = static_cast(contexts_.first()); diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index ceceb58a5..56eb06677 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -93,7 +93,7 @@ private: void QueueKeyframePositionUpdate(); - void AddNode(Node* n, NodeParamViewContext *context); + void AddNode(Node* n, Node *ctx, NodeParamViewContext *context); void SortItemsInContext(NodeParamViewContext *context); @@ -136,6 +136,8 @@ private slots: void NodeAddedToContext(Node *n); + void NodeRemovedFromContext(Node *n); + void InputCheckBoxChanged(const NodeInput &input, bool e); void GroupInputPassthroughAdded(olive::NodeGroup *group, const olive::NodeInput &input); diff --git a/app/widget/nodeparamview/nodeparamviewcontext.cpp b/app/widget/nodeparamview/nodeparamviewcontext.cpp index 2c2ba5d33..1d969a3b1 100644 --- a/app/widget/nodeparamview/nodeparamviewcontext.cpp +++ b/app/widget/nodeparamview/nodeparamviewcontext.cpp @@ -51,8 +51,16 @@ void NodeParamViewContext::AddNode(NodeParamViewItem *item) dock_area_->AddItem(item); } -void NodeParamViewContext::RemoveNode(Node *node) +void NodeParamViewContext::RemoveNode(Node *node, Node *ctx) { + for (auto it=items_.begin(); it!=items_.end(); ) { + if (it.value()->GetContext() == ctx) { + delete it.value(); + it = items_.erase(it); + } else { + it++; + } + } } void NodeParamViewContext::Clear() diff --git a/app/widget/nodeparamview/nodeparamviewcontext.h b/app/widget/nodeparamview/nodeparamviewcontext.h index a8590271e..7f5a910e5 100644 --- a/app/widget/nodeparamview/nodeparamviewcontext.h +++ b/app/widget/nodeparamview/nodeparamviewcontext.h @@ -50,7 +50,7 @@ public: void AddNode(NodeParamViewItem *item); - void RemoveNode(Node *node); + void RemoveNode(Node *node, Node *ctx); void Clear(); diff --git a/app/widget/nodeparamview/nodeparamviewitem.cpp b/app/widget/nodeparamview/nodeparamviewitem.cpp index 997772ddf..7fedb2fea 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.cpp +++ b/app/widget/nodeparamview/nodeparamviewitem.cpp @@ -46,7 +46,8 @@ const int NodeParamViewItemBody::kMaxWidgetColumn = kKeyControlColumn; NodeParamViewItem::NodeParamViewItem(Node *node, NodeParamViewCheckBoxBehavior create_checkboxes, QWidget *parent) : super(parent), - node_(node) + node_(node), + ctx_(nullptr) { node_->Retranslate(); diff --git a/app/widget/nodeparamview/nodeparamviewitem.h b/app/widget/nodeparamview/nodeparamviewitem.h index e06d98d72..95ee238d8 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.h +++ b/app/widget/nodeparamview/nodeparamviewitem.h @@ -182,6 +182,16 @@ public: body_->SetTimebase(timebase); } + Node *GetContext() const + { + return ctx_; + } + + void SetContext(Node *ctx) + { + ctx_ = ctx; + } + Node* GetNode() const { return node_; @@ -218,6 +228,8 @@ private: Node* node_; + Node *ctx_; + rational time_; KeyframeView::NodeConnections keyframe_connections_;