X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-sidebar-links.c;h=ac728ed6b15fec191331000360653187cca8cf26;hb=e1ec38bb31d735c3219f967f3f1703bc88eb5090;hp=58dac08ca9f835ed39c9688dc128c00bf8a3f80d;hpb=6de49223c660b9233b7809e81f826cb99e6ecd5d;p=evince.git diff --git a/shell/ev-sidebar-links.c b/shell/ev-sidebar-links.c index 58dac08c..ac728ed6 100644 --- a/shell/ev-sidebar-links.c +++ b/shell/ev-sidebar-links.c @@ -55,6 +55,10 @@ enum { PROP_WIDGET, }; +enum { + LINK_ACTIVATED, + N_SIGNALS +}; static void links_page_num_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, @@ -77,6 +81,7 @@ static gboolean ev_sidebar_links_support_document (EvSidebarPage *sidebar_page, EvDocument *document); static const gchar* ev_sidebar_links_get_label (EvSidebarPage *sidebar_page); +static guint signals[N_SIGNALS]; G_DEFINE_TYPE_EXTENDED (EvSidebarLinks, ev_sidebar_links, @@ -177,6 +182,14 @@ ev_sidebar_links_class_init (EvSidebarLinksClass *ev_sidebar_links_class) g_object_class->get_property = ev_sidebar_links_get_property; g_object_class->dispose = ev_sidebar_links_dispose; + signals[LINK_ACTIVATED] = g_signal_new ("link-activated", + G_TYPE_FROM_CLASS (g_object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (EvSidebarLinksClass, link_activated), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_OBJECT); + g_object_class_install_property (g_object_class, PROP_MODEL, g_param_spec_object ("model", @@ -216,8 +229,7 @@ selection_changed_callback (GtkTreeSelection *selection, g_signal_handler_block (ev_sidebar_links->priv->page_cache, ev_sidebar_links->priv->page_changed_id); - /* FIXME: we should handle this better. This breaks w/ URLs */ - ev_page_cache_set_link (ev_sidebar_links->priv->page_cache, link); + g_signal_emit (ev_sidebar_links, signals[LINK_ACTIVATED], 0, link); g_signal_handler_unblock (ev_sidebar_links->priv->page_cache, ev_sidebar_links->priv->page_changed_id); @@ -282,7 +294,7 @@ print_section_cb (GtkWidget *menuitem, EvSidebarLinks *sidebar) if (link) g_object_unref (link); } else { - last_page = -1; + last_page = ev_page_cache_get_n_pages (sidebar->priv->page_cache); } window = gtk_widget_get_toplevel (GTK_WIDGET (sidebar)); @@ -434,7 +446,7 @@ links_page_num_func (GtkTreeViewColumn *tree_column, -1); if (link != NULL && - ev_link_get_link_type (link) == EV_LINK_TYPE_PAGE) { + ev_link_get_page (link) >= 0) { gchar *page_label; gchar *page_string; @@ -483,7 +495,7 @@ update_page_callback_foreach (GtkTreeModel *model, EV_DOCUMENT_LINKS_COLUMN_LINK, &link, -1); - if (link && ev_link_get_link_type (link) == EV_LINK_TYPE_PAGE) { + if (link) { int current_page; current_page = ev_page_cache_get_current_page (sidebar_links->priv->page_cache); @@ -491,17 +503,14 @@ update_page_callback_foreach (GtkTreeModel *model, GtkTreeSelection *selection; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view)); - gtk_tree_selection_select_path (selection, path); - g_object_unref (link); + return TRUE; } + g_object_unref (link); } - if (link) - g_object_unref (link); - return FALSE; } @@ -511,19 +520,37 @@ update_page_callback (EvPageCache *page_cache, EvSidebarLinks *sidebar_links) { GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view)); + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + EvLink *link; + + gtk_tree_model_get (model, &iter, + EV_DOCUMENT_LINKS_COLUMN_LINK, &link, + -1); + if (link) { + gint current_page; + current_page = ev_page_cache_get_current_page (sidebar_links->priv->page_cache); + if (ev_link_get_page (link) == current_page) { + g_object_unref (link); + return; + } + g_object_unref (link); + } + } + /* We go through the tree linearly looking for the first page that * matches. This is pretty inefficient. We can do something neat with * a GtkTreeModelSort here to make it faster, if it turns out to be * slow. */ - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view)); - g_signal_handler_block (selection, sidebar_links->priv->selection_id); g_signal_handler_block (sidebar_links->priv->tree_view, sidebar_links->priv->row_activated_id); - gtk_tree_selection_unselect_all (selection); - gtk_tree_model_foreach (sidebar_links->priv->model, + gtk_tree_model_foreach (model, update_page_callback_foreach, sidebar_links);