summaryrefslogtreecommitdiffstats
path: root/src/Canvas.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-03-09 22:31:06 +0000
committerDavid Robillard <d@drobilla.net>2012-03-09 22:31:06 +0000
commita4811c2f8ca7d8e32d1230b58e8140b60fcee2a3 (patch)
treeb7b4966f5f4200bcc4e5d2fd02bf50629f63bf3c /src/Canvas.cpp
parentef767283f7afc77c61961007e97474694160f7c3 (diff)
downloadganv-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.cpp39
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)
{