X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=gtk-gui.c;h=d6ab412c76337c583d61aef9fe37404839f7a986;hb=0e29df87f43365309f89d6dbd5b4a3acd8ea5054;hp=a5728e2c8e5149e54d30c79cd95df02e40f6665e;hpb=b72ade0e78825dd97add4c7607c574df351abed0;p=ext%2Fsubsurface.git diff --git a/gtk-gui.c b/gtk-gui.c index a5728e2..d6ab412 100644 --- a/gtk-gui.c +++ b/gtk-gui.c @@ -588,11 +588,14 @@ void init_ui(int argc, char **argv) GtkWidget *equipment; GtkWidget *menubar; GtkWidget *vbox; + GtkSettings *settings; static const GtkTargetEntry notebook_target = { "GTK_NOTEBOOK_TAB", GTK_TARGET_SAME_APP, 0 }; gtk_init(&argc, &argv); + settings = gtk_settings_get_default(); + gtk_settings_set_long_property(settings, "gtk_tooltip_timeout", 10, "subsurface setting"); g_type_init(); gconf = gconf_client_get_default(); @@ -670,6 +673,48 @@ void run_ui(void) gtk_main(); } +typedef struct { + cairo_rectangle_int_t rect; + const char *text; +} tooltip_record_t; + +static tooltip_record_t *tooltip_rects; +static int tooltips; + +void attach_tooltip(int x, int y, int w, int h, const char *text) +{ + cairo_rectangle_int_t *rect; + tooltip_rects = realloc(tooltip_rects, (tooltips + 1) * sizeof(tooltip_record_t)); + rect = &tooltip_rects[tooltips].rect; + rect->x = x; + rect->y = y; + rect->width = w; + rect->height = h; + tooltip_rects[tooltips].text = text; + tooltips++; +} + +#define INSIDE_RECT(_r,_x,_y) ((_r.x <= _x) && (_r.x + _r.width >= _x) && \ + (_r.y <= _y) && (_r.y + _r.height >= _y)) + +static gboolean profile_tooltip (GtkWidget *widget, gint x, gint y, + gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data) +{ + int i; + cairo_rectangle_int_t *drawing_area = user_data; + gint tx = x - drawing_area->x; /* get transformed coordinates */ + gint ty = y - drawing_area->y; + + /* are we over an event marker ? */ + for (i = 0; i < tooltips; i++) { + if (INSIDE_RECT(tooltip_rects[i].rect, tx, ty)) { + gtk_tooltip_set_text(tooltip,tooltip_rects[i].text); + return TRUE; /* show tooltip */ + } + } + return FALSE; /* don't show tooltip */ +} + static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data) { struct dive *dive = current_dive; @@ -684,11 +729,19 @@ static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer drawing_area.y = drawing_area.height / 20.0; gc.cr = gdk_cairo_create(widget->window); + g_object_set(widget, "has-tooltip", TRUE, NULL); + g_signal_connect(widget, "query-tooltip", G_CALLBACK(profile_tooltip), &drawing_area); set_source_rgb(&gc, 0, 0, 0); cairo_paint(gc.cr); - if (dive) + if (dive) { + if (tooltip_rects) { + free(tooltip_rects); + tooltip_rects = NULL; + } + tooltips = 0; plot(&gc, &drawing_area, dive); + } cairo_destroy(gc.cr); return FALSE;