diff options
Diffstat (limited to 'src/gtkext/graph/leaving.c')
-rw-r--r-- | src/gtkext/graph/leaving.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/gtkext/graph/leaving.c b/src/gtkext/graph/leaving.c index ad07f04..3147784 100644 --- a/src/gtkext/graph/leaving.c +++ b/src/gtkext/graph/leaving.c @@ -24,6 +24,7 @@ #include "leaving.h" +#include <assert.h> #include <malloc.h> @@ -105,3 +106,126 @@ gint compute_leaving_link_position(const leaving_link_t *link) return result; } + + +/****************************************************************************** +* * +* Paramètres : link = information sur un lien à consulter. * +* * +* Description : Détermine une direction prise par un lien à son départ. * +* * +* Retour : Direction prise à l'écran. * +* * +* Remarques : - * +* * +******************************************************************************/ + +LeavingLinkDir get_leaving_link_direction(const leaving_link_t *link) +{ + 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 */ + 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); + + x2 = g_graph_cluster_compute_incoming_link_position(owner, idx); + + if (x1 < x2) + result = LLD_TO_RIGHT; + + else if (x1 > x2) + result = LLD_TO_LEFT; + + else + result = LLD_NO_PREF; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : a = premier lien entrant à comparer. * +* b = second lien entrant à comparer. * +* dir = complément d'information quant à la direction traitée. * +* * +* Description : Compare deux liens sortants. * +* * +* Retour : Bilan de comparaison. * +* * +* Remarques : - * +* * +******************************************************************************/ + +int cmp_leaving_links(const leaving_link_t **a, const leaving_link_t **b, const LeavingLinkDir *dir) +{ + int result; /* Bilan à retourner */ + GGraphCluster *owner; /* Raccourci vers le proprio */ + gint pos_a[2]; /* Points de départ pour A */ + GtkAllocation alloc; /* Emplacement de cluster */ + gint pos_b[2]; /* Points 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; + + if (!g_graph_cluster_compute_min_max_bottom(owner, pos_a)) + { + g_graph_cluster_get_allocation(owner, &alloc); + + pos_a[0] = alloc.y; + pos_a[1] = alloc.y; + + } + + owner = (*b)->other->owner; + + pos_b[0] = G_MAXINT; + pos_b[1] = 0; + + if (!g_graph_cluster_compute_min_max_bottom(owner, pos_b)) + { + g_graph_cluster_get_allocation(owner, &alloc); + + pos_b[0] = alloc.y; + pos_b[1] = alloc.y; + + } + + /* Comparaison */ + + if (pos_a[1] < pos_b[1]) + result = -1; + + else if (pos_a[1] > pos_b[1]) + 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; + + } + + if (*dir == LLD_TO_RIGHT) + result *= -1; + + return result; + +} |