diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2013-05-26 10:49:51 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2013-05-26 10:49:51 (GMT) |
commit | d80df591b6104c98d21e1db5143610fb84e35941 (patch) | |
tree | b17d441e544b68f8433c45ba8a177242317a3bce /src/gtkext/graph/node.c | |
parent | 114e769bc9c3dc48f0293f080d687451e32220e3 (diff) |
Improved the graph rendering.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@347 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext/graph/node.c')
-rw-r--r-- | src/gtkext/graph/node.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/gtkext/graph/node.c b/src/gtkext/graph/node.c index 7b1d2b3..47531e2 100644 --- a/src/gtkext/graph/node.c +++ b/src/gtkext/graph/node.c @@ -274,6 +274,19 @@ void g_graph_node_reset_position(GGraphNode *node) void g_graph_node_set_position(GGraphNode *node, gint *x, gint *y) { +#if 1 + if (x != NULL && node->pending_x != 0) + { + *x += node->pending_x; + printf(" ((%p)) adding %d => %d\n", node, node->pending_x, *x); + node->pending_x = 0; + } + if (y != NULL && node->pending_y != 0) + { + *y += node->pending_y; + node->pending_y = 0; + } +#endif node->set_pos(node, x, y); } @@ -281,6 +294,51 @@ void g_graph_node_set_position(GGraphNode *node, gint *x, gint *y) /****************************************************************************** * * +* Paramètres : node = noeud graphique à manipuler. * +* x = éventuelle abscisse à intégrer ou NULL. * +* y = éventuelle ordonnée à intégrer ou NULL. * +* * +* Description : Prépare la position du noeud pour l'alignement des liens. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_graph_node_set_pending_position(GGraphNode *node, gint *x, gint *y) +{ + gint cur_x; /* Abscisse courante */ + gint cur_y; /* Ordonnée courante */ + bool update_x; /* Mise à jour des abscisses */ + bool update_y; /* Mise à jour des ordonnées */ + + g_graph_node_get_position(node, &cur_x, &cur_y); + + if (x != NULL) + { + update_x = (cur_x != UNINITIALIZED_NODE_POS); + if (!update_x) node->pending_x += *x; + } + else update_x = false; + + if (y != NULL) + { + update_y = (cur_y != UNINITIALIZED_NODE_POS); + if (!update_y) node->pending_y += *y; + } + else update_y = false; + + if (update_x || update_y) + g_graph_node_set_position(node, + update_x ? cur_x + *x : NULL, + update_y ? cur_x + *y : NULL); + +} + + +/****************************************************************************** +* * * Paramètres : node = noeud graphique à consulter. * * x = éventuelle abscisse à recevoir ou NULL. [OUT] * * y = éventuelle ordonnée à recevoir ou NULL. [OUT] * @@ -367,6 +425,46 @@ GGraphNode *g_graph_node_find_container(GGraphNode *nodes, GGraphNode *target) } +/****************************************************************************** +* * +* Paramètres : nodes = noeud au sommet de la hiérarchie. * +* ref = noeud indiquant le niveau de référence. * +* target = élément à retrouver dans l'ensemble de noeuds. * +* * +* Description : Recherche le noeud contenant un autre noeud à un même niveau.* +* * +* Retour : Noeud trouvé ou NULL si aucun. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GGraphNode *g_graph_node_find_container_at_same_level(GGraphNode *nodes, GGraphNode *ref, GGraphNode *target) +{ + GGraphNode *result; /* Trouvaille à retourner */ + GGraphNode *level; /* Niveau de référence */ + GGraphNode *container; /* Support de la cible */ + + result = NULL; + + level = g_graph_node_find_container(nodes, ref); + + container = g_graph_node_find_container(nodes, target); + + if (container == level) + result = target; + else + { + if (container == NULL) + result = NULL; + else + result = g_graph_node_find_container_at_same_level(nodes, ref, container); + } + + return result; + +} + |