summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kost <ensonic@users.sf.net>2010-10-10 23:47:42 +0300
committerStefan Kost <ensonic@users.sf.net>2010-10-10 23:47:42 +0300
commitc3fc099f8a6edac307a2a9f10d3a5f08c0a5acc0 (patch)
treed985e9a870e82f9a9c85d555f2f623bfb16f80cf
parent3290f09696dc94007b64b49f33fadd52efcc42e6 (diff)
ui: hide proxy pads from the ui to save space
-rw-r--r--src/ui/main-window.c96
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,