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=830d6bec95941207a4d2129595f95d591087ce71;hb=a9a3c41262ca008c326e7a97ab0608608d144caa;hp=03ea9e97ca980533197757565bee4e891243efbd;hpb=1c0d19bd22598eca159c3febdcdaf4168891cb8f;p=evince.git diff --git a/shell/ev-sidebar-links.c b/shell/ev-sidebar-links.c index 03ea9e97..830d6bec 100644 --- a/shell/ev-sidebar-links.c +++ b/shell/ev-sidebar-links.c @@ -28,6 +28,7 @@ #include #include +#include "ev-sidebar-page.h" #include "ev-sidebar-links.h" #include "ev-job-queue.h" #include "ev-document-links.h" @@ -46,18 +47,36 @@ struct _EvSidebarLinksPrivate { EvPageCache *page_cache; }; +enum { + PROP_0, + PROP_MODEL, +}; + + +static void links_page_num_func (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + EvSidebarLinks *sidebar_links); +static void update_page_callback (EvPageCache *page_cache, + gint current_page, + EvSidebarLinks *sidebar_links); +static void ev_sidebar_links_page_iface_init (EvSidebarPageIface *iface); +static void ev_sidebar_links_clear_document (EvSidebarLinks *sidebar_links); +static void ev_sidebar_links_set_document (EvSidebarPage *sidebar_page, + EvDocument *document); +static gboolean ev_sidebar_links_support_document (EvSidebarPage *sidebar_page, + EvDocument *document); +static const gchar* ev_sidebar_links_get_label (EvSidebarPage *sidebar_page); -static void links_page_num_func (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer data); -static void update_page_callback (EvPageCache *page_cache, - gint current_page, - EvSidebarLinks *sidebar_links); +G_DEFINE_TYPE_EXTENDED (EvSidebarLinks, + ev_sidebar_links, + GTK_TYPE_VBOX, + 0, + G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE, + ev_sidebar_links_page_iface_init)) -G_DEFINE_TYPE (EvSidebarLinks, ev_sidebar_links, GTK_TYPE_VBOX) #define EV_SIDEBAR_LINKS_GET_PRIVATE(object) \ (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_SIDEBAR_LINKS, EvSidebarLinksPrivate)) @@ -71,6 +90,53 @@ ev_sidebar_links_destroy (GtkObject *object) ev_sidebar_links_clear_document (ev_sidebar_links); } +static void +ev_sidebar_links_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + EvSidebarLinks *ev_sidebar_links; + GtkTreeModel *model; + + ev_sidebar_links = EV_SIDEBAR_LINKS (object); + + switch (prop_id) + { + case PROP_MODEL: + model = ev_sidebar_links->priv->model; + ev_sidebar_links->priv->model = GTK_TREE_MODEL (g_value_dup_object (value)); + if (model) + g_object_unref (model); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +ev_sidebar_links_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EvSidebarLinks *ev_sidebar_links; + + ev_sidebar_links = EV_SIDEBAR_LINKS (object); + + switch (prop_id) + { + case PROP_MODEL: + g_value_set_object (value, ev_sidebar_links->priv->model); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + static void ev_sidebar_links_class_init (EvSidebarLinksClass *ev_sidebar_links_class) { @@ -80,8 +146,19 @@ ev_sidebar_links_class_init (EvSidebarLinksClass *ev_sidebar_links_class) g_object_class = G_OBJECT_CLASS (ev_sidebar_links_class); gtk_object_class = GTK_OBJECT_CLASS (ev_sidebar_links_class); + g_object_class->set_property = ev_sidebar_links_set_property; + g_object_class->get_property = ev_sidebar_links_get_property; + gtk_object_class->destroy = ev_sidebar_links_destroy; + g_object_class_install_property (g_object_class, + PROP_MODEL, + g_param_spec_object ("model", + "Model", + "Current Model", + GTK_TYPE_TREE_MODEL, + G_PARAM_READWRITE)); + g_type_class_add_private (g_object_class, sizeof (EvSidebarLinksPrivate)); } @@ -110,6 +187,7 @@ selection_changed_cb (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_handler_unblock (ev_sidebar_links->priv->page_cache, ev_sidebar_links->priv->page_changed_id); @@ -126,13 +204,13 @@ create_loading_model (void) /* Creates a fake model to indicate that we're loading */ retval = (GtkTreeModel *)gtk_list_store_new (EV_DOCUMENT_LINKS_COLUMN_NUM_COLUMNS, G_TYPE_STRING, - G_TYPE_BOOLEAN, G_TYPE_OBJECT); gtk_list_store_append (GTK_LIST_STORE (retval), &iter); markup = g_strdup_printf ("%s", _("Loading...")); gtk_list_store_set (GTK_LIST_STORE (retval), &iter, EV_DOCUMENT_LINKS_COLUMN_MARKUP, markup, + EV_DOCUMENT_LINKS_COLUMN_LINK, NULL, -1); g_free (markup); @@ -189,7 +267,7 @@ ev_sidebar_links_construct (EvSidebarLinks *ev_sidebar_links) gtk_tree_view_column_pack_end (GTK_TREE_VIEW_COLUMN (column), renderer, FALSE); gtk_tree_view_column_set_cell_data_func (GTK_TREE_VIEW_COLUMN (column), renderer, (GtkTreeCellDataFunc) links_page_num_func, - NULL, NULL); + ev_sidebar_links, NULL); } @@ -207,7 +285,7 @@ links_page_num_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, - gpointer data) + EvSidebarLinks *sidebar_links) { EvLink *link; @@ -217,12 +295,19 @@ links_page_num_func (GtkTreeViewColumn *tree_column, if (link != NULL && ev_link_get_link_type (link) == EV_LINK_TYPE_PAGE) { - gchar *markup = g_strdup_printf ("%d", ev_link_get_page (link)); + gchar *page_label; + gchar *page_string; + + page_label = ev_page_cache_get_page_label (sidebar_links->priv->page_cache, ev_link_get_page (link)); + page_string = g_markup_printf_escaped ("%s", page_label); + g_object_set (cell, - "markup", markup, + "markup", page_string, "visible", TRUE, NULL); - g_free (markup); + + g_free (page_label); + g_free (page_string); } else { g_object_set (cell, "visible", FALSE, @@ -242,7 +327,7 @@ ev_sidebar_links_new (void) return ev_sidebar_links; } -void +static void ev_sidebar_links_clear_document (EvSidebarLinks *sidebar_links) { EvSidebarLinksPrivate *priv; @@ -328,6 +413,8 @@ job_finished_cb (EvJobLinks *job, priv = sidebar_links->priv; priv->model = g_object_ref (job->model); + g_object_notify (G_OBJECT (sidebar_links), "model"); + gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), job->model); g_object_unref (job); @@ -355,14 +442,17 @@ job_finished_cb (EvJobLinks *job, } -void -ev_sidebar_links_set_document (EvSidebarLinks *sidebar_links, +static void +ev_sidebar_links_set_document (EvSidebarPage *sidebar_page, EvDocument *document) { + EvSidebarLinks *sidebar_links; EvSidebarLinksPrivate *priv; - g_return_if_fail (EV_IS_SIDEBAR_LINKS (sidebar_links)); + g_return_if_fail (EV_IS_SIDEBAR_PAGE (sidebar_page)); g_return_if_fail (EV_IS_DOCUMENT (document)); + + sidebar_links = EV_SIDEBAR_LINKS (sidebar_page); priv = sidebar_links->priv; @@ -381,3 +471,25 @@ ev_sidebar_links_set_document (EvSidebarLinks *sidebar_links, } +static gboolean +ev_sidebar_links_support_document (EvSidebarPage *sidebar_page, + EvDocument *document) +{ + return (EV_IS_DOCUMENT_LINKS (document) && + ev_document_links_has_document_links (EV_DOCUMENT_LINKS (document))); +} + +static const gchar* +ev_sidebar_links_get_label (EvSidebarPage *sidebar_page) +{ + return _("Index"); +} + +static void +ev_sidebar_links_page_iface_init (EvSidebarPageIface *iface) +{ + iface->support_document = ev_sidebar_links_support_document; + iface->set_document = ev_sidebar_links_set_document; + iface->get_label = ev_sidebar_links_get_label; +} +