diff options
author | David Robillard <d@drobilla.net> | 2007-01-08 02:41:36 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-01-08 02:41:36 +0000 |
commit | c5218b13bac00fbd8c3ceb99b46063b98bc1fdd3 (patch) | |
tree | cedcc8e24a0db8d0a40bcfececc25e66df2387e1 /src/libs/client | |
parent | 813e0cbb39809d7cf837e6b91a75815079502f47 (diff) | |
download | ingen-c5218b13bac00fbd8c3ceb99b46063b98bc1fdd3.tar.gz ingen-c5218b13bac00fbd8c3ceb99b46063b98bc1fdd3.tar.bz2 ingen-c5218b13bac00fbd8c3ceb99b46063b98bc1fdd3.zip |
Fix destruction of nodes with connections to parent patch ports.
git-svn-id: http://svn.drobilla.net/lad/ingen@241 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/client')
-rw-r--r-- | src/libs/client/ConnectionModel.h | 4 | ||||
-rw-r--r-- | src/libs/client/ObjectModel.h | 4 | ||||
-rw-r--r-- | src/libs/client/PatchModel.cpp | 28 |
3 files changed, 26 insertions, 10 deletions
diff --git a/src/libs/client/ConnectionModel.h b/src/libs/client/ConnectionModel.h index 6dc85405..f1112e33 100644 --- a/src/libs/client/ConnectionModel.h +++ b/src/libs/client/ConnectionModel.h @@ -62,8 +62,8 @@ private: void src_port_path(const string& s) { _src_port_path = s; } void dst_port_path(const string& s) { _dst_port_path = s; } - Path _src_port_path; ///< Only used if _src_port == NULL - Path _dst_port_path; ///< Only used if _dst_port == NULL + Path _src_port_path; ///< Only used if _src_port == NULL + Path _dst_port_path; ///< Only used if _dst_port == NULL SharedPtr<PortModel> _src_port; SharedPtr<PortModel> _dst_port; }; diff --git a/src/libs/client/ObjectModel.h b/src/libs/client/ObjectModel.h index 799399e9..12db367b 100644 --- a/src/libs/client/ObjectModel.h +++ b/src/libs/client/ObjectModel.h @@ -55,8 +55,8 @@ public: const Atom& get_metadata(const string& key) const; - const MetadataMap& metadata() const { return _metadata; } - inline const Path& path() const { return _path; } + const MetadataMap& metadata() const { return _metadata; } + inline const Path& path() const { return _path; } SharedPtr<ObjectModel> parent() const { return _parent; } // Signals diff --git a/src/libs/client/PatchModel.cpp b/src/libs/client/PatchModel.cpp index 22d39d42..1148ff61 100644 --- a/src/libs/client/PatchModel.cpp +++ b/src/libs/client/PatchModel.cpp @@ -124,14 +124,31 @@ PatchModel::remove_node(SharedPtr<NodeModel> nm) NodeModelMap::iterator i = m_nodes.find(nm->path().name()); if (i != m_nodes.end()) { assert(i->second == nm); + + // Remove any connections which referred to this node, + // since they can't possibly exist anymore + for (list<SharedPtr<ConnectionModel> >::iterator i = m_connections.begin(); + i != m_connections.end() ; ) { + list<SharedPtr<ConnectionModel> >::iterator next = i; + ++next; + SharedPtr<ConnectionModel> cm = (*i); + if (cm->src_port_path().parent() == nm->path() + || cm->dst_port_path().parent() == nm->path()) { + m_connections.erase(i); // cuts our reference + assert(!get_connection(cm->src_port_path(), cm->dst_port_path())); // no duplicates + removed_connection_sig.emit(cm->src_port_path(), cm->dst_port_path()); + } + i = next; + } + + // Remove the Node itself m_nodes.erase(i); removed_node_sig.emit(nm); - //i->second->parent().reset(); - return; + + } else { + cerr << "[PatchModel::remove_node] " << _path + << ": failed to find node " << nm->path().name() << endl; } - - cerr << "[PatchModel::remove_node] " << _path - << ": failed to find node " << nm->path().name() << endl; } #if 0 @@ -255,7 +272,6 @@ PatchModel::add_connection(SharedPtr<ConnectionModel> cm) void PatchModel::remove_connection(const string& src_port_path, const string& dst_port_path) { - cerr << path() << " PatchModel::remove_connection: " << src_port_path << " -> " << dst_port_path << endl; for (list<SharedPtr<ConnectionModel> >::iterator i = m_connections.begin(); i != m_connections.end(); ++i) { SharedPtr<ConnectionModel> cm = (*i); if (cm->src_port_path() == src_port_path && cm->dst_port_path() == dst_port_path) { |