summaryrefslogtreecommitdiff
path: root/src/gtkext/graph/node.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2013-05-26 10:49:51 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2013-05-26 10:49:51 (GMT)
commitd80df591b6104c98d21e1db5143610fb84e35941 (patch)
treeb17d441e544b68f8433c45ba8a177242317a3bce /src/gtkext/graph/node.c
parent114e769bc9c3dc48f0293f080d687451e32220e3 (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.c98
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;
+
+}
+