began new infrastructure
Yep, this is another one of my "famous" sweeping rewrites. Expect things to break. Goals for this are: - Greatly simplify node connections (particularly with arrays) so the code requires less maintenance/is more stable - Redesign node structure to address issues where UI would stall for lengthy periods of time - Less reliance on shared ptrs/greater reliance on QObject system for inheritance/memory management - General code cleanup and improvements
This commit is contained in:
+11
-120
@@ -22,8 +22,7 @@
|
||||
|
||||
namespace olive {
|
||||
|
||||
NodeGraph::NodeGraph() :
|
||||
operation_stack_(0)
|
||||
NodeGraph::NodeGraph()
|
||||
{
|
||||
}
|
||||
|
||||
@@ -35,133 +34,25 @@ void NodeGraph::Clear()
|
||||
node_children_.clear();
|
||||
}
|
||||
|
||||
void NodeGraph::AddNode(Node *node)
|
||||
void NodeGraph::childEvent(QChildEvent *event)
|
||||
{
|
||||
if (ContainsNode(node)) {
|
||||
return;
|
||||
}
|
||||
Item::childEvent(event);
|
||||
|
||||
node->setParent(this);
|
||||
Node* node = dynamic_cast<Node*>(event->child());
|
||||
|
||||
connect(node, &Node::EdgeAdded, this, &NodeGraph::SignalEdgeAdded);
|
||||
connect(node, &Node::EdgeRemoved, this, &NodeGraph::SignalEdgeRemoved);
|
||||
if (node) {
|
||||
if (event->type() == QEvent::ChildAdded) {
|
||||
|
||||
node_children_.append(node);
|
||||
node_children_.append(node);
|
||||
emit NodeAdded(node);
|
||||
|
||||
emit NodeAdded(node);
|
||||
}
|
||||
} else if (event->type() == QEvent::ChildRemoved) {
|
||||
|
||||
void NodeGraph::BeginOperation()
|
||||
{
|
||||
operation_stack_++;
|
||||
}
|
||||
node_children_.removeOne(node);
|
||||
emit NodeRemoved(node);
|
||||
|
||||
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)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!node->CanBeDeleted()) {
|
||||
qWarning() << "Tried to delete a Node that's been flagged as not deletable";
|
||||
return;
|
||||
}
|
||||
|
||||
node->DisconnectAll();
|
||||
|
||||
disconnect(node, &Node::EdgeAdded, this, &NodeGraph::EdgeAdded);
|
||||
disconnect(node, &Node::EdgeRemoved, this, &NodeGraph::EdgeRemoved);
|
||||
|
||||
node->setParent(new_parent);
|
||||
|
||||
node_children_.removeAll(node);
|
||||
|
||||
emit NodeRemoved(node);
|
||||
}
|
||||
|
||||
const QList<Node *> &NodeGraph::nodes() const
|
||||
{
|
||||
return node_children_;
|
||||
}
|
||||
|
||||
bool NodeGraph::ContainsNode(Node *n) const
|
||||
{
|
||||
return (n->parent() == this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user