summaryrefslogtreecommitdiff
path: root/src/gtkext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-02-23 12:57:07 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-02-23 12:57:07 (GMT)
commit61747adcabd33faf086c257843fb417bef74cb51 (patch)
tree71bc41c29b77a109ea828b716fbd1632bc996086 /src/gtkext
parent51841cd4d88225580ac55bce0d9d131515737a23 (diff)
Reordered leaving edges with their loop blocks.
Diffstat (limited to 'src/gtkext')
-rw-r--r--src/gtkext/graph/cluster.c67
1 files 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. *