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.c124
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;
+
+}