nodes: allow stalling graph signals until an operation is over
This commit is contained in:
+87
-2
@@ -22,6 +22,11 @@
|
||||
|
||||
OLIVE_NAMESPACE_ENTER
|
||||
|
||||
NodeGraph::NodeGraph() :
|
||||
operation_stack_(0)
|
||||
{
|
||||
}
|
||||
|
||||
void NodeGraph::Clear()
|
||||
{
|
||||
foreach (Node* node, node_children_) {
|
||||
@@ -38,14 +43,94 @@ void NodeGraph::AddNode(Node *node)
|
||||
|
||||
node->setParent(this);
|
||||
|
||||
connect(node, &Node::EdgeAdded, this, &NodeGraph::EdgeAdded);
|
||||
connect(node, &Node::EdgeRemoved, this, &NodeGraph::EdgeRemoved);
|
||||
connect(node, &Node::EdgeAdded, this, &NodeGraph::SignalEdgeAdded);
|
||||
connect(node, &Node::EdgeRemoved, this, &NodeGraph::SignalEdgeRemoved);
|
||||
|
||||
node_children_.append(node);
|
||||
|
||||
emit NodeAdded(node);
|
||||
}
|
||||
|
||||
void NodeGraph::BeginOperation()
|
||||
{
|
||||
operation_stack_++;
|
||||
}
|
||||
|
||||
void NodeGraph::EndOperation()
|
||||
{
|
||||
operation_stack_--;
|
||||
|
||||
if (!operation_stack_) {
|
||||
// Signal everything that we cached during the operation
|
||||
|
||||
// First, signal the removed edges
|
||||
foreach (NodeEdgePtr e, cached_removed_edges_) {
|
||||
emit EdgeRemoved(e);
|
||||
}
|
||||
cached_removed_edges_.clear();
|
||||
|
||||
// Next, signal the removed nodes
|
||||
foreach (Node* n, cached_removed_nodes_) {
|
||||
emit NodeRemoved(n);
|
||||
}
|
||||
cached_removed_nodes_.clear();
|
||||
|
||||
// Next, signal the added nodes
|
||||
foreach (Node* n, cached_added_nodes_) {
|
||||
emit NodeAdded(n);
|
||||
}
|
||||
cached_added_nodes_.clear();
|
||||
|
||||
// Finally, signal the added edges
|
||||
foreach (NodeEdgePtr e, cached_added_edges_) {
|
||||
emit EdgeAdded(e);
|
||||
}
|
||||
cached_added_edges_.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void NodeGraph::SignalNodeAdded(Node* node)
|
||||
{
|
||||
if (!operation_stack_) {
|
||||
emit NodeAdded(node);
|
||||
} else if (!cached_removed_nodes_.removeOne(node)) {
|
||||
// If we already removed this node during the operation (appending a signal to
|
||||
// cached_removed_nodes_), we just remove that instead of appending a new signal. However if we
|
||||
// didn't (removeOne returning false), only then do we append an add signal
|
||||
cached_added_nodes_.append(node);
|
||||
}
|
||||
}
|
||||
|
||||
void NodeGraph::SignalNodeRemoved(Node *node)
|
||||
{
|
||||
if (!operation_stack_) {
|
||||
emit NodeRemoved(node);
|
||||
} else if (!cached_added_nodes_.removeOne(node)) {
|
||||
// See SignalNodeAdded() for explanation of this
|
||||
cached_removed_nodes_.append(node);
|
||||
}
|
||||
}
|
||||
|
||||
void NodeGraph::SignalEdgeAdded(NodeEdgePtr edge)
|
||||
{
|
||||
if (!operation_stack_) {
|
||||
emit EdgeAdded(edge);
|
||||
} else if (!cached_removed_edges_.removeOne(edge)) {
|
||||
// See SignalNodeAdded() for explanation of this
|
||||
cached_added_edges_.append(edge);
|
||||
}
|
||||
}
|
||||
|
||||
void NodeGraph::SignalEdgeRemoved(NodeEdgePtr edge)
|
||||
{
|
||||
if (!operation_stack_) {
|
||||
emit EdgeRemoved(edge);
|
||||
} else if (!cached_added_edges_.removeOne(edge)) {
|
||||
// See SignalNodeAdded() for explanation of this
|
||||
cached_removed_edges_.append(edge);
|
||||
}
|
||||
}
|
||||
|
||||
void NodeGraph::TakeNode(Node *node, QObject* new_parent)
|
||||
{
|
||||
if (!ContainsNode(node)) {
|
||||
|
||||
Reference in New Issue
Block a user