[evolution] EConfig: Support custom page skip callbacks.



commit 932f7cada8400905b5aeb75a3d40979cf4004c22
Author: Matthew Barnes <mbarnes redhat com>
Date:   Wed Mar 7 09:36:12 2012 -0500

    EConfig: Support custom page skip callbacks.
    
    Add e_config_add_skip_check() to install a callback function to
    decide whether to skip a particular page in a GtkAssistant, useful
    if a page may be blank in certain conditions.
    
    This feature is not used in Evolution 3.4, but will be used in 3.5.

 e-util/e-config.c |   62 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 e-util/e-config.h |    4 +++
 2 files changed, 65 insertions(+), 1 deletions(-)
---
diff --git a/e-util/e-config.c b/e-util/e-config.c
index 97711f9..7bb6038 100644
--- a/e-util/e-config.c
+++ b/e-util/e-config.c
@@ -91,6 +91,7 @@ struct _EConfigPrivate {
 	GList *widgets;
 	GList *checks;
 	GList *finish_pages;
+	GHashTable *skip_checks;
 };
 
 static GtkWidget *
@@ -174,6 +175,8 @@ config_finalize (GObject *object)
 		link = g_list_delete_link (link, link);
 	}
 
+	g_hash_table_destroy (priv->skip_checks);
+
 	/* Chain up to parent's finalize() method. */
 	G_OBJECT_CLASS (e_config_parent_class)->finalize (object);
 }
@@ -232,6 +235,12 @@ static void
 e_config_init (EConfig *config)
 {
 	config->priv = E_CONFIG_GET_PRIVATE (config);
+
+	config->priv->skip_checks = g_hash_table_new_full (
+		(GHashFunc) g_str_hash,
+		(GEqualFunc) g_str_equal,
+		(GDestroyNotify) NULL,
+		(GDestroyNotify) check_node_free);
 }
 
 /**
@@ -322,6 +331,39 @@ e_config_add_page_check (EConfig *ec,
 	ec->priv->checks = g_list_append (ec->priv->checks, cn);
 }
 
+/**
+ * e_config_add_skip_check:
+ * @config: an #EConfig
+ * @pageid: the page ID for the skip page callback
+ * @func: the skip page callback function
+ * @data: data to pass to the callback function
+ *
+ * Adds a callback function to decide whether to skip the page in a
+ * GtkAssistant, useful if the page is blank in certain conditions.
+ *
+ * The callback function should return %TRUE if the page should be
+ * skipped, or %FALSE if the page should be visited.
+ **/
+void
+e_config_add_skip_check (EConfig *config,
+                         const gchar *pageid,
+                         EConfigCheckFunc func,
+                         gpointer data)
+{
+	struct _check_node *cn;
+
+	g_return_if_fail (E_IS_CONFIG (config));
+	g_return_if_fail (pageid != NULL);
+	g_return_if_fail (func != NULL);
+
+	cn = g_slice_new0 (struct _check_node);
+	cn->pageid = g_strdup (pageid);
+	cn->func = func;
+	cn->data = data;
+
+	g_hash_table_insert (config->priv->skip_checks, cn->pageid, cn);
+}
+
 static struct _finish_page_node *
 find_page_finish (EConfig *config,
                   const gchar *pageid)
@@ -507,6 +549,24 @@ ec_assistant_check_current (EConfig *ec)
 	gtk_assistant_update_buttons_state (assistant);
 }
 
+static gboolean
+ec_assistant_skip_page (EConfig *config,
+                        struct _widget_node *wn)
+{
+	struct _check_node *cn;
+	gboolean skip_page = FALSE;
+
+	g_return_val_if_fail (wn->item->path != NULL, FALSE);
+	cn = g_hash_table_lookup (config->priv->skip_checks, wn->item->path);
+
+	if (cn != NULL) {
+		g_return_val_if_fail (cn->func != NULL, FALSE);
+		skip_page = cn->func (config, wn->item->path, cn->data);
+	}
+
+	return skip_page;
+}
+
 static gint
 ec_assistant_forward (gint current_page,
                       gpointer user_data)
@@ -554,7 +614,7 @@ ec_assistant_forward (gint current_page,
 				break;
 		}
 
-		if (node_is_page)
+		if (node_is_page && !ec_assistant_skip_page (ec, node))
 			break;
 	}
 
diff --git a/e-util/e-config.h b/e-util/e-config.h
index 0535895..6f009b7 100644
--- a/e-util/e-config.h
+++ b/e-util/e-config.h
@@ -283,6 +283,10 @@ void		e_config_add_page_check		(EConfig *config,
 void		e_config_set_page_is_finish	(EConfig *config,
 						 const gchar *pageid,
 						 gboolean is_finish);
+void		e_config_add_skip_check		(EConfig *config,
+						 const gchar *pageid,
+						 EConfigCheckFunc func,
+						 gpointer data);
 
 void		e_config_set_target		(EConfig *config,
 						 EConfigTarget *target);



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