X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-view.c;h=2edcd858cc9345566704aee3eed53eee2618ce94;hb=d24883d57ff3806d9c2002e8f800e9d69762c335;hp=34760b5215c473325558a4e80a4c2e7cc358f3cf;hpb=8ae0cc1bf88618063272b56be3f5fe332d548fad;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index 34760b52..2edcd858 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -37,6 +37,7 @@ #include "ev-job-queue.h" #include "ev-page-cache.h" #include "ev-pixbuf-cache.h" +#include "ev-tooltip.h" #define EV_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EV_TYPE_VIEW, EvViewClass)) #define EV_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EV_TYPE_VIEW)) @@ -148,6 +149,7 @@ struct _EvView { int pressed_button; EvViewCursor cursor; + GtkWidget *link_tooltip; EvPageCache *page_cache; EvPixbufCache *pixbuf_cache; @@ -244,7 +246,7 @@ static EvLink* get_link_at_location (EvView gdouble y); static void go_to_link (EvView *view, EvLink *link); -static char* status_message_from_link (EvView *view, +static char* tip_from_link (EvView *view, EvLink *link); /*** GtkWidget implementation ***/ @@ -1076,7 +1078,7 @@ go_to_link (EvView *view, EvLink *link) } static char * -status_message_from_link (EvView *view, EvLink *link) +tip_from_link (EvView *view, EvLink *link) { EvLinkType type; char *msg = NULL; @@ -1528,13 +1530,23 @@ ev_view_motion_notify_event (GtkWidget *widget, EvLink *link; link = get_link_at_location (view, event->x + view->scroll_x, event->y + view->scroll_y); + + if (!link && view->link_tooltip) { + ev_tooltip_deactivate (EV_TOOLTIP (view->link_tooltip)); + } + if (link) { - char *msg; + char *msg = tip_from_link (view, link); - msg = status_message_from_link (view, link); - ev_view_set_status (view, msg); - ev_view_set_cursor (view, EV_VIEW_CURSOR_LINK); + if (view->link_tooltip == NULL) { + view->link_tooltip = ev_tooltip_new (GTK_WIDGET (view)); + } + ev_tooltip_set_position (EV_TOOLTIP (view->link_tooltip), event->x, event->y); + ev_tooltip_set_text (EV_TOOLTIP (view->link_tooltip), msg); + ev_tooltip_activate (EV_TOOLTIP (view->link_tooltip)); g_free (msg); + + ev_view_set_cursor (view, EV_VIEW_CURSOR_LINK); } else if (location_in_text (view, event->x + view->scroll_x, event->y + view->scroll_y)) { ev_view_set_cursor (view, EV_VIEW_CURSOR_IBEAM); } else { @@ -1702,6 +1714,51 @@ highlight_find_results (EvView *view, int page) } } +static void +draw_loading_text (EvView *view, + GdkRectangle *page_area, + GdkRectangle *expose_area) +{ + PangoLayout *layout; + PangoFontDescription *font_desc; + PangoRectangle logical_rect; + double real_scale; + int target_width; + + const char *loading_text = _("Loading..."); + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (view), loading_text); + + font_desc = pango_font_description_new (); + + + /* We set the font to be 10 points, get the size, and scale appropriately */ + pango_font_description_set_size (font_desc, 10 * PANGO_SCALE); + pango_layout_set_font_description (layout, font_desc); + pango_layout_get_pixel_extents (layout, NULL, &logical_rect); + + /* Make sure we fit the middle of the page */ + target_width = MAX (page_area->width / 2, 1); + real_scale = ((double)target_width / (double) logical_rect.width) * (PANGO_SCALE * 10); + pango_font_description_set_size (font_desc, (int)real_scale); + pango_layout_set_font_description (layout, font_desc); + pango_layout_get_pixel_extents (layout, NULL, &logical_rect); + + gtk_paint_layout (GTK_WIDGET (view)->style, + GTK_WIDGET (view)->window, + GTK_WIDGET_STATE (view), + FALSE, + page_area, + GTK_WIDGET (view), + NULL, + page_area->x + (target_width/2), + page_area->y + (page_area->height - logical_rect.height) / 2, + layout); + + pango_font_description_free (font_desc); + g_object_unref (layout); +} + static void draw_one_page (EvView *view, gint page, @@ -1785,6 +1842,10 @@ draw_one_page (EvView *view, GDK_RGB_DITHER_NORMAL, 0, 0); g_object_unref (scaled_image); + } else { + draw_loading_text (view, + &real_page_area, + expose_area); } if (scaled_selection) { @@ -1832,6 +1893,11 @@ ev_view_destroy (GtkObject *object) g_object_unref (view->pixbuf_cache); view->pixbuf_cache = NULL; } + if (view->link_tooltip) { + gtk_widget_destroy (view->link_tooltip); + view->link_tooltip = NULL; + } + ev_view_set_scroll_adjustments (view, NULL, NULL); GTK_OBJECT_CLASS (ev_view_parent_class)->destroy (object);