From 61747adcabd33faf086c257843fb417bef74cb51 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sat, 23 Feb 2019 13:57:07 +0100
Subject: Reordered leaving edges with their loop blocks.

---
 src/gtkext/graph/cluster.c | 67 ++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 65 insertions(+), 2 deletions(-)

diff --git a/src/gtkext/graph/cluster.c b/src/gtkext/graph/cluster.c
index b19b115..5ead117 100644
--- a/src/gtkext/graph/cluster.c
+++ b/src/gtkext/graph/cluster.c
@@ -341,6 +341,9 @@ static size_t g_graph_cluster_find_incoming_link(const GGraphCluster *, const le
 /* Réordonne les blocs de départ de boucle au mieux. */
 static void g_graph_cluster_reorder_loop_blocks(GGraphCluster *);
 
+/* Réordonne le départ des liens en entrée de bloc. */
+static void g_graph_cluster_reorder_link_origins(GGraphCluster *, bool);
+
 /* Décale vers la droite un ensemble de blocs basiques. */
 static void g_graph_cluster_offset_x(GGraphCluster *, gint);
 
@@ -1529,10 +1532,13 @@ static void reorder_graph_rank_loop_blocks(graph_rank_t *grank)
 
             assert(k < grank->count);
 
-            memmove(&grank->clusters[1], &grank->clusters[0], k * sizeof(GGraphCluster *));
+            memmove(&grank->clusters[1], &grank->clusters[0],
+                    k * sizeof(GGraphCluster *));
 
             grank->clusters[0] = tmp;
 
+            g_graph_cluster_reorder_link_origins(tmp, true);
+
         }
 
         /* Placement des départs de boucle à droite ! */
@@ -1547,10 +1553,13 @@ static void reorder_graph_rank_loop_blocks(graph_rank_t *grank)
 
             assert(k < grank->count);
 
-            memmove(&grank->clusters[k], &grank->clusters[k + 1], (grank->count - k - 1) * sizeof(GGraphCluster *));
+            memmove(&grank->clusters[k], &grank->clusters[k + 1],
+                    (grank->count - k - 1) * sizeof(GGraphCluster *));
 
             grank->clusters[grank->count - 1] = tmp;
 
+            g_graph_cluster_reorder_link_origins(tmp, false);
+
         }
 
     }
@@ -2389,6 +2398,60 @@ static void g_graph_cluster_reorder_loop_blocks(GGraphCluster *cluster)
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : cluster = graphique de blocs à actualiser.                   *
+*                link    = lien à déplacer.                                   *
+*                left    = emplacement final : à gauche ou à droite ?         *
+*                                                                             *
+*  Description : Réordonne le départ des liens en entrée de bloc.             *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_graph_cluster_reorder_link_origins(GGraphCluster *cluster, bool left)
+{
+    size_t i;                               /* Boucle de parcours #1       */
+    leaving_link_t *origin;                 /* Autre extrémité du lien     */
+    GGraphCluster *parent;                  /* Parent du bloc courant      */
+    size_t k;                               /* Boucle de parcours #2       */
+
+    for (i = 0; i < cluster->ta_count; i++)
+    {
+        origin = cluster->top_anchors[i]->other;
+        parent = origin->owner;
+
+        for (k = 0; k < parent->ba_count; k++)
+            if (parent->bottom_anchors[k] == origin)
+                break;
+
+        assert(k < parent->ba_count);
+
+        if (left)
+        {
+            memmove(&parent->bottom_anchors[1], &parent->bottom_anchors[0],
+                    k * sizeof(leaving_link_t *));
+
+            parent->bottom_anchors[0] = origin;
+
+        }
+        else
+        {
+            memmove(&parent->bottom_anchors[k], &parent->bottom_anchors[k + 1],
+                    (parent->ba_count - k - 1) * sizeof(leaving_link_t *));
+
+            parent->bottom_anchors[parent->ba_count - 1] = origin;
+
+        }
+
+    }
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : cluster = graphique de blocs à actualiser.                   *
 *                offset  = décalage à appliquer.                              *
 *                                                                             *
 *  Description : Décale vers la droite un ensemble de blocs basiques.         *
-- 
cgit v0.11.2-87-g4458