summaryrefslogtreecommitdiff
path: root/src/gtkext/graph/leaving.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkext/graph/leaving.c')
-rw-r--r--src/gtkext/graph/leaving.c95
1 files changed, 52 insertions, 43 deletions
diff --git a/src/gtkext/graph/leaving.c b/src/gtkext/graph/leaving.c
index 3147784..70db5f3 100644
--- a/src/gtkext/graph/leaving.c
+++ b/src/gtkext/graph/leaving.c
@@ -111,6 +111,8 @@ gint compute_leaving_link_position(const leaving_link_t *link)
/******************************************************************************
* *
* Paramètres : link = information sur un lien à consulter. *
+* x1 = abscisse de départ du lien d'origine. *
+* max = ordonnée la plus profonde à ne pas dépasser. *
* *
* Description : Détermine une direction prise par un lien à son départ. *
* *
@@ -120,30 +122,51 @@ gint compute_leaving_link_position(const leaving_link_t *link)
* *
******************************************************************************/
-LeavingLinkDir get_leaving_link_direction(const leaving_link_t *link)
+LeavingLinkDir get_leaving_link_direction(const leaving_link_t *link, gint x1, gint max)
{
LeavingLinkDir result; /* Préférence à retourner */
- gint x1; /* Abscisse de départ de lien */
GGraphCluster *owner; /* Raccourci vers le proprio */
- size_t idx; /* Indice du lien entrant */
+ GtkAllocation alloc; /* Emplacement reservé */
gint x2; /* Abscisse d'arrivée de lien */
- x1 = compute_leaving_link_position(link);
-
owner = link->other->owner;
- idx = g_graph_cluster_find_incoming_link(owner, link);
+ g_graph_cluster_get_allocation(owner, &alloc);
- x2 = g_graph_cluster_compute_incoming_link_position(owner, idx);
+ if (alloc.y > max)
+ result = LLD_NO_PREF;
- if (x1 < x2)
- result = LLD_TO_RIGHT;
+ else
+ {
+ result = g_graph_cluster_get_link_direction(owner, x1, max);
- else if (x1 > x2)
- result = LLD_TO_LEFT;
+ if (result == LLD_NO_PREF)
+ {
+ /**
+ * Les liens ne sont pas encore ordonnés avec leur indice final.
+ * Donc on choisit de faire au plus simple, et donc au plus rapide.
+ *
+ * Une alternative viable, mais tout aussi imprécise, serait d'appeler :
+ *
+ * idx = g_graph_cluster_find_incoming_link(owner, link);
+ *
+ * x2 = g_graph_cluster_compute_incoming_link_position(owner, idx);
+ */
- else
- result = LLD_NO_PREF;
+ x2 = alloc.x + alloc.width / 2;
+
+ if (x1 < x2)
+ result = LLD_TO_RIGHT;
+
+ else if (x1 > x2)
+ result = LLD_TO_LEFT;
+
+ else
+ result = LLD_NO_PREF;
+
+ }
+
+ }
return result;
@@ -152,9 +175,9 @@ LeavingLinkDir get_leaving_link_direction(const leaving_link_t *link)
/******************************************************************************
* *
-* Paramètres : a = premier lien entrant à comparer. *
-* b = second lien entrant à comparer. *
-* dir = complément d'information quant à la direction traitée. *
+* Paramètres : a = premier lien entrant à comparer. *
+* b = second lien entrant à comparer. *
+* info = compléments d'information pour l'opération. *
* *
* Description : Compare deux liens sortants. *
* *
@@ -164,66 +187,52 @@ LeavingLinkDir get_leaving_link_direction(const leaving_link_t *link)
* *
******************************************************************************/
-int cmp_leaving_links(const leaving_link_t **a, const leaving_link_t **b, const LeavingLinkDir *dir)
+int cmp_leaving_links(const leaving_link_t **a, const leaving_link_t **b, const const leaving_cmp_info_t *info)
{
int result; /* Bilan à retourner */
GGraphCluster *owner; /* Raccourci vers le proprio */
- gint pos_a[2]; /* Points de départ pour A */
+ gint pos_a; /* Point de départ pour A */
GtkAllocation alloc; /* Emplacement de cluster */
- gint pos_b[2]; /* Points de départ pour B */
+ gint pos_b; /* Point de départ pour B */
/* Calcul des ordonnées des points de chute */
owner = (*a)->other->owner;
- pos_a[0] = G_MAXINT;
- pos_a[1] = 0;
+ pos_a = G_MAXINT;
- if (!g_graph_cluster_compute_min_max_bottom(owner, pos_a))
+ if (!g_graph_cluster_compute_min_y_target((*a)->other->owner, info->root, &pos_a))
{
g_graph_cluster_get_allocation(owner, &alloc);
- pos_a[0] = alloc.y;
- pos_a[1] = alloc.y;
+ pos_a = alloc.y;
}
owner = (*b)->other->owner;
- pos_b[0] = G_MAXINT;
- pos_b[1] = 0;
+ pos_b = G_MAXINT;
- if (!g_graph_cluster_compute_min_max_bottom(owner, pos_b))
+ if (!g_graph_cluster_compute_min_y_target((*b)->other->owner, info->root, &pos_b))
{
g_graph_cluster_get_allocation(owner, &alloc);
- pos_b[0] = alloc.y;
- pos_b[1] = alloc.y;
+ pos_b = alloc.y;
}
/* Comparaison */
- if (pos_a[1] < pos_b[1])
+ if (pos_a < pos_b)
result = -1;
- else if (pos_a[1] > pos_b[1])
+ else if (pos_a > pos_b)
result = 1;
else
- {
- if (pos_a[0] < pos_b[0])
- result = -1;
-
- else if (pos_a[0] > pos_b[0])
- result = 1;
-
- else
- result = 0;
-
- }
+ result = 0;
- if (*dir == LLD_TO_RIGHT)
+ if (info->dir == LLD_TO_RIGHT)
result *= -1;
return result;