summaryrefslogtreecommitdiff
path: root/src/gtkext/graph/edge.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-02-14 11:28:45 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-02-14 11:28:45 (GMT)
commit5ed40f0afbd58fbfdf05be7b2a10ab8d0819759f (patch)
tree5bbe3b347eed1af52e24feb05461f0c5f7df67ea /src/gtkext/graph/edge.c
parentc6d8ce055bb2db9adebe612f4dbac476ce39c024 (diff)
Highlighted graph view edges.
Diffstat (limited to 'src/gtkext/graph/edge.c')
-rw-r--r--src/gtkext/graph/edge.c135
1 files changed, 112 insertions, 23 deletions
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: