diff options
Diffstat (limited to 'src/gtkext/graph/leaving.c')
-rw-r--r-- | src/gtkext/graph/leaving.c | 95 |
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; |