From 5700746ba57a511419341cb3cd664d6e2c97584a Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 12 Feb 2019 22:49:04 +0100
Subject: Fixed some overlaps in the graph view.

---
 src/gtkext/graph/cluster.c | 115 ++++++++++++++++++---------------------------
 1 file changed, 47 insertions(+), 68 deletions(-)

diff --git a/src/gtkext/graph/cluster.c b/src/gtkext/graph/cluster.c
index bc8f9dd..3aa6674 100644
--- a/src/gtkext/graph/cluster.c
+++ b/src/gtkext/graph/cluster.c
@@ -155,9 +155,6 @@ static int cmp_graph_rank(const graph_rank_t *, const graph_rank_t *);
 /* Etend un ensemble de blocs de même rang. */
 static void extend_graph_rank(graph_rank_t *, GGraphCluster *);
 
-/* Etablit les connexions entre blocs selon les rangs. */
-static bool setup_graph_rank_link_for_target(const graph_rank_t *, GGraphCluster *, GGraphCluster *, leaving_link_t *);
-
 /* Détermine l'emplacement requis d'un ensemble de blocs. */
 static void compute_graph_rank_needed_alloc(const graph_rank_t *, bool, GtkAllocation *);
 
@@ -304,6 +301,9 @@ static void g_graph_cluster_reset_allocation(GGraphCluster *);
 /* Complète un graphique avec un sous-ensemble de blocs. */
 static void g_graph_cluster_add_sub(GGraphCluster *, GGraphCluster *);
 
+/* Etablit les connexions entre blocs selon les rangs. */
+static void g_graph_cluster_setup_link_for_target(GGraphCluster *, GGraphCluster *, leaving_link_t *);
+
 /* Met en place les embryons de liens nécessaires. */
 static void g_graph_cluster_define_links(GGraphCluster *, GHashTable *);
 
@@ -845,62 +845,6 @@ static void extend_graph_rank(graph_rank_t *grank, GGraphCluster *cluster)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : grank   = ensemble de descendants d'un même rang.            *
-*                source  = bloc courant ou NULL pour limiter les calculs.     *
-*                target  = bloc ciblé pour l'arrivée d'un lien.               *
-*                leaving = représentation d'un lien sortant.                  *
-*                                                                             *
-*  Description : Etablit les connexions entre blocs selon les rangs.          *
-*                                                                             *
-*  Retour      : true si la cible a été rencontrée.                           *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static bool setup_graph_rank_link_for_target(const graph_rank_t *grank, GGraphCluster *source, GGraphCluster *target, leaving_link_t *leaving)
-{
-    bool result;                            /* Bilan à retourner           */
-    size_t level;                           /* Niveau du nouvel ensemble   */
-    size_t i;                               /* Boucle de parcours          */
-    size_t target_level;                    /* Rang du bloc ciblé          */
-
-    result = false;
-
-    if (source != NULL)
-        level = g_code_block_get_rank(source->block);
-
-    for (i = 0; i < grank->count && !result; i++)
-        if (grank->clusters[i] == target)
-        {
-            result = true;
-
-            target->parent_index = &leaving->index;
-
-            if (source != NULL)
-            {
-                target_level = get_graph_rank(grank);
-
-                /* Est-ce un lien qui doit être vertical ? */
-
-                if (target_level > (level + 1) && target_level > source->straight_level)
-                {
-                    source->has_straight = true;
-                    source->straight_level = target_level;
-                    source->straight_index = source->ba_count - 1;
-                }
-
-            }
-
-        }
-
-    return result;
-
-}
-
-
-/******************************************************************************
-*                                                                             *
 *  Paramètres  : grank = ensemble de descendants d'un même rang.              *
 *                last  = indique s'il s'agit du dernier étage de l'ensemble.  *
 *                alloc = emplacement idéal pour l'affichage. [OUT]            *
@@ -1698,6 +1642,47 @@ static void g_graph_cluster_add_sub(GGraphCluster *cluster, GGraphCluster *sub)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : grank   = ensemble de descendants d'un même rang.            *
+*                source  = bloc courant ou NULL pour limiter les calculs.     *
+*                target  = bloc ciblé pour l'arrivée d'un lien.               *
+*                leaving = représentation d'un lien sortant.                  *
+*                                                                             *
+*  Description : Etablit les connexions entre blocs selon les rangs.          *
+*                                                                             *
+*  Retour      : true si la cible a été rencontrée.                           *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_graph_cluster_setup_link_for_target(GGraphCluster *source, GGraphCluster *target, leaving_link_t *leaving)
+{
+    size_t level;                           /* Niveau du nouvel ensemble   */
+    size_t target_level;                    /* Rang du bloc ciblé          */
+
+    target->parent_index = &leaving->index;
+
+    if (source != NULL)
+    {
+        level = g_code_block_get_rank(source->block);
+        target_level = g_code_block_get_rank(target->block);
+
+        /* Est-ce un lien qui doit être vertical ? */
+
+        if (target_level > (level + 1) && target_level > source->straight_level)
+        {
+            source->has_straight = true;
+            source->straight_level = target_level;
+            source->straight_index = source->ba_count - 1;
+        }
+
+    }
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : cluster = graphique de blocs à actualiser.                   *
 *                all     = table regroupant tous les groupes créés.           *
 *                                                                             *
@@ -1760,9 +1745,7 @@ static void g_graph_cluster_define_links(GGraphCluster *cluster, GHashTable *all
 
                 /* Etablissement d'un embryon de lien */
 
-                for (j = 0; j < cluster->ranks_count; j++)
-                    if (setup_graph_rank_link_for_target(&cluster->ranks[j], cluster, target, leaving))
-                        break;
+                g_graph_cluster_setup_link_for_target(cluster, target, leaving);
 
                 break;
 
@@ -1797,9 +1780,7 @@ static void g_graph_cluster_define_links(GGraphCluster *cluster, GHashTable *all
 
                 /* Etablissement d'un embryon de lien */
 
-                for (j = 0; j < cluster->ranks_count; j++)
-                    if (setup_graph_rank_link_for_target(&cluster->ranks[j], NULL, target, leaving))
-                        break;
+                g_graph_cluster_setup_link_for_target(NULL, target, leaving);
 
                 break;
 
@@ -1817,10 +1798,8 @@ static void g_graph_cluster_define_links(GGraphCluster *cluster, GHashTable *all
 
     /* Doit-on forcer un lien strictement vertical ? */
 
-    if (cluster->ba_count == 1)
+    if (cluster->ba_count == 1 && !cluster->has_straight)
     {
-        assert(!cluster->has_straight);
-
         /**
          * Attention : les boucles aussi ont un seul lien sortant !
          *
-- 
cgit v0.11.2-87-g4458