From 61747adcabd33faf086c257843fb417bef74cb51 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard 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