diff options
author | David Robillard <d@drobilla.net> | 2012-03-09 22:31:06 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2012-03-09 22:31:06 +0000 |
commit | a4811c2f8ca7d8e32d1230b58e8140b60fcee2a3 (patch) | |
tree | b7b4966f5f4200bcc4e5d2fd02bf50629f63bf3c /src/Canvas.cpp | |
parent | ef767283f7afc77c61961007e97474694160f7c3 (diff) | |
download | ganv-a4811c2f8ca7d8e32d1230b58e8140b60fcee2a3.tar.gz ganv-a4811c2f8ca7d8e32d1230b58e8140b60fcee2a3.tar.bz2 ganv-a4811c2f8ca7d8e32d1230b58e8140b60fcee2a3.zip |
Fix "disconnect all".
git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@4036 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/Canvas.cpp')
-rw-r--r-- | src/Canvas.cpp | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/src/Canvas.cpp b/src/Canvas.cpp index 15dedef..e353945 100644 --- a/src/Canvas.cpp +++ b/src/Canvas.cpp @@ -188,6 +188,9 @@ struct GanvCanvasImpl { void remove_edge(GanvEdge* c); bool are_connected(const GanvNode* tail, const GanvNode* head); + GanvEdge* + get_edge_between(const GanvNode* tail, + const GanvNode* head); typedef std::set<GanvEdge*, TailHeadOrder> Edges; typedef std::set<GanvEdge*, HeadTailOrder> DstEdges; @@ -598,9 +601,20 @@ GanvCanvasImpl::remove_edge(GanvEdge* edge) _selected_edges.erase(edge); _edges.erase(edge); _dst_edges.erase(edge); + gtk_object_destroy(GTK_OBJECT(edge)); } } +GanvEdge* +GanvCanvasImpl::get_edge_between(const GanvNode* tail, + const GanvNode* head) +{ + GanvEdgeKey key; + make_edge_search_key(&key, tail, head); + Edges::const_iterator i = _edges.find((GanvEdge*)&key); + return (i != _edges.end()) ? *i : NULL; +} + /** Return whether there is a edge between item1 and item2. * * Note that edges are directed, so this may return false when there @@ -610,9 +624,7 @@ bool GanvCanvasImpl::are_connected(const GanvNode* tail, const GanvNode* head) { - GanvEdgeKey key; - make_edge_search_key(&key, tail, head); - return (_edges.find((GanvEdge*)&key) != _edges.end()); + return get_edge_between(tail, head) != NULL; } void @@ -1500,12 +1512,11 @@ Canvas::set_default_placement(Node* i) } void -Canvas::remove_edge(Node* item1, - Node* item2) +Canvas::remove_edge(Node* item1, Node* item2) { Edge* edge = get_edge(item1, item2); if (edge) { - gtk_object_destroy(GTK_OBJECT(edge->gobj())); + impl()->remove_edge(edge->gobj()); } } @@ -1953,6 +1964,22 @@ ganv_canvas_add_node(GanvCanvas* canvas, } void +ganv_canvas_remove_edge_between(GanvCanvas* canvas, + GanvNode* tail, + GanvNode* head) +{ + canvas->impl->remove_edge(canvas->impl->get_edge_between(tail, head)); +} + +void +ganv_canvas_disconnect_edge(GanvCanvas* canvas, + GanvEdge* edge) +{ + g_signal_emit(canvas, signal_disconnect, 0, + edge->impl->tail, edge->impl->head, NULL); +} + +void ganv_canvas_remove_node(GanvCanvas* canvas, GanvNode* node) { |