diff options
Diffstat (limited to 'src/gtkext/gtkgraphdisplay.c')
-rw-r--r-- | src/gtkext/gtkgraphdisplay.c | 44 |
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; } |