summaryrefslogtreecommitdiff
path: root/src/gtkext/graph/edge.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-01-07 07:52:28 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-01-07 07:52:28 (GMT)
commite363028265c5d1ab9905dee4128b8d998dad06b1 (patch)
treef59f50386ed3e2df2fcf2c8b72aa9086e3af18b2 /src/gtkext/graph/edge.c
parent7b580bd991c5218b8c7d24fa0b396c380810cc73 (diff)
Improved links computation and handled loops in the graph layout.
Diffstat (limited to 'src/gtkext/graph/edge.c')
-rw-r--r--src/gtkext/graph/edge.c71
1 files changed, 31 insertions, 40 deletions
diff --git a/src/gtkext/graph/edge.c b/src/gtkext/graph/edge.c
index c07c6c5..e3844f3 100644
--- a/src/gtkext/graph/edge.c
+++ b/src/gtkext/graph/edge.c
@@ -38,12 +38,11 @@ struct _GGraphEdge
EdgeColor color; /* Couleur du rendu */
- const GdkPoint *start; /* Point de départ du lien */
- GdkPoint *mid[2]; /* Etapes intermédiaires */
- size_t m_count; /* Quantité de ces étapes */
- const GdkPoint *end; /* Point d'arrivée du lien */
-
- GdkPoint *points; /* Points de la ligne dessinée */
+ union
+ {
+ const GdkPoint **templates; /* Inspirations de coordonnées */
+ GdkPoint *points; /* Points de la ligne dessinée */
+ };
size_t count; /* Quantité de ces points */
};
@@ -157,8 +156,7 @@ static void g_graph_edge_dispose(GGraphEdge *edge)
static void g_graph_edge_finalize(GGraphEdge *edge)
{
- if (edge->points != NULL)
- free(edge->points);
+ free(edge->points);
G_OBJECT_CLASS(g_graph_edge_parent_class)->finalize(G_OBJECT(edge));
@@ -167,11 +165,9 @@ static void g_graph_edge_finalize(GGraphEdge *edge)
/******************************************************************************
* *
-* Paramètres : start = point de départ de la flêche. *
-* mid = points intermédiares variables. *
-* count = nombre de ces points fournis. *
-* end = point d'arrivée de la flêche. *
-* color = couleur de rendu à l'écran. *
+* Paramètres : templates = coordonnées des futurs points. *
+* count = nombre de ces points fournis. *
+* color = couleur de rendu à l'écran. *
* *
* Description : Etablit un lien graphique entre deux noeuds graphiques. *
* *
@@ -181,7 +177,7 @@ static void g_graph_edge_finalize(GGraphEdge *edge)
* *
******************************************************************************/
-GGraphEdge *_g_graph_edge_new(const GdkPoint *start, const GdkPoint **mid, size_t count, const GdkPoint *end, EdgeColor color)
+GGraphEdge *_g_graph_edge_new(const GdkPoint **templates, size_t count, EdgeColor color)
{
GGraphEdge *result; /* Structure à retourner */
@@ -189,16 +185,14 @@ GGraphEdge *_g_graph_edge_new(const GdkPoint *start, const GdkPoint **mid, size_
result->color = color;
- assert(count == 1 || count == 2);
+ assert(count == 4 || count == 6);
- result->start = start;
+ result->templates = malloc(count * sizeof(GdkPoint *));
+ memcpy(result->templates, templates, count * sizeof(GdkPoint *));
- memcpy(result->mid, mid, count * sizeof(GdkPoint));
- result->m_count = count;
+ result->count = count;
- result->end = end;
-
- return G_GRAPH_EDGE(result);
+ return result;
}
@@ -219,8 +213,14 @@ GGraphEdge *_g_graph_edge_new(const GdkPoint *start, const GdkPoint **mid, size_
void g_graph_edge_get_x_borders(const GGraphEdge *edge, gint *x1, gint *x2)
{
- *x1 = edge->start->x;
- *x2 = edge->end->x;
+ /**
+ * A l'appel de cette fonction, les informations des points n'ont
+ * pas encore été fixées ni recopiées.
+ */
+
+ *x1 = edge->templates[0]->x;
+ *x2 = edge->templates[edge->count - 1]->x;
+
}
@@ -238,29 +238,20 @@ void g_graph_edge_get_x_borders(const GGraphEdge *edge, gint *x1, gint *x2)
void g_graph_edge_resolve(GGraphEdge *edge)
{
- edge->count = 2 + 2 * edge->m_count;
- edge->points = (GdkPoint *)calloc(edge->count, sizeof(GdkPoint));
+ const GdkPoint **templates; /* Inspirations de coordonnées */
+ size_t i; /* Boucle de parcours */
- edge->points[0] = *edge->start;
+ templates = edge->templates;
- edge->points[1].x = edge->start->x;
- edge->points[1].y = edge->mid[0]->y;
+ edge->points = malloc(edge->count * sizeof(GdkPoint));
- if (edge->m_count == 1)
- {
- edge->points[2].x = edge->end->x;
- edge->points[2].y = edge->mid[0]->y;
- }
- else
+ for (i = 0; i < edge->count; i++)
{
- memcpy(&edge->points[2], edge->mid, edge->m_count * sizeof(GdkPoint));
-
- edge->points[4].x = edge->end->x;
- edge->points[4].y = edge->mid[3]->y;
-
+ edge->points[i].x = templates[i]->x;
+ edge->points[i].y = templates[i]->y;
}
- edge->points[edge->count - 1] = *edge->end;
+ free(templates);
}