]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-layers.c
[dualscreen] fix crash on ctrl+w and fix control window closing
[evince.git] / shell / ev-sidebar-layers.c
index cebd96d45c802360cf77151698affd0932acda30..794d31fec40765a0db8fa4138fb5841e550bf0d5 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #include "config.h"
@@ -47,9 +47,9 @@ enum {
        N_SIGNALS
 };
 
-static void ev_sidebar_layers_page_iface_init (EvSidebarPageIface *iface);
-static void job_finished_callback             (EvJobLayers        *job,
-                                              EvSidebarLayers    *sidebar_layers);
+static void ev_sidebar_layers_page_iface_init (EvSidebarPageInterface *iface);
+static void job_finished_callback             (EvJobLayers            *job,
+                                              EvSidebarLayers        *sidebar_layers);
 
 static guint signals[N_SIGNALS];
 
@@ -122,7 +122,7 @@ ev_sidebar_layers_create_loading_model (void)
                                                     G_TYPE_INT);
 
        gtk_list_store_append (GTK_LIST_STORE (retval), &iter);
-       markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>", _("Loading..."));
+       markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>", _("Loading"));
        gtk_list_store_set (GTK_LIST_STORE (retval), &iter,
                            EV_DOCUMENT_LAYERS_COLUMN_TITLE, markup,
                            EV_DOCUMENT_LAYERS_COLUMN_VISIBLE, FALSE,
@@ -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)
@@ -346,18 +389,15 @@ job_finished_callback (EvJobLayers     *job,
 }
 
 static void
-ev_sidebar_layers_set_document (EvSidebarPage  *sidebar_page,
-                               EvDocument     *document)
+ev_sidebar_layers_document_changed_cb (EvDocumentModel *model,
+                                      GParamSpec      *pspec,
+                                      EvSidebarLayers *sidebar_layers)
 {
-       EvSidebarLayers *sidebar_layers;
-       EvSidebarLayersPrivate *priv;
-
-       g_return_if_fail (EV_IS_SIDEBAR_PAGE (sidebar_page));
-       g_return_if_fail (EV_IS_DOCUMENT (document));
-       
-       sidebar_layers = EV_SIDEBAR_LAYERS (sidebar_page);
+       EvDocument *document = ev_document_model_get_document (model);
+       EvSidebarLayersPrivate *priv = sidebar_layers->priv;
 
-       priv = sidebar_layers->priv;
+       if (!EV_IS_DOCUMENT_LAYERS (document))
+               return;
 
        if (priv->document) {
                gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), NULL);
@@ -381,6 +421,15 @@ ev_sidebar_layers_set_document (EvSidebarPage  *sidebar_page,
        ev_job_scheduler_push_job (priv->job, EV_JOB_PRIORITY_NONE);
 }
 
+static void
+ev_sidebar_layers_set_model (EvSidebarPage   *sidebar_page,
+                            EvDocumentModel *model)
+{
+       g_signal_connect (model, "notify::document",
+                         G_CALLBACK (ev_sidebar_layers_document_changed_cb),
+                         sidebar_page);
+}
+
 static gboolean
 ev_sidebar_layers_support_document (EvSidebarPage *sidebar_page,
                                    EvDocument    *document)
@@ -396,10 +445,10 @@ ev_sidebar_layers_get_label (EvSidebarPage *sidebar_page)
 }
 
 static void
-ev_sidebar_layers_page_iface_init (EvSidebarPageIface *iface)
+ev_sidebar_layers_page_iface_init (EvSidebarPageInterface *iface)
 {
        iface->support_document = ev_sidebar_layers_support_document;
-       iface->set_document = ev_sidebar_layers_set_document;
+       iface->set_model = ev_sidebar_layers_set_model;
        iface->get_label = ev_sidebar_layers_get_label;
 }