]> www.fi.muni.cz Git - evince.git/commitdiff
[shell] Update layers sidebar page when layers have changed
authorCarlos Garcia Campos <carlosgc@gnome.org>
Wed, 15 Sep 2010 14:59:49 +0000 (16:59 +0200)
committerCarlos Garcia Campos <carlosgc@gnome.org>
Wed, 15 Sep 2010 15:05:43 +0000 (17:05 +0200)
shell/ev-sidebar-layers.c
shell/ev-sidebar-layers.h
shell/ev-window.c

index 938f457f492aabe75ca474202506237c6a7dc6b7..794d31fec40765a0db8fa4138fb5841e550bf0d5 100644 (file)
@@ -331,6 +331,49 @@ ev_sidebar_layers_new (void)
        return GTK_WIDGET (g_object_new (EV_TYPE_SIDEBAR_LAYERS, NULL));
 }
 
+static void
+update_layers_state (GtkTreeModel     *model,
+                    GtkTreeIter      *iter,
+                    EvDocumentLayers *document_layers)
+{
+       EvLayer    *layer;
+       gboolean    visible;
+       GtkTreeIter child_iter;
+
+       do {
+               gtk_tree_model_get (model, iter,
+                                   EV_DOCUMENT_LAYERS_COLUMN_VISIBLE, &visible,
+                                   EV_DOCUMENT_LAYERS_COLUMN_LAYER, &layer,
+                                   -1);
+               if (layer) {
+                       gboolean layer_visible;
+
+                       layer_visible = ev_document_layers_layer_is_visible (document_layers, layer);
+                       if (layer_visible != visible) {
+                               gtk_tree_store_set (GTK_TREE_STORE (model), iter,
+                                                   EV_DOCUMENT_LAYERS_COLUMN_VISIBLE, layer_visible,
+                                                   -1);
+                       }
+               }
+
+               if (gtk_tree_model_iter_children (model, &child_iter, iter))
+                       update_layers_state (model, &child_iter, document_layers);
+       } while (gtk_tree_model_iter_next (model, iter));
+}
+
+void
+ev_sidebar_layers_update_layers_state (EvSidebarLayers *sidebar_layers)
+{
+       GtkTreeModel     *model;
+       GtkTreeIter       iter;
+       EvDocumentLayers *document_layers;
+
+       document_layers = EV_DOCUMENT_LAYERS (sidebar_layers->priv->document);
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW (sidebar_layers->priv->tree_view));
+       if (gtk_tree_model_get_iter_first (model, &iter))
+               update_layers_state (model, &iter, document_layers);
+}
+
 static void
 job_finished_callback (EvJobLayers     *job,
                       EvSidebarLayers *sidebar_layers)
index bedd95e7941172e7c816b8f9f8669754391ec7dd..0dd99df50df922f802836ac142e2d428e237b1e1 100644 (file)
@@ -50,8 +50,9 @@ struct _EvSidebarLayersClass {
        void (* layers_visibility_changed) (EvSidebarLayers *ev_layers);
 };
 
-GType      ev_sidebar_layers_get_type (void) G_GNUC_CONST;
-GtkWidget *ev_sidebar_layers_new      (void);
+GType      ev_sidebar_layers_get_type            (void) G_GNUC_CONST;
+GtkWidget *ev_sidebar_layers_new                 (void);
+void       ev_sidebar_layers_update_layers_state (EvSidebarLayers *sidebar_layers);
 
 G_END_DECLS
 
index ce43ab072b16a512735556248af9b89f3da9cefb..9aa3926be42b9ba7571af35c0473c980ea391cfb 100644 (file)
@@ -895,6 +895,13 @@ view_selection_changed_cb (EvView   *view,
                                        ev_view_get_has_selection (view));
 }
 
+static void
+view_layers_changed_cb (EvView   *view,
+                       EvWindow *window)
+{
+       ev_sidebar_layers_update_layers_state (EV_SIDEBAR_LAYERS (window->priv->sidebar_layers));
+}
+
 static void
 ev_window_page_changed_cb (EvWindow        *ev_window,
                           gint             old_page,
@@ -7007,6 +7014,9 @@ ev_window_init (EvWindow *ev_window)
        g_signal_connect_object (ev_window->priv->view, "annot-added",
                                 G_CALLBACK (view_annot_added),
                                 ev_window, 0);
+       g_signal_connect_object (ev_window->priv->view, "layers-changed",
+                                G_CALLBACK (view_layers_changed_cb),
+                                ev_window, 0);
 #ifdef ENABLE_DBUS
        g_signal_connect_swapped (ev_window->priv->view, "sync-source",
                                  G_CALLBACK (ev_window_sync_source),