summaryrefslogtreecommitdiff
path: root/src/gtkext/gtkgraphdisplay.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkext/gtkgraphdisplay.c')
-rw-r--r--src/gtkext/gtkgraphdisplay.c44
1 files changed, 38 insertions, 6 deletions
diff --git a/src/gtkext/gtkgraphdisplay.c b/src/gtkext/gtkgraphdisplay.c
index 51ca344..0915f3a 100644
--- a/src/gtkext/gtkgraphdisplay.c
+++ b/src/gtkext/gtkgraphdisplay.c
@@ -54,6 +54,7 @@ struct _GtkGraphDisplay
GGraphEdge **edges; /* Liens entre les noeuds */
size_t edges_count; /* Quantité de ces liens */
+ size_t hl_edge_index; /* Indice du lien survolé */
gdouble start_x; /* Abscisse du point de souris */
gdouble start_y; /* Ordonnée du point de souris */
@@ -214,7 +215,8 @@ static void gtk_graph_display_init(GtkGraphDisplay *display)
G_CALLBACK(gtk_graph_display_motion_notify), display);
gtk_widget_add_events(display->support,
- GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
+ GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
+ | GDK_POINTER_MOTION_MASK);
gtk_widget_show(display->support);
@@ -481,7 +483,7 @@ static gboolean gtk_graph_display_draw(GtkWidget *widget, cairo_t *cr, GtkGraphD
gtk_container_foreach(GTK_CONTAINER(display->support), (GtkCallback)draw_shadow, NULL);
for (i = 0; i < display->edges_count; i++)
- g_graph_edge_draw(display->edges[i], cr, true);
+ g_graph_edge_draw(display->edges[i], cr, true, display->hl_edge_index == i);
return FALSE;
@@ -591,9 +593,14 @@ static gboolean gtk_graph_display_motion_notify(GtkWidget *widget, GdkEventMotio
GtkAdjustment *hadj; /* Gestionnaire du défilement */
GtkAdjustment *vadj; /* Gestionnaire du défilement */
gdouble value; /* Nouvelle valeur bornée */
+ size_t i; /* Boucle de parcours */
- if (event->state & GDK_BUTTON1_MASK && display->big_enough)
+ /* Déplacement du graphique ? */
+ if (event->state & GDK_BUTTON1_MASK)
{
+ if (!display->big_enough)
+ goto done;
+
diff_x = display->start_x - event->x_root;
diff_y = display->start_y - event->y_root;
@@ -612,6 +619,29 @@ static gboolean gtk_graph_display_motion_notify(GtkWidget *widget, GdkEventMotio
}
+ /* Survol d'un lien ? */
+ else
+ {
+ for (i = 0; i < display->edges_count; i++)
+ if (g_graph_edge_detect_at(display->edges[i], event->x, event->y))
+ {
+ display->hl_edge_index = i;
+ break;
+ }
+
+ if (i < display->edges_count)
+ gtk_widget_queue_draw(widget);
+
+ else if (display->hl_edge_index < display->edges_count)
+ {
+ display->hl_edge_index = display->edges_count;
+ gtk_widget_queue_draw(widget);
+ }
+
+ }
+
+ done:
+
return FALSE;
}
@@ -922,7 +952,7 @@ static void gtk_graph_display_cache_glance(GtkGraphDisplay *display, cairo_t *cr
cairo_scale(cr, scale, scale);
for (i = 0; i < display->edges_count; i++)
- g_graph_edge_draw(display->edges[i], cr, false);
+ g_graph_edge_draw(display->edges[i], cr, false, false);
}
@@ -990,11 +1020,12 @@ void gtk_graph_display_add_edge(GtkGraphDisplay *display, GGraphEdge *edge)
{
g_graph_edge_offset(edge, GRAPH_MARGIN, GRAPH_MARGIN);
- display->edges = (GGraphEdge **)realloc(display->edges,
- ++display->edges_count * sizeof(GGraphEdge *));
+ display->edges = realloc(display->edges, ++display->edges_count * sizeof(GGraphEdge *));
display->edges[display->edges_count - 1] = edge;
+ display->hl_edge_index = display->edges_count;
+
}
@@ -1055,6 +1086,7 @@ static void gtk_graph_display_reset(GtkGraphDisplay *display, bool dispose)
display->edges = NULL;
display->edges_count = 0;
+ display->hl_edge_index = 0;
}