diff options
author | Stefan Kost <ensonic@users.sf.net> | 2010-10-10 23:47:42 +0300 |
---|---|---|
committer | Stefan Kost <ensonic@users.sf.net> | 2010-10-10 23:47:42 +0300 |
commit | c3fc099f8a6edac307a2a9f10d3a5f08c0a5acc0 (patch) | |
tree | d985e9a870e82f9a9c85d555f2f623bfb16f80cf | |
parent | 3290f09696dc94007b64b49f33fadd52efcc42e6 (diff) |
ui: hide proxy pads from the ui to save space
-rw-r--r-- | src/ui/main-window.c | 96 |
1 files changed, 81 insertions, 15 deletions
diff --git a/src/ui/main-window.c b/src/ui/main-window.c index 53f9d28..373681e 100644 --- a/src/ui/main-window.c +++ b/src/ui/main-window.c @@ -197,9 +197,16 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) guint *bin_z_order, z_ix; /* FIXME: use mode to avoid some work if e.g. only a link has been changed - * unfortunately graphviz does not seem to like even modifications and + * unfortunately graphviz does not seem to like even modifications and * relayouting */ + + /* hide proxy pads to save space in the graph: + * - never add proxy pads + * - when adding the links + * - never add ghost-proxy pad links + * - modify pad->proxypad link to pad->ghostpad links + */ // destroy old graph gvFreeLayout (self->priv->gvc,self->priv->graph); @@ -277,17 +284,26 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) for (i = 0; i < arr->len; i++) { GstTLPad *item = arr->pdata[i]; if(item) { - GstTLElement *pitem = (GstTLElement *)g_ptr_array_check (parr,item->elem_ix); - - parent = (pitem && pitem->graph) ? pitem->graph : root; - sprintf (iname,"p%d",item->pad_ix); - item->node = agnode (parent, iname); - item->elem = pitem; - if (item->name) { - agsafeset (item->node, "label", item->name, ""); + /* skip proxy pads */ + if (item->pad_type!=2) { + GstTLElement *pitem = (GstTLElement *)g_ptr_array_check (parr,item->elem_ix); + + parent = (pitem && pitem->graph) ? pitem->graph : root; + sprintf (iname,"p%d",item->pad_ix); + item->node = agnode (parent, iname); + item->elem = pitem; + if (item->name) { + agsafeset (item->node, "label", item->name, ""); + } + TRACE("[%2d:p] label=%s, parent=%u,%p = %p",i, + (item->name?item->name:""),item->elem_ix,parent,item->node); + } else { + if (item->ci_group) { + gint child_num = goo_canvas_item_find_child (self->priv->canvas_root, item->ci_group); + goo_canvas_item_remove_child (self->priv->canvas_root, child_num); + item->ci_group = NULL; + } } - TRACE("[%2d:p] label=%s, parent=%u,%p = %p",i, - (item->name?item->name:""),item->elem_ix,parent,item->node); } } @@ -301,7 +317,57 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) GstTLPad *pitem2=(GstTLPad *)g_ptr_array_check (parr,item->sink_pad_ix); if (pitem1 && pitem2) { - item->edge = agedge (root, pitem1->node, pitem2->node); + /* skip ghost <-> proxy edges, find proxy bypass link */ + if (pitem1->pad_type==2 || pitem2->pad_type==2) { + gboolean is_int_link=FALSE; + + if (pitem1->pad_type==1 && (pitem1->elem_ix == pitem2->elem_ix)) + is_int_link = TRUE; + if (pitem2->pad_type==1 && (pitem2->elem_ix == pitem1->elem_ix)) + is_int_link = TRUE; + + if (!is_int_link) { + guint j; + GstTLPad *pitem3; + + /* find a link */ + if (pitem1->pad_type==2) { + for (j = 0; j < arr->len; j++) { + GstTLLink *bypass_item = arr->pdata[j]; + if(bypass_item) { + if (item->src_pad_ix == bypass_item->sink_pad_ix) { + if ((pitem3=(GstTLPad *)g_ptr_array_check (parr, bypass_item->src_pad_ix))) { + pitem1 = pitem3; + item->edge = agedge (root, pitem1->node, pitem2->node); + break; + } + } + } + } + } + if (pitem2->pad_type==2) { + for (j = 0; j < arr->len; j++) { + GstTLLink *bypass_item = arr->pdata[j]; + if(bypass_item) { + if (item->sink_pad_ix == bypass_item->src_pad_ix) { + if ((pitem3=(GstTLPad *)g_ptr_array_check (parr, bypass_item->sink_pad_ix))) { + pitem2 = pitem3; + item->edge = agedge (root, pitem1->node, pitem2->node); + break; + } + } + } + } + } + } + } else { + item->edge = agedge (root, pitem1->node, pitem2->node); + } + } + if (!item->edge && item->ci_line) { + gint child_num = goo_canvas_item_find_child (self->priv->canvas_root, item->ci_line); + goo_canvas_item_remove_child (self->priv->canvas_root, child_num); + item->ci_line = NULL; } item->ns = pitem1; item->ne = pitem2; @@ -463,7 +529,7 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) gchar *s1, *s2; gint x, y, w = 0, h = 0; - if (!item) + if (!item || !item->node) continue; if ((attr = agget (item->node, "pos"))) { @@ -558,7 +624,7 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) gchar *s1,*s2; gdouble x1,y1,x2,y2; - if (!item || !item->ns || !item->ne) + if (!item || !item->ns || !item->ne || !item->edge) continue; // FIXME: parse the "pos" attribute @@ -593,7 +659,7 @@ refresh_layout (GstTLMainWindow *self, GstTLRefreshMode mode) goo_canvas_item_lower (item->ci_line,NULL); } else { - if ((item->ns->pad_type!=0) && (item->ne->pad_type!=0)) { + if ((item->ns->pad_type!=0) || (item->ne->pad_type!=0)) { item->ci_line = goo_canvas_polyline_new (self->priv->canvas_root, FALSE, 2, x1, y1, x2, y2, "stroke-color-rgba", 0x204a87ff, |