[evolution] EConfig: Support custom page skip callbacks.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] EConfig: Support custom page skip callbacks.
- Date: Wed, 7 Mar 2012 16:53:45 +0000 (UTC)
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]