[gnome-utils] Tidy up the prefs dialog code



commit 1b8baa20c7ef5c273e37f5d4b72b4a020bd3eafb
Author: Paolo Borelli <pborelli gnome org>
Date:   Sat Jul 24 14:04:20 2010 +0200

    Tidy up the prefs dialog code
    
    Remove global variables, reorder code, etc

 baobab/src/baobab-prefs.c |  348 ++++++++++++++++++---------------------------
 1 files changed, 139 insertions(+), 209 deletions(-)
---
diff --git a/baobab/src/baobab-prefs.c b/baobab/src/baobab-prefs.c
index f94eede..f40e04f 100644
--- a/baobab/src/baobab-prefs.c
+++ b/baobab/src/baobab-prefs.c
@@ -35,31 +35,74 @@
 #include "baobab-prefs.h"
 
 
-static gboolean props_changed;
+static gboolean
+add_excluded_item (GtkTreeModel  *model,
+		   GtkTreePath   *path,
+		   GtkTreeIter   *iter,
+		   GSList       **list)
+{
+	GSList *l;
+	gchar *mount;
+	gboolean check;
+
+	l = *list;
+
+	gtk_tree_model_get (model,
+			    iter,
+			    COL_MOUNT, &mount,
+			    COL_CHECK, &check,
+			    -1);
+
+	if (!check) {
+		l = g_slist_prepend (l, mount);
+	}
+
+	*list = l;
+
+	return FALSE;
+}
+
+static GSList *
+get_excluded_locations (GtkTreeModel *model)
+{
+	GSList *l = NULL;
+
+	gtk_tree_model_foreach (model,
+				(GtkTreeModelForeachFunc) add_excluded_item,
+				&l);
+
+	return g_slist_reverse (l);
+}
+
+static void
+save_gconf (GtkTreeModel *model)
+{
+	GSList *l;
 
-static GtkTreeView *tree_props;
-static GtkListStore *model_props;
-static GtkListStore *create_props_model (void);
-static GtkWidget *create_tree_props (GtkBuilder *builder);
-static void fill_props_model (GtkWidget *);
-static void check_toggled (GtkCellRendererToggle * cell,
-			   gchar * path_str, gpointer data);
+	l = get_excluded_locations (model);
 
-static void read_gconf (void);
-static void save_gconf (void);
-static gboolean set_gconf_list (GtkTreeModel * model, GtkTreePath * path,
-				GtkTreeIter * iter, gpointer data);
+	gconf_client_set_list (baobab.gconf_client,
+			       PROPS_SCAN_KEY, GCONF_VALUE_STRING,
+			       l, NULL);
 
-static gboolean set_model_checks (GtkTreeModel * model, GtkTreePath * path,
-				  GtkTreeIter * iter, gpointer data);
+	g_slist_foreach (l, (GFunc) g_free, NULL);
+	g_slist_free (l);
+}
 
-static void enable_home_cb (GtkToggleButton * togglebutton,
-			    gpointer user_data);
+static void
+enable_home_cb (GtkToggleButton *togglebutton, gpointer user_data)
+{
+	baobab.bbEnableHomeMonitor = gtk_toggle_button_get_active (togglebutton);
+
+	gconf_client_set_bool (baobab.gconf_client, PROPS_ENABLE_HOME_MONITOR,
+			       baobab.bbEnableHomeMonitor, NULL);
+
+}
 
 static void
 filechooser_response_cb (GtkDialog *dialog,
-                         gint       response_id,
-                         gpointer   user_data)
+                         gint response_id,
+                         GtkTreeModel *model)
 {
 	switch (response_id) {
 		case GTK_RESPONSE_HELP:
@@ -67,81 +110,48 @@ filechooser_response_cb (GtkDialog *dialog,
 			                     "baobab.xml", "baobab-preferences");
 			break;
 		case GTK_RESPONSE_CLOSE:
-			if (props_changed) { 
-				save_gconf (); 
-			}
+			save_gconf (model); 
 		default:
 			gtk_widget_destroy (GTK_WIDGET (dialog));
 			break;
 	}
 }
 
-void
-create_props (void)
+static void
+check_toggled (GtkCellRendererToggle *cell,
+	       gchar *path_str,
+	       GtkTreeModel *model)
 {
-	GtkBuilder *builder;
-	GtkWidget *dlg;
-	GtkWidget *check_enablehome;
-	GError *error = NULL;
-
-	props_changed = FALSE;
-
-	builder = gtk_builder_new ();
-	gtk_builder_add_from_file (builder, BAOBAB_DIALOG_SCAN_UI_FILE, &error);
-
-	if (error) {
-		g_critical ("Can't load user interface file for the scan properties dialog: %s",
-			    error->message);
-		g_object_unref (builder);
-		g_error_free (error);
-
-		return;
-	}
-
-	dlg = GTK_WIDGET (gtk_builder_get_object (builder, "dialog_scan_props"));
-
-	gtk_window_set_transient_for (GTK_WINDOW (dlg),
-				      GTK_WINDOW (baobab.window));
-
-	tree_props = (GtkTreeView *) create_tree_props (builder);
-	fill_props_model (dlg);
-	read_gconf ();
-
-	check_enablehome = GTK_WIDGET (gtk_builder_get_object (builder, "check_enable_home"));
-	gtk_toggle_button_set_active ((GtkToggleButton *) check_enablehome,
-				      baobab.bbEnableHomeMonitor);
+	GtkTreeIter iter;
+	GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
+	gboolean toggle;
+	gchar *mountpoint;
 
-	g_signal_connect_after ((GtkToggleButton *) check_enablehome,
-				"toggled", G_CALLBACK (enable_home_cb),
-				NULL);
+	/* get toggled iter */
+	gtk_tree_model_get_iter (model, &iter, path);
+	gtk_tree_model_get (model,
+			    &iter,
+			    COL_CHECK, &toggle,
+			    COL_MOUNT_D, &mountpoint,
+			    -1);
 
-	g_signal_connect (dlg, "response",
-		    	  G_CALLBACK (filechooser_response_cb),
-		    	  NULL);
+	/* check if root dir */
+	if (strcmp ("/", mountpoint) == 0)
+		goto clean_up;
 
-	gtk_widget_show_all (dlg);
-}
+	/* set new value */
+	gtk_list_store_set (GTK_LIST_STORE (model),
+			    &iter,
+			    COL_CHECK, !toggle,
+			    -1);
 
-GtkListStore *
-create_props_model (void)
-{
-	GtkListStore *mdl;
-
-	mdl = gtk_list_store_new (TOT_COLUMNS,
-				  G_TYPE_BOOLEAN,	/* checkbox */
-				  G_TYPE_STRING,	/* device */
-				  G_TYPE_STRING,	/*mount point display */
-				  G_TYPE_STRING,	/* mount point uri */
-				  G_TYPE_STRING,	/* fs type */
-				  G_TYPE_STRING,	/* fs size */
-				  G_TYPE_STRING		/* fs avail */
-				  );
-
-	return mdl;
+ clean_up:
+	g_free (mountpoint);
+	gtk_tree_path_free (path);
 }
 
-GtkWidget *
-create_tree_props (GtkBuilder *builder)
+static void
+create_tree_props (GtkBuilder *builder, GtkTreeModel *model)
 {
 	GtkCellRenderer *cell;
 	GtkTreeViewColumn *col;
@@ -152,7 +162,7 @@ create_tree_props (GtkBuilder *builder)
 	/* checkbox column */
 	cell = gtk_cell_renderer_toggle_new ();
 	g_signal_connect (cell, "toggled",
-			  G_CALLBACK (check_toggled), NULL);
+			  G_CALLBACK (check_toggled), model);
 
 	col = gtk_tree_view_column_new_with_attributes (_("Scan"), cell,
 							"active", COL_CHECK,
@@ -200,48 +210,13 @@ create_tree_props (GtkBuilder *builder)
 							COL_FS_AVAIL, NULL);
 	g_object_set (G_OBJECT (cell), "xalign", (gfloat) 1.0, NULL);
 	gtk_tree_view_append_column (GTK_TREE_VIEW (tvw), col);
-	
-	model_props = create_props_model ();
-	gtk_tree_view_set_model (GTK_TREE_VIEW (tvw),
-				 GTK_TREE_MODEL (model_props));
-	g_object_unref (model_props);
-
-	return tvw;
-}
-
-void
-check_toggled (GtkCellRendererToggle *cell,
-	       gchar *path_str,
-	       gpointer data)
-{
-	GtkTreeIter iter;
-	GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
-	gboolean toggle;
-	gchar *mountpoint;
-
-	/* get toggled iter */
-	gtk_tree_model_get_iter ((GtkTreeModel *) model_props, &iter,
-				 path);
-	gtk_tree_model_get ((GtkTreeModel *) model_props, &iter, COL_CHECK,
-			    &toggle, COL_MOUNT_D, &mountpoint, -1);
 
-	/* check if root dir */
-	if (strcmp ("/", mountpoint) == 0)
-		goto clean_up;
-
-	/* set new value */
-	props_changed = TRUE;
-	toggle ^= 1;
-	gtk_list_store_set (GTK_LIST_STORE (model_props), &iter, COL_CHECK,
-			    toggle, -1);
-
- clean_up:
-	g_free (mountpoint);
-	gtk_tree_path_free (path);
+	gtk_tree_view_set_model (GTK_TREE_VIEW (tvw), model);
+	g_object_unref (model);
 }
 
-void
-fill_props_model (GtkWidget *dlg)
+static void
+fill_props_model (GtkListStore *store)
 {
 	GtkTreeIter iter;
 	guint lo;
@@ -258,6 +233,7 @@ fill_props_model (GtkWidget *dlg)
 		gchar * total, *avail;
 		GFile *file;
 		gchar *uri;
+		gboolean excluded;
 
 		struct stat buf;
 		if (g_stat (mountentry->devname,&buf) == -1)
@@ -270,9 +246,11 @@ fill_props_model (GtkWidget *dlg)
 		avail = g_format_size_for_display(fsavail);
 		file = g_file_new_for_path (mountentry->mountdir);
 		uri = g_file_get_uri (file);
-		gtk_list_store_append (model_props, &iter);
-		gtk_list_store_set (model_props, &iter,
-				    COL_CHECK, TRUE,
+		excluded = baobab_is_excluded_location (file);
+
+		gtk_list_store_append (store, &iter);
+		gtk_list_store_set (store, &iter,
+				    COL_CHECK, !excluded,
 				    COL_DEVICE, mountentry->devname,
 				    COL_MOUNT_D, mountentry->mountdir,
 				    COL_MOUNT, uri,
@@ -290,104 +268,56 @@ fill_props_model (GtkWidget *dlg)
 }
 
 void
-read_gconf (void)
-{
-	GSList *l;
-
-	l = gconf_client_get_list (baobab.gconf_client, PROPS_SCAN_KEY,
-				   GCONF_VALUE_STRING, NULL);
-
-	if (!l)
-		return;
-
-	gtk_tree_model_foreach (GTK_TREE_MODEL (model_props),
-				set_model_checks, l);
-
-	g_slist_foreach (l, (GFunc) g_free, NULL);
-	g_slist_free (l);
-}
-
-void
-save_gconf (void)
+create_props (void)
 {
-	GSList *l = NULL;
-
-	l = g_slist_append (l, "START");
-	gtk_tree_model_foreach (GTK_TREE_MODEL (model_props),
-				set_gconf_list, l);
-	l = g_slist_remove (l, "START");
-	gconf_client_set_list (baobab.gconf_client,
-			       PROPS_SCAN_KEY, GCONF_VALUE_STRING,
-			       l, NULL);
-
-	g_slist_foreach (l, (GFunc) g_free, NULL);
-	g_slist_free (l);
-}
+	GtkBuilder *builder;
+	GtkWidget *dlg;
+	GtkWidget *check_enablehome;
+	GtkListStore *model;
+	GError *error = NULL;
 
-gboolean
-set_gconf_list (GtkTreeModel *model,
-		GtkTreePath *path,
-		GtkTreeIter *iter,
-		gpointer list)
-{
-	gchar *mount;
-	gboolean check;
+	builder = gtk_builder_new ();
+	gtk_builder_add_from_file (builder, BAOBAB_DIALOG_SCAN_UI_FILE, &error);
 
-	gtk_tree_model_get (model, iter, COL_MOUNT, &mount, COL_CHECK,
-			    &check, -1);
+	if (error) {
+		g_critical ("Can't load user interface file for the scan properties dialog: %s",
+			    error->message);
+		g_object_unref (builder);
+		g_error_free (error);
 
-	/* add only un-checked mount points */
-	if (!check) {
-		list = g_slist_last (list);
-		list = g_slist_append (list, mount);
+		return;
 	}
 
-	/* g_free(mount); //freed in save_gconf() */
-	return FALSE;
-}
-
-static gint
-list_find (gconstpointer a, gconstpointer b)
-{
-	gchar *str_a, *str_b;
-	gint ret;
-	
-	str_a = g_uri_unescape_string (a,NULL);
-	str_b = g_uri_unescape_string (b,NULL);
-
-	ret = strcmp (str_a, str_b);
+	dlg = GTK_WIDGET (gtk_builder_get_object (builder, "dialog_scan_props"));
 
-	g_free (str_a);
-	g_free (str_b);
+	gtk_window_set_transient_for (GTK_WINDOW (dlg),
+				      GTK_WINDOW (baobab.window));
 
-	return ret;
-}
+	model = gtk_list_store_new (TOT_COLUMNS,
+				    G_TYPE_BOOLEAN,	/* checkbox */
+				    G_TYPE_STRING,	/* device */
+				    G_TYPE_STRING,	/*mount point display */
+				    G_TYPE_STRING,	/* mount point uri */
+				    G_TYPE_STRING,	/* fs type */
+				    G_TYPE_STRING,	/* fs size */
+				    G_TYPE_STRING	/* fs avail */
+				    );
 
-gboolean
-set_model_checks (GtkTreeModel *model,
-		  GtkTreePath *path,
-		  GtkTreeIter *iter,
-		  gpointer list)
-{
-	gchar *mount;
+	create_tree_props (builder, GTK_TREE_MODEL (model));
+	fill_props_model (model);
 
-	gtk_tree_model_get (model, iter, COL_MOUNT, &mount, -1);
+	check_enablehome = GTK_WIDGET (gtk_builder_get_object (builder, "check_enable_home"));
+	gtk_toggle_button_set_active ((GtkToggleButton *) check_enablehome,
+				      baobab.bbEnableHomeMonitor);
 
-	if (g_slist_find_custom (list, mount, list_find) != NULL)
-		gtk_list_store_set ((GtkListStore *) model, iter,
-				    COL_CHECK, FALSE, -1);
+	g_signal_connect_after ((GtkToggleButton *) check_enablehome,
+				"toggled", G_CALLBACK (enable_home_cb),
+				NULL);
 
-	g_free (mount);
+	g_signal_connect (dlg, "response",
+		    	  G_CALLBACK (filechooser_response_cb),
+		    	  model);
 
-	return FALSE;
+	gtk_widget_show_all (dlg);
 }
 
-void
-enable_home_cb (GtkToggleButton *togglebutton, gpointer user_data)
-{
-	baobab.bbEnableHomeMonitor = gtk_toggle_button_get_active (togglebutton);
-
-	gconf_client_set_bool (baobab.gconf_client, PROPS_ENABLE_HOME_MONITOR,
-			       baobab.bbEnableHomeMonitor, NULL);
-
-}



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