]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-bookmarks.c
Hook up bookmarks navigation
[evince.git] / shell / ev-sidebar-bookmarks.c
index b215e1ed62debc091fa13ff58673c999da0a58ac..29851b91f579ade4411043f02abda9bf4645fac8 100644 (file)
@@ -50,6 +50,7 @@ enum {
        BOOKMARKS_COLUMN_MARKUP,
        BOOKMARKS_COLUMN_PAGE_NUM,
        BOOKMARKS_COLUMN_PAGE_VALID,
+       BOOKMARKS_COLUMN_BOOKMARK,
        BOOKMARKS_COLUMN_NUM_COLUMNS
 };
 
@@ -88,6 +89,34 @@ ev_sidebar_bookmarks_class_init (EvSidebarBookmarksClass *ev_sidebar_bookmarks_c
        g_type_class_add_private (g_object_class, sizeof (EvSidebarBookmarksPrivate));
 }
 
+static void
+selection_changed_cb (GtkTreeSelection   *selection,
+                     EvSidebarBookmarks *ev_sidebar_bookmarks)
+{
+       EvDocument *document;
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+
+       g_return_if_fail (EV_IS_SIDEBAR_BOOKMARKS (ev_sidebar_bookmarks));
+
+       document = EV_DOCUMENT (ev_sidebar_bookmarks->priv->current_document);
+       g_return_if_fail (ev_sidebar_bookmarks->priv->current_document != NULL);
+
+       if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+               EvBookmark *bookmark;
+               GValue value = {0, };
+               int page;
+
+               gtk_tree_model_get_value (model, &iter,
+                                         BOOKMARKS_COLUMN_BOOKMARK, &value);
+
+               bookmark = EV_BOOKMARK (g_value_get_object (&value));
+               g_return_if_fail (bookmark != NULL);
+
+               page = ev_bookmark_get_page (bookmark);
+               ev_document_set_page (document, page);
+       }
+}
 
 static void
 ev_sidebar_bookmarks_construct (EvSidebarBookmarks *ev_sidebar_bookmarks)
@@ -96,12 +125,14 @@ ev_sidebar_bookmarks_construct (EvSidebarBookmarks *ev_sidebar_bookmarks)
        GtkWidget *swindow;
        GtkTreeViewColumn *column;
        GtkCellRenderer *renderer;
+       GtkTreeSelection *selection;
 
        priv = ev_sidebar_bookmarks->priv;
        priv->model = (GtkTreeModel *) gtk_tree_store_new (BOOKMARKS_COLUMN_NUM_COLUMNS,
                                                           G_TYPE_STRING,
                                                           G_TYPE_INT,
-                                                          G_TYPE_BOOLEAN);
+                                                          G_TYPE_BOOLEAN,
+                                                          G_TYPE_OBJECT);
 
        swindow = gtk_scrolled_window_new (NULL, NULL);
 
@@ -139,6 +170,11 @@ ev_sidebar_bookmarks_construct (EvSidebarBookmarks *ev_sidebar_bookmarks)
                                                 (GtkTreeCellDataFunc) bookmarks_page_num_func,
                                                 NULL, NULL);
 
+
+       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
+       g_signal_connect (selection, "changed",
+                         G_CALLBACK (selection_changed_cb),
+                         ev_sidebar_bookmarks);
 }
 
 static void
@@ -207,34 +243,34 @@ static gboolean
 do_one_iteration (EvSidebarBookmarks *ev_sidebar_bookmarks)
 {
        EvSidebarBookmarksPrivate *priv = ev_sidebar_bookmarks->priv;
+       EvBookmark *bookmark;
        IdleStackData *stack_data;
        GtkTreeIter tree_iter;
-       gchar *title = NULL;
-       EvDocumentBookmarksType type;
        EvDocumentBookmarksIter *child_iter;
-       gint page = -1;
+       gint page;
 
        g_assert (priv->idle_stack);
 
        stack_data = (IdleStackData *) priv->idle_stack->data;
 
-       if (! ev_document_bookmarks_get_values (EV_DOCUMENT_BOOKMARKS (priv->current_document),
-                                               stack_data->bookmarks_iter,
-                                               &title,
-                                               &type,
-                                               &page)) {
+       bookmark = ev_document_bookmarks_get_bookmark
+               (EV_DOCUMENT_BOOKMARKS (priv->current_document),
+                stack_data->bookmarks_iter);
+       if (bookmark == NULL) {
                g_warning ("mismatch in model.  No values available at current level.\n");
                return FALSE;
        }
 
+       page = ev_bookmark_get_page (bookmark);
        gtk_tree_store_append (GTK_TREE_STORE (priv->model), &tree_iter, stack_data->tree_iter);
        gtk_tree_store_set (GTK_TREE_STORE (priv->model), &tree_iter,
-                           BOOKMARKS_COLUMN_MARKUP, title,
+                           BOOKMARKS_COLUMN_MARKUP, ev_bookmark_get_title (bookmark),
                            BOOKMARKS_COLUMN_PAGE_NUM, page,
                            /* FIXME: Handle links for real. */
                            BOOKMARKS_COLUMN_PAGE_VALID, (page >= 0),
+                           BOOKMARKS_COLUMN_BOOKMARK, bookmark,
                            -1);
-       g_free (title);
+       g_object_unref (bookmark);
        
        child_iter = ev_document_bookmarks_get_child (EV_DOCUMENT_BOOKMARKS (priv->current_document),
                                                      stack_data->bookmarks_iter);