From 7806215bdc77589af8488bf1d5db306864987b27 Mon Sep 17 00:00:00 2001 From: Christopher James Lahey Date: Fri, 7 Apr 2000 19:12:56 +0000 Subject: Made text tooltips appear in place. Iain figured out that to get them to 2000-04-07 Christopher James Lahey * widgets/e-text/e-text.c: Made text tooltips appear in place. Iain figured out that to get them to not appear, we hide the tooltip when the mouse leaves the tooltip window, not the canvas item (this works because the tooltip window always covers the canvas item completely.) svn path=/trunk/; revision=2328 --- ChangeLog | 8 +++++ widgets/e-text/e-text.c | 82 ++++++++++++++++++++++++++++++++----------------- widgets/text/e-text.c | 82 ++++++++++++++++++++++++++++++++----------------- 3 files changed, 116 insertions(+), 56 deletions(-) diff --git a/ChangeLog b/ChangeLog index a7fac81f29..032f9db562 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2000-04-07 Christopher James Lahey + + * widgets/e-text/e-text.c: Made text tooltips appear in place. + Iain figured out that to get them to not appear, we hide the + tooltip when the mouse leaves the tooltip window, not the canvas + item (this works because the tooltip window always covers the + canvas item completely.) + 2000-04-07 Matt Loper * addressbook/demo/addressbook.c (control_activate_cb): New diff --git a/widgets/e-text/e-text.c b/widgets/e-text/e-text.c index 19dd826fe2..4b3831c30b 100644 --- a/widgets/e-text/e-text.c +++ b/widgets/e-text/e-text.c @@ -348,6 +348,9 @@ e_text_init (EText *text) text->break_characters = NULL; text->max_lines = -1; + text->tooltip_timeout = 0; + text->tooltip_count = 0; + e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(text), e_text_reflow); } @@ -2131,25 +2134,45 @@ _blink_scroll_timeout (gpointer data) return TRUE; } +static gboolean +tooltip_event(GtkWidget *tooltip, GdkEvent *event, EText *text) +{ + switch (event->type) { + case GDK_LEAVE_NOTIFY: + if (text->tooltip_window) { + gtk_widget_destroy (text->tooltip_window); + text->tooltip_window = NULL; + } + break; + default: + break; + } + return FALSE; +} + static gboolean _do_tooltip (gpointer data) { EText *text = E_TEXT (data); struct line *lines; GtkWidget *canvas; - gint x, y, pointer_x, pointer_y, scr_w, scr_h, tip_w, tip_h; int i; gdouble max_width; gboolean cut_off; + double i2c[6]; + ArtPoint origin = {0, 0}; + ArtPoint pixel_origin; + int canvas_x, canvas_y; - if (text->editing) - return FALSE; + text->tooltip_count = 0; lines = text->lines; - if ( !lines ) + if (text->tooltip_window || text->editing || (!lines)) { + text->tooltip_timeout = 0; return FALSE; - + } + cut_off = FALSE; for ( lines = text->lines, i = 0; i < text->num_lines; lines++, i++ ) { if (lines->length > lines->ellipsis_length) { @@ -2157,12 +2180,18 @@ _do_tooltip (gpointer data) break; } } - if ( ! cut_off ) + if ( ! cut_off ) { + text->tooltip_timeout = 0; return FALSE; + } - scr_w = gdk_screen_width (); - scr_h = gdk_screen_height (); - gdk_window_get_pointer (NULL, &pointer_x, &pointer_y, NULL); + gnome_canvas_item_i2c_affine(GNOME_CANVAS_ITEM(text), i2c); + art_affine_point (&pixel_origin, &origin, i2c); + gdk_window_get_origin (GTK_WIDGET(GNOME_CANVAS_ITEM(text)->canvas)->window, &canvas_x, &canvas_y); + pixel_origin.x += canvas_x; + pixel_origin.y += canvas_y; + pixel_origin.x -= (int) gtk_layout_get_hadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(text)->canvas))->value; + pixel_origin.y -= (int) gtk_layout_get_vadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(text)->canvas))->value; text->tooltip_window = gtk_window_new (GTK_WINDOW_POPUP); gtk_container_set_border_width (GTK_CONTAINER (text->tooltip_window), 2); @@ -2193,21 +2222,19 @@ _do_tooltip (gpointer data) "clip", TRUE, NULL); - gtk_widget_set_usize (text->tooltip_window, - (int)max_width + 4, + gtk_widget_set_usize (text->tooltip_window, + (int)max_width + 4, text->height + 4); - gnome_canvas_set_scroll_region (GNOME_CANVAS(canvas), 0.0, 0.0, + gnome_canvas_set_scroll_region (GNOME_CANVAS(canvas), 0.0, 0.0, max_width, (double)text->height); gtk_widget_show (canvas); gtk_widget_realize (text->tooltip_window); - tip_w = text->tooltip_window->allocation.width; - tip_h = text->tooltip_window->allocation.height; - - /* Stay on screen */ - x = pointer_x + tip_w <= scr_w ? pointer_x : scr_w - tip_w; - y = pointer_y + tip_h + 1 <= scr_h ? pointer_y + 1: pointer_y - tip_h; - gtk_widget_popup (text->tooltip_window, x, y); + gtk_signal_connect (GTK_OBJECT(text->tooltip_window), "event", + GTK_SIGNAL_FUNC(tooltip_event), text); + gtk_widget_popup (text->tooltip_window, pixel_origin.x - 2, pixel_origin.y - 2); + + text->tooltip_timeout = 0; return FALSE; } @@ -2312,13 +2339,13 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) return_val = e_text_event_processor_handle_event (text->tep, &e_tep_event); e_tep_event.type = GDK_BUTTON_RELEASE; - } + } #else if ((!text->editing) && text->editable && event->button.button == 1) { e_canvas_item_grab_focus (item); - } + } #endif if (text->editing) { GdkEventButton button = event->button; @@ -2355,9 +2382,12 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) } break; case GDK_ENTER_NOTIFY: - if ( text->tooltip_count == 0 && text->clip) - text->tooltip_timeout = gtk_timeout_add (1000, _do_tooltip, text); + if ( text->tooltip_count == 0 && text->clip) { + if (!text->tooltip_timeout) + text->tooltip_timeout = gtk_timeout_add (1000, _do_tooltip, text); + } text->tooltip_count ++; + text->pointer_in = TRUE; if (text->editing) { if ( text->default_cursor_shown ) { @@ -2374,12 +2404,8 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) gtk_timeout_remove (text->tooltip_timeout); text->tooltip_timeout = 0; } - if (text->tooltip_window) { - gtk_widget_destroy (text->tooltip_window); - text->tooltip_window = NULL; - } } - + text->pointer_in = FALSE; if (text->editing) { if ( ! text->default_cursor_shown ) { diff --git a/widgets/text/e-text.c b/widgets/text/e-text.c index 19dd826fe2..4b3831c30b 100644 --- a/widgets/text/e-text.c +++ b/widgets/text/e-text.c @@ -348,6 +348,9 @@ e_text_init (EText *text) text->break_characters = NULL; text->max_lines = -1; + text->tooltip_timeout = 0; + text->tooltip_count = 0; + e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(text), e_text_reflow); } @@ -2131,25 +2134,45 @@ _blink_scroll_timeout (gpointer data) return TRUE; } +static gboolean +tooltip_event(GtkWidget *tooltip, GdkEvent *event, EText *text) +{ + switch (event->type) { + case GDK_LEAVE_NOTIFY: + if (text->tooltip_window) { + gtk_widget_destroy (text->tooltip_window); + text->tooltip_window = NULL; + } + break; + default: + break; + } + return FALSE; +} + static gboolean _do_tooltip (gpointer data) { EText *text = E_TEXT (data); struct line *lines; GtkWidget *canvas; - gint x, y, pointer_x, pointer_y, scr_w, scr_h, tip_w, tip_h; int i; gdouble max_width; gboolean cut_off; + double i2c[6]; + ArtPoint origin = {0, 0}; + ArtPoint pixel_origin; + int canvas_x, canvas_y; - if (text->editing) - return FALSE; + text->tooltip_count = 0; lines = text->lines; - if ( !lines ) + if (text->tooltip_window || text->editing || (!lines)) { + text->tooltip_timeout = 0; return FALSE; - + } + cut_off = FALSE; for ( lines = text->lines, i = 0; i < text->num_lines; lines++, i++ ) { if (lines->length > lines->ellipsis_length) { @@ -2157,12 +2180,18 @@ _do_tooltip (gpointer data) break; } } - if ( ! cut_off ) + if ( ! cut_off ) { + text->tooltip_timeout = 0; return FALSE; + } - scr_w = gdk_screen_width (); - scr_h = gdk_screen_height (); - gdk_window_get_pointer (NULL, &pointer_x, &pointer_y, NULL); + gnome_canvas_item_i2c_affine(GNOME_CANVAS_ITEM(text), i2c); + art_affine_point (&pixel_origin, &origin, i2c); + gdk_window_get_origin (GTK_WIDGET(GNOME_CANVAS_ITEM(text)->canvas)->window, &canvas_x, &canvas_y); + pixel_origin.x += canvas_x; + pixel_origin.y += canvas_y; + pixel_origin.x -= (int) gtk_layout_get_hadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(text)->canvas))->value; + pixel_origin.y -= (int) gtk_layout_get_vadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(text)->canvas))->value; text->tooltip_window = gtk_window_new (GTK_WINDOW_POPUP); gtk_container_set_border_width (GTK_CONTAINER (text->tooltip_window), 2); @@ -2193,21 +2222,19 @@ _do_tooltip (gpointer data) "clip", TRUE, NULL); - gtk_widget_set_usize (text->tooltip_window, - (int)max_width + 4, + gtk_widget_set_usize (text->tooltip_window, + (int)max_width + 4, text->height + 4); - gnome_canvas_set_scroll_region (GNOME_CANVAS(canvas), 0.0, 0.0, + gnome_canvas_set_scroll_region (GNOME_CANVAS(canvas), 0.0, 0.0, max_width, (double)text->height); gtk_widget_show (canvas); gtk_widget_realize (text->tooltip_window); - tip_w = text->tooltip_window->allocation.width; - tip_h = text->tooltip_window->allocation.height; - - /* Stay on screen */ - x = pointer_x + tip_w <= scr_w ? pointer_x : scr_w - tip_w; - y = pointer_y + tip_h + 1 <= scr_h ? pointer_y + 1: pointer_y - tip_h; - gtk_widget_popup (text->tooltip_window, x, y); + gtk_signal_connect (GTK_OBJECT(text->tooltip_window), "event", + GTK_SIGNAL_FUNC(tooltip_event), text); + gtk_widget_popup (text->tooltip_window, pixel_origin.x - 2, pixel_origin.y - 2); + + text->tooltip_timeout = 0; return FALSE; } @@ -2312,13 +2339,13 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) return_val = e_text_event_processor_handle_event (text->tep, &e_tep_event); e_tep_event.type = GDK_BUTTON_RELEASE; - } + } #else if ((!text->editing) && text->editable && event->button.button == 1) { e_canvas_item_grab_focus (item); - } + } #endif if (text->editing) { GdkEventButton button = event->button; @@ -2355,9 +2382,12 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) } break; case GDK_ENTER_NOTIFY: - if ( text->tooltip_count == 0 && text->clip) - text->tooltip_timeout = gtk_timeout_add (1000, _do_tooltip, text); + if ( text->tooltip_count == 0 && text->clip) { + if (!text->tooltip_timeout) + text->tooltip_timeout = gtk_timeout_add (1000, _do_tooltip, text); + } text->tooltip_count ++; + text->pointer_in = TRUE; if (text->editing) { if ( text->default_cursor_shown ) { @@ -2374,12 +2404,8 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) gtk_timeout_remove (text->tooltip_timeout); text->tooltip_timeout = 0; } - if (text->tooltip_window) { - gtk_widget_destroy (text->tooltip_window); - text->tooltip_window = NULL; - } } - + text->pointer_in = FALSE; if (text->editing) { if ( ! text->default_cursor_shown ) { -- cgit v1.2.3