summaryrefslogtreecommitdiff
path: root/src/gtkext/graph
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
parentc6d8ce055bb2db9adebe612f4dbac476ce39c024 (diff)
Highlighted graph view edges.
Diffstat (limited to 'src/gtkext/graph')
-rw-r--r--src/gtkext/graph/cluster.c3
-rw-r--r--src/gtkext/graph/edge.c135
-rw-r--r--src/gtkext/graph/edge.h9
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);