[evince] Save always settings that can bse saved as default in metadata



commit 720eebf9f0dd2e6a2765f6117f3bce9d7c74fcfa
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Sat Jan 7 15:11:07 2012 +0100

    Save always settings that can bse saved as default in metadata
    
    We relided on default values to store settings in metadata, so that
    settings that don't change are not saved in metdata. Now that default
    settings can change, that approach doesn't work, so we need o save all
    settings in metadata.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=639003

 shell/ev-metadata.c |    7 ++
 shell/ev-metadata.h |    2 +
 shell/ev-window.c   |  252 +++++++++++++++++++++++++--------------------------
 3 files changed, 131 insertions(+), 130 deletions(-)
---
diff --git a/shell/ev-metadata.c b/shell/ev-metadata.c
index 3a0eefa..1e150c8 100644
--- a/shell/ev-metadata.c
+++ b/shell/ev-metadata.c
@@ -290,6 +290,13 @@ ev_metadata_set_boolean (EvMetadata  *metadata,
 }
 
 gboolean
+ev_metadata_has_key (EvMetadata  *metadata,
+                     const gchar *key)
+{
+        return g_hash_table_lookup (metadata->items, key) != NULL;
+}
+
+gboolean
 ev_is_metadata_supported_for_file (GFile *file)
 {
 	GFileAttributeInfoList *namespaces;
diff --git a/shell/ev-metadata.h b/shell/ev-metadata.h
index 8daf61c..7fd4f05 100644
--- a/shell/ev-metadata.h
+++ b/shell/ev-metadata.h
@@ -62,6 +62,8 @@ gboolean    ev_metadata_get_boolean           (EvMetadata  *metadata,
 gboolean    ev_metadata_set_boolean           (EvMetadata  *metadata,
 					       const gchar *key,
 					       gboolean     value);
+gboolean    ev_metadata_has_key               (EvMetadata  *metadata,
+                                               const gchar *key);
 
 gboolean    ev_is_metadata_supported_for_file (GFile       *file);
 
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 95ae4ed..00b915b 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -199,7 +199,6 @@ struct _EvWindowPrivate {
 	EvWindowTitle *title;
 	EvMetadata *metadata;
 	EvBookmarks *bookmarks;
-	gboolean is_new_doc;
 
 	/* Load params */
 	EvLinkDest       *dest;
@@ -1051,120 +1050,110 @@ update_document_mode (EvWindow *window, EvDocumentMode mode)
 }
 
 static void
-setup_chrome_from_metadata (EvWindow *window)
+ev_window_init_metadata_with_default_values (EvWindow *window)
 {
-	EvChrome chrome = EV_CHROME_NORMAL;
-	gboolean show_toolbar = TRUE;
+	GSettings  *settings = window->priv->default_settings;
+	EvMetadata *metadata = window->priv->metadata;
 
-	if (ev_window_is_empty (window)) {
-		window->priv->chrome = chrome;
+	/* Chrome */
+	if (!ev_metadata_has_key (metadata, "show_toolbar")) {
+		ev_metadata_set_boolean (metadata, "show_toolbar",
+					 g_settings_get_boolean (settings, "show-toolbar"));
+	}
+	if (!ev_metadata_has_key (metadata, "sidebar_visibility")) {
+		ev_metadata_set_boolean (metadata, "sidebar_visibility",
+					 g_settings_get_boolean (settings, "show-sidebar"));
+	}
 
-		return;
+	/* Sidebar */
+	if (!ev_metadata_has_key (metadata, "sidebar_size")) {
+		ev_metadata_set_int (metadata, "sidebar_size",
+				     g_settings_get_int (settings, "sidebar-size"));
+	}
+	if (!ev_metadata_has_key (metadata, "sidebar_page")) {
+		gchar *sidebar_page_id = g_settings_get_string (settings, "sidebar-page");
+
+		ev_metadata_set_string (metadata, "sidebar_page", sidebar_page_id);
+		g_free (sidebar_page_id);
+	}
+
+	/* Document model */
+	if (!ev_metadata_has_key (metadata, "continuous")) {
+		ev_metadata_set_boolean (metadata, "continuous",
+					 g_settings_get_boolean (settings, "continuous"));
 	}
+	if (!ev_metadata_has_key (metadata, "dual-page")) {
+		ev_metadata_set_boolean (metadata, "dual-page",
+					 g_settings_get_boolean (settings, "dual-page"));
+	}
+	if (!ev_metadata_has_key (metadata, "inverted-colors")) {
+		ev_metadata_set_boolean (metadata, "inverted-colors",
+					 g_settings_get_boolean (settings, "inverted-colors"));
+	}
+	if (!ev_metadata_has_key (metadata, "sizing_mode")) {
+		EvSizingMode mode = g_settings_get_enum (settings, "sizing-mode");
+		GEnumValue *enum_value = g_enum_get_value (g_type_class_peek (EV_TYPE_SIZING_MODE), mode);
 
-	if (!window->priv->metadata) {
-		show_toolbar = g_settings_get_boolean (window->priv->default_settings, "show-toolbar");
-	} else if (!ev_metadata_get_boolean (window->priv->metadata, "show_toolbar", &show_toolbar)) {
-		if (window->priv->is_new_doc)
-			show_toolbar = g_settings_get_boolean (window->priv->default_settings, "show-toolbar");
+		ev_metadata_set_string (metadata, "sizing_mode", enum_value->value_nick);
 	}
 
-	if (!show_toolbar)
-		chrome &= ~EV_CHROME_TOOLBAR;
+	if (!ev_metadata_has_key (metadata, "zoom")) {
+		ev_metadata_set_double (metadata, "zoom",
+					g_settings_get_double (settings, "zoom"));
+	}
 
-	window->priv->chrome = chrome;
+	if (!ev_metadata_has_key (metadata, "fullscreen")) {
+		ev_metadata_set_boolean (metadata, "fullscreen",
+					 g_settings_get_boolean (settings, "fullscreen"));
+	}
 }
 
 static void
-setup_sidebar_from_metadata (EvWindow *window)
+setup_chrome_from_metadata (EvWindow *window)
 {
-	EvDocument *document = window->priv->document;
-	GSettings  *settings =  window->priv->default_settings;
-	gchar      *page_id;
-	gint        sidebar_size;
-	gboolean    sidebar_visibility = TRUE;
+	gboolean show_toolbar;
+	gboolean show_sidebar;
 
-	if (ev_window_is_empty (window))
+	if (!window->priv->metadata)
 		return;
 
-	if (!window->priv->metadata) {
-		sidebar_visibility = g_settings_get_boolean (settings, "show-sidebar");
-	} else if (!ev_metadata_get_boolean (window->priv->metadata, "sidebar_visibility", &sidebar_visibility)) {
-		if (window->priv->is_new_doc)
-			sidebar_visibility = g_settings_get_boolean (settings, "show-sidebar");
-	}
-
-	update_chrome_flag (window, EV_CHROME_SIDEBAR, sidebar_visibility);
+	if (ev_metadata_get_boolean (window->priv->metadata, "show_toolbar", &show_toolbar))
+		update_chrome_flag (window, EV_CHROME_TOOLBAR, show_toolbar);
+	if (ev_metadata_get_boolean (window->priv->metadata, "sidebar_visibility", &show_sidebar))
+		update_chrome_flag (window, EV_CHROME_SIDEBAR, show_sidebar);
 	update_chrome_visibility (window);
+}
 
-	if (!window->priv->metadata) {
-		/* Set default values */
-		gtk_paned_set_position (GTK_PANED (window->priv->hpaned),
-					g_settings_get_int (settings, "sidebar-size"));
-		if (document) {
-			page_id = g_settings_get_string (settings, "sidebar-page");
-			ev_window_sidebar_set_current_page (window, page_id);
-			g_free (page_id);
-		}
+static void
+setup_sidebar_from_metadata (EvWindow *window)
+{
+	gchar *page_id;
+	gint   sidebar_size;
 
+	if (!window->priv->metadata)
 		return;
-	}
 
-	if (ev_metadata_get_int (window->priv->metadata, "sidebar_size", &sidebar_size)) {
+	if (ev_metadata_get_int (window->priv->metadata, "sidebar_size", &sidebar_size))
 		gtk_paned_set_position (GTK_PANED (window->priv->hpaned), sidebar_size);
-	} else if (window->priv->is_new_doc) {
-		gtk_paned_set_position (GTK_PANED (window->priv->hpaned),
-					g_settings_get_int (settings, "sidebar-size"));
-	}
-
-	if (!document)
-		return;
 
-	if (ev_metadata_get_string (window->priv->metadata, "sidebar_page", &page_id)) {
-		ev_window_sidebar_set_current_page (window, page_id);
-	} else if (window->priv->is_new_doc) {
-		page_id = g_settings_get_string (settings, "sidebar-page");
+	if (ev_metadata_get_string (window->priv->metadata, "sidebar_page", &page_id))
 		ev_window_sidebar_set_current_page (window, page_id);
-		g_free (page_id);
-	}
 }
 
 static void
 setup_model_from_metadata (EvWindow *window)
 {
-	GSettings *settings = window->priv->default_settings;
-	gint       page;
-	gchar     *sizing_mode;
-	gdouble    zoom;
-	gint       rotation;
-	gboolean   inverted_colors = FALSE;
-	gboolean   continuous = FALSE;
-	gboolean   dual_page = FALSE;
-	gboolean   fullscreen = FALSE;
-
-	if (!window->priv->metadata) {
-		EvSizingMode sizing_mode;
-
-		/* Set default values */
-		sizing_mode = g_settings_get_enum (settings, "sizing-mode");
-		ev_document_model_set_sizing_mode (window->priv->model, sizing_mode);
-		if (sizing_mode == EV_SIZING_FREE) {
-			zoom = g_settings_get_double (settings, "zoom");
-			zoom *= get_screen_dpi (window) / 72.0;
-			ev_document_model_set_scale (window->priv->model, zoom);
-		}
-		ev_document_model_set_inverted_colors (window->priv->model,
-						       g_settings_get_boolean (settings, "inverted-colors"));
-		ev_document_model_set_continuous (window->priv->model,
-						  g_settings_get_boolean (settings, "continuous"));
-		ev_document_model_set_dual_page (window->priv->model,
-						 g_settings_get_boolean (settings, "dual-page"));
-		fullscreen = g_settings_get_boolean (settings, "fullscreen");
-		if (fullscreen)
-			ev_window_run_fullscreen (window);
+	gint     page;
+	gchar   *sizing_mode;
+	gdouble  zoom;
+	gint     rotation;
+	gboolean inverted_colors = FALSE;
+	gboolean continuous = FALSE;
+	gboolean dual_page = FALSE;
+	gboolean fullscreen = FALSE;
 
+	if (!window->priv->metadata)
 		return;
-	}
 
 	/* Current page */
 	if (!window->priv->dest &&
@@ -1179,9 +1168,6 @@ setup_model_from_metadata (EvWindow *window)
 		enum_value = g_enum_get_value_by_nick
 			(g_type_class_peek (EV_TYPE_SIZING_MODE), sizing_mode);
 		ev_document_model_set_sizing_mode (window->priv->model, enum_value->value);
-	} else if (window->priv->is_new_doc) {
-		ev_document_model_set_sizing_mode (window->priv->model,
-						   g_settings_get_enum (settings, "sizing-mode"));
 	}
 
 	/* Zoom */
@@ -1189,10 +1175,6 @@ setup_model_from_metadata (EvWindow *window)
 		if (ev_metadata_get_double (window->priv->metadata, "zoom", &zoom)) {
 			zoom *= get_screen_dpi (window) / 72.0;
 			ev_document_model_set_scale (window->priv->model, zoom);
-		} else if (window->priv->is_new_doc) {
-			zoom = g_settings_get_double (settings, "zoom");
-			zoom *= get_screen_dpi (window) / 72.0;
-			ev_document_model_set_scale (window->priv->model, zoom);
 		}
 	}
 
@@ -1218,35 +1200,23 @@ setup_model_from_metadata (EvWindow *window)
 	/* Inverted Colors */
 	if (ev_metadata_get_boolean (window->priv->metadata, "inverted-colors", &inverted_colors)) {
 		ev_document_model_set_inverted_colors (window->priv->model, inverted_colors);
-	} else if (window->priv->is_new_doc) {
-		ev_document_model_set_inverted_colors (window->priv->model,
-						       g_settings_get_boolean (settings, "inverted-colors"));
 	}
 
 	/* Continuous */
 	if (ev_metadata_get_boolean (window->priv->metadata, "continuous", &continuous)) {
 		ev_document_model_set_continuous (window->priv->model, continuous);
-	} else if (window->priv->is_new_doc) {
-		ev_document_model_set_continuous (window->priv->model,
-						  g_settings_get_boolean (settings, "continuous"));
 	}
 
 	/* Dual page */
 	if (ev_metadata_get_boolean (window->priv->metadata, "dual-page", &dual_page)) {
 		ev_document_model_set_dual_page (window->priv->model, dual_page);
-	} else if (window->priv->is_new_doc) {
-		ev_document_model_set_dual_page (window->priv->model,
-						 g_settings_get_boolean (settings, "dual-page"));
 	}
 
 	/* Fullscreen */
-	if (!ev_metadata_get_boolean (window->priv->metadata, "fullscreen", &fullscreen)) {
-		if (window->priv->is_new_doc)
-			fullscreen = g_settings_get_boolean (settings, "fullscreen");
+	if (ev_metadata_get_boolean (window->priv->metadata, "fullscreen", &fullscreen)) {
+		if (fullscreen)
+			ev_window_run_fullscreen (window);
 	}
-
-	if (fullscreen)
-		ev_window_run_fullscreen (window);
 }
 
 static void
@@ -1258,22 +1228,23 @@ setup_document_from_metadata (EvWindow *window)
 	gdouble width_ratio;
 	gdouble height_ratio;
 
+	if (!window->priv->metadata)
+		return;
+
 	setup_sidebar_from_metadata (window);
 
-	if (window->priv->metadata) {
-		/* Make sure to not open a document on the last page,
-		 * since closing it on the last page most likely means the
-		 * user was finished reading the document. In that case, reopening should
-		 * show the first page. */
-		page = ev_document_model_get_page (window->priv->model);
-		n_pages = ev_document_get_n_pages (window->priv->document);
-		if (page == n_pages - 1)
-			ev_document_model_set_page (window->priv->model, 0);
+	/* Make sure to not open a document on the last page,
+	 * since closing it on the last page most likely means the
+	 * user was finished reading the document. In that case, reopening should
+	 * show the first page. */
+	page = ev_document_model_get_page (window->priv->model);
+	n_pages = ev_document_get_n_pages (window->priv->document);
+	if (page == n_pages - 1)
+		ev_document_model_set_page (window->priv->model, 0);
 
-		if (ev_metadata_get_int (window->priv->metadata, "window_width", &width) &&
-		    ev_metadata_get_int (window->priv->metadata, "window_height", &height))
-			return; /* size was already set in setup_size_from_metadata */
-	}
+	if (ev_metadata_get_int (window->priv->metadata, "window_width", &width) &&
+	    ev_metadata_get_int (window->priv->metadata, "window_height", &height))
+		return; /* size was already set in setup_size_from_metadata */
 
 	g_settings_get (window->priv->default_settings, "window-ratio", "(dd)", &width_ratio, &height_ratio);
 	if (width_ratio > 0. && height_ratio > 0.) {
@@ -1345,13 +1316,38 @@ setup_view_from_metadata (EvWindow *window)
 
 	/* Presentation */
 	if (ev_metadata_get_boolean (window->priv->metadata, "presentation", &presentation)) {
-		if (presentation) {
+		if (presentation)
 			ev_window_run_presentation (window);
-		}
 	}
 }
 
 static void
+ev_window_setup_default (EvWindow *ev_window)
+{
+	EvDocumentModel *model = ev_window->priv->model;
+	GSettings       *settings = ev_window->priv->default_settings;
+
+	/* Chrome */
+	update_chrome_flag (ev_window, EV_CHROME_TOOLBAR,
+			    g_settings_get_boolean (settings, "show-toolbar"));
+	update_chrome_flag (ev_window, EV_CHROME_SIDEBAR,
+			    g_settings_get_boolean (settings, "show-sidebar"));
+	update_chrome_visibility (ev_window);
+
+	/* Sidebar */
+	gtk_paned_set_position (GTK_PANED (ev_window->priv->hpaned),
+				g_settings_get_int (settings, "sidebar-size"));
+
+	/* Document model */
+	ev_document_model_set_continuous (model, g_settings_get_boolean (settings, "continuous"));
+	ev_document_model_set_dual_page (model, g_settings_get_boolean (settings, "dual-page"));
+	ev_document_model_set_inverted_colors (model, g_settings_get_boolean (settings, "inverted-colors"));
+	ev_document_model_set_sizing_mode (model, g_settings_get_enum (settings, "sizing-mode"));
+	if (ev_document_model_get_sizing_mode (model) == EV_SIZING_FREE)
+		ev_document_model_set_scale (model, g_settings_get_double (settings, "zoom"));
+}
+
+static void
 ev_window_clear_thumbnail_job (EvWindow *ev_window)
 {
 	if (ev_window->priv->thumbnail_job != NULL) {
@@ -2092,7 +2088,7 @@ ev_window_open_uri (EvWindow       *ev_window,
 	source_file = g_file_new_for_uri (uri);
 	if (!ev_file_is_temp (source_file) && ev_is_metadata_supported_for_file (source_file)) {
 		ev_window->priv->metadata = ev_metadata_new (source_file);
-		ev_window->priv->is_new_doc = ev_metadata_is_empty (ev_window->priv->metadata);
+		ev_window_init_metadata_with_default_values (ev_window);
 	} else {
 		ev_window->priv->metadata = NULL;
 	}
@@ -7097,6 +7093,7 @@ ev_window_init (EvWindow *ev_window)
 	ev_window->priv->model = ev_document_model_new ();
 
 	ev_window->priv->page_mode = PAGE_MODE_DOCUMENT;
+	ev_window->priv->chrome = EV_CHROME_NORMAL;
 	ev_window->priv->title = ev_window_title_new (ev_window);
 
 	ev_window->priv->main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
@@ -7452,21 +7449,16 @@ ev_window_init (EvWindow *ev_window)
 
 	ev_window->priv->default_settings = g_settings_new (GS_SCHEMA_NAME".Default");
 	g_settings_delay (ev_window->priv->default_settings);
+	ev_window_setup_default (ev_window);
+	update_chrome_actions (ev_window);
 
 	/* Set it user interface params */
 	ev_window_setup_recent (ev_window);
 
 	ev_window_setup_gtk_settings (ev_window);
 
-	setup_chrome_from_metadata (ev_window);
-	update_chrome_actions (ev_window);
-	update_chrome_visibility (ev_window);
-
 	gtk_window_set_default_size (GTK_WINDOW (ev_window), 600, 600);
 
-	setup_view_from_metadata (ev_window);
-	setup_sidebar_from_metadata (ev_window);
-
         ev_window_sizing_mode_changed_cb (ev_window->priv->model, NULL, ev_window);
 	ev_window_setup_action_sensitivity (ev_window);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]