summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gtkext/graph/cluster.c115
1 files 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 !
*