]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Remove the statusbar. This regress loading feedback, need to check with
[evince.git] / shell / ev-view.c
index 34760b5215c473325558a4e80a4c2e7cc358f3cf..2edcd858cc9345566704aee3eed53eee2618ce94 100644 (file)
@@ -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);