diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-02-14 11:28:45 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-02-14 11:28:45 (GMT) |
commit | 5ed40f0afbd58fbfdf05be7b2a10ab8d0819759f (patch) | |
tree | 5bbe3b347eed1af52e24feb05461f0c5f7df67ea /src/gtkext/graph | |
parent | c6d8ce055bb2db9adebe612f4dbac476ce39c024 (diff) |
Highlighted graph view edges.
Diffstat (limited to 'src/gtkext/graph')
-rw-r--r-- | src/gtkext/graph/cluster.c | 3 | ||||
-rw-r--r-- | src/gtkext/graph/edge.c | 135 | ||||
-rw-r--r-- | src/gtkext/graph/edge.h | 9 |
3 files changed, 120 insertions, 27 deletions
diff --git a/src/gtkext/graph/cluster.c b/src/gtkext/graph/cluster.c index 12f88bd..c4deeaa 100644 --- a/src/gtkext/graph/cluster.c +++ b/src/gtkext/graph/cluster.c @@ -279,9 +279,6 @@ struct _GGraphClusterClass /* Espace minimal vertical entre les blocs */ #define VERTICAL_MARGIN 15 -/* Espace minimal entre les liens */ -#define LINK_MARGIN 10 - /* Initialise la classe des mises en disposition graphique. */ static void g_graph_cluster_class_init(GGraphClusterClass *); diff --git a/src/gtkext/graph/edge.c b/src/gtkext/graph/edge.c index e3844f3..9a2f848 100644 --- a/src/gtkext/graph/edge.c +++ b/src/gtkext/graph/edge.c @@ -285,42 +285,131 @@ void g_graph_edge_offset(GGraphEdge *edge, gint dx, gint dy) /****************************************************************************** * * -* Paramètres : edge = ligne de rendu à manipuler. * -* cairo = assistant pour le rendu graphique. * -* arrow = indique le besoin en flèche à l'arrivée. * +* Paramètres : edge = ligne de rendu avec positions à consulter. * +* x = emplacement de la souris sur l'axe des abscisses. * +* y = emplacement de la souris sur l'axe des ordonnées. * * * -* Description : Dessine les liens graphiques enregistrés dans le moteur. * +* Description : Opère un décalage du lien dans une direction donnée. * * * -* Retour : - * +* Retour : true si un survol est en cours, false sinon. * * * * Remarques : - * * * ******************************************************************************/ -void g_graph_edge_draw(const GGraphEdge *edge, cairo_t *cairo, bool arrow) +bool g_graph_edge_detect_at(const GGraphEdge *edge, gint x, gint y) { + bool result; /* Bilan à retourner */ size_t i; /* Boucle de parcours */ + gint margin; /* Marge de précision */ + gint pts[2]; /* Points d'analyse ordonnés */ + gint inter[2]; /* Bilan d'intersection */ - switch (edge->color) + result = false; + + for (i = 1; i < edge->count; i++) { - default: - case EGC_DEFAULT: - cairo_set_source_rgb(cairo, 0, 0, 0); - break; - case EGC_GREEN: - cairo_set_source_rgb(cairo, 0, 0.6, 0); - break; - case EGC_RED: - cairo_set_source_rgb(cairo, 0.8, 0, 0); - break; - case EGC_BLUE: - cairo_set_source_rgb(cairo, 0, 0, 0.8); - break; - case EGC_DASHED_GRAY: - cairo_set_source_rgb(cairo, 0.4, 0.4, 0.4); - break; + /* Au niveau des abscisses */ + + if (edge->points[i - 1].x <= edge->points[i].x) + { + pts[0] = edge->points[i - 1].x; + pts[1] = edge->points[i].x; + margin = 1; + } + else + { + pts[0] = edge->points[i].x; + pts[1] = edge->points[i - 1].x; + margin = 1; + } + + margin *= (LINK_MARGIN / 2); + + inter[0] = MAX(pts[0] - margin, x); + inter[1] = MIN(pts[1] + margin, x); + + if (inter[0] > inter[1]) + continue; + + /* Au niveau des ordonnées */ + + if (edge->points[i - 1].y <= edge->points[i].y) + { + pts[0] = edge->points[i - 1].y; + pts[1] = edge->points[i].y; + margin = 1; + } + else + { + pts[0] = edge->points[i].y; + pts[1] = edge->points[i - 1].y; + margin = 1; + } + + margin *= (LINK_MARGIN / 2); + + inter[0] = MAX(pts[0] - margin, y); + inter[1] = MIN(pts[1] + margin, y); + + if (inter[0] > inter[1]) + continue; + + /* Détection ! */ + + result = true; + break; + } + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : edge = ligne de rendu à manipuler. * +* cairo = assistant pour le rendu graphique. * +* arrow = indique le besoin en flèche à l'arrivée. * +* selected = s'agit-il d'un lien sélectionné ? * +* * +* Description : Dessine les liens graphiques enregistrés dans le moteur. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_graph_edge_draw(const GGraphEdge *edge, cairo_t *cairo, bool arrow, bool selected) +{ + size_t i; /* Boucle de parcours */ + + if (selected) + cairo_set_source_rgb(cairo, 1.0, 1.0, 1.0); + + else + switch (edge->color) + { + default: + case EGC_DEFAULT: + cairo_set_source_rgb(cairo, 0, 0, 0); + break; + case EGC_GREEN: + cairo_set_source_rgb(cairo, 0, 0.6, 0); + break; + case EGC_RED: + cairo_set_source_rgb(cairo, 0.8, 0, 0); + break; + case EGC_BLUE: + cairo_set_source_rgb(cairo, 0, 0, 0.8); + break; + case EGC_DASHED_GRAY: + cairo_set_source_rgb(cairo, 0.4, 0.4, 0.4); + break; + } + switch (edge->color) { default: diff --git a/src/gtkext/graph/edge.h b/src/gtkext/graph/edge.h index 23fcf8d..e905685 100644 --- a/src/gtkext/graph/edge.h +++ b/src/gtkext/graph/edge.h @@ -60,6 +60,10 @@ typedef enum _EdgeColor } EdgeColor; +/* Espace minimal entre les liens */ +#define LINK_MARGIN 10 + + /* Indique le type défini par la GLib pour les liens graphiques entre noeuds. */ GType g_graph_edge_get_type(void); @@ -87,8 +91,11 @@ void g_graph_edge_resolve(GGraphEdge *); /* Opère un décalage du lien dans une direction donnée. */ void g_graph_edge_offset(GGraphEdge *, gint, gint); +/* Opère un décalage du lien dans une direction donnée. */ +bool g_graph_edge_detect_at(const GGraphEdge *, gint, gint); + /* Dessine les liens graphiques enregistrés dans le moteur. */ -void g_graph_edge_draw(const GGraphEdge *, cairo_t *, bool); +void g_graph_edge_draw(const GGraphEdge *, cairo_t *, bool, bool); |