aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/e-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'e-util/e-config.c')
-rw-r--r--e-util/e-config.c166
1 files changed, 104 insertions, 62 deletions
diff --git a/e-util/e-config.c b/e-util/e-config.c
index 39f4087dac..44e55a182f 100644
--- a/e-util/e-config.c
+++ b/e-util/e-config.c
@@ -386,55 +386,65 @@ ep_cmp(gconstpointer ap, gconstpointer bp)
return strcmp(a->item->path, b->item->path);
}
-static struct _widget_node *
+static GList *
ec_assistant_find_page (EConfig *ec, GtkWidget *page, gint *page_index)
{
- struct _widget_node *wn = NULL;
+ struct _widget_node *node = NULL;
GList *link;
g_return_val_if_fail (ec != NULL, NULL);
g_return_val_if_fail (GTK_IS_ASSISTANT (ec->widget), NULL);
g_return_val_if_fail (page != NULL, NULL);
- link = ec->priv->widgets;
+ /* Assume failure, then if we do fail we can just return. */
+ if (page_index != NULL)
+ *page_index = -1;
- while (link != NULL) {
- wn = link->data;
+ /* Find the page widget in our sorted widget node list. */
+ for (link = ec->priv->widgets; link != NULL; link = link->next) {
+ node = link->data;
- if (wn->frame == page
- && (wn->item->type == E_CONFIG_PAGE
- || wn->item->type == E_CONFIG_PAGE_START
- || wn->item->type == E_CONFIG_PAGE_FINISH
- || wn->item->type == E_CONFIG_PAGE_PROGRESS))
- break;
+ if (node->frame != page)
+ continue;
- link = g_list_next (link);
- }
+ if (node->item->type == E_CONFIG_PAGE)
+ break;
+
+ if (node->item->type == E_CONFIG_PAGE_START)
+ break;
- g_return_val_if_fail (wn != NULL, NULL);
+ if (node->item->type == E_CONFIG_PAGE_FINISH)
+ break;
+
+ if (node->item->type == E_CONFIG_PAGE_PROGRESS)
+ break;
+ }
- if (wn->frame != page)
- wn = NULL;
+ /* FAIL: The widget is not in our list. */
+ if (link == NULL)
+ return NULL;
+ /* Find the corresponding GtkAssistant page index. */
if (page_index) {
- if (wn) {
- GtkAssistant *assistant = GTK_ASSISTANT (ec->widget);
- gint index, count = gtk_assistant_get_n_pages (assistant);
+ GtkAssistant *assistant;
+ GtkWidget *nth_page;
+ gint ii, n_pages;
- for (index = 0; index < count; index++) {
- if (gtk_assistant_get_nth_page (assistant, index) == page)
- break;
- }
+ assistant = GTK_ASSISTANT (ec->widget);
+ n_pages = gtk_assistant_get_n_pages (assistant);
- if (index == count)
- index = -1;
- *page_index = index;
- } else {
- *page_index = -1;
+ for (ii = 0; ii < n_pages; ii++) {
+ nth_page = gtk_assistant_get_nth_page (assistant, ii);
+ if (page == nth_page) {
+ *page_index = ii;
+ break;
+ }
}
+
+ g_warn_if_fail (ii < n_pages);
}
- return wn;
+ return link;
}
static void
@@ -444,6 +454,7 @@ ec_assistant_check_current (EConfig *ec)
struct _finish_page_node *fp;
GtkAssistant *assistant;
GtkWidget *page;
+ GList *link;
gint page_no;
g_return_if_fail (GTK_IS_ASSISTANT (ec->widget));
@@ -458,8 +469,9 @@ ec_assistant_check_current (EConfig *ec)
page = gtk_assistant_get_nth_page (assistant, page_no);
g_return_if_fail (page != NULL);
- wn = ec_assistant_find_page (ec, page, NULL);
- g_return_if_fail (wn != NULL);
+ link = ec_assistant_find_page (ec, page, NULL);
+ g_return_if_fail (link != NULL);
+ wn = link->data;
/* this should come first, as the check function can change the finish state of the page */
gtk_assistant_set_page_complete (assistant, page, e_config_page_check (ec, wn->item->path));
@@ -483,39 +495,55 @@ ec_assistant_check_current (EConfig *ec)
static gint
ec_assistant_forward (gint current_page, gpointer user_data)
{
+ GtkAssistant *assistant;
EConfig *ec = user_data;
- struct _widget_node *wn;
- gint next_page = current_page + 1;
+ struct _widget_node *node;
+ GtkWidget *page_widget;
GList *link = NULL;
+ gint next_page;
- d(printf("next page from '%d'\n", current_page));
+ /* As far as we're concerned, the GtkAssistant is just an unordered
+ * collection of pages. Our sorted list of widget nodes determines
+ * the next page. */
- wn = ec_assistant_find_page (ec, gtk_assistant_get_nth_page (GTK_ASSISTANT (ec->widget), current_page), NULL);
+ assistant = GTK_ASSISTANT (ec->widget);
+ page_widget = gtk_assistant_get_nth_page (assistant, current_page);
+ link = ec_assistant_find_page (ec, page_widget, NULL);
- /* XXX This is a little kludgy. We have to find
- * the GList node for the page we just found. */
- if (wn != NULL)
- link = g_list_find (ec->priv->widgets, wn);
+ g_return_val_if_fail (link != NULL, -1);
+ node = (struct _widget_node *) link->data;
- if (link && link->next) {
- for (link = link->next; link->next; link = link->next) {
- wn = link->data;
+ /* If we're already on a FINISH page then we're done. */
+ if (node->item->type == E_CONFIG_PAGE_FINISH)
+ return -1;
- if (!wn->empty && wn->frame != NULL
- && (wn->item->type == E_CONFIG_PAGE
- || wn->item->type == E_CONFIG_PAGE_START
- || wn->item->type == E_CONFIG_PAGE_FINISH
- || wn->item->type == E_CONFIG_PAGE_PROGRESS))
- break;
- }
- }
+ /* Find the next E_CONFIG_PAGE* type node. */
+ for (link = link->next; link != NULL; link = link->next) {
+ node = (struct _widget_node *) link->data;
+
+ if (node->empty || node->frame == NULL)
+ continue;
- if (link && link->next) {
- wn = link->data;
- ec_assistant_find_page (ec, wn->frame, &next_page);
- d(printf(" is %s (%d)\n",wn->item->path, next_page));
+ if (node->item->type == E_CONFIG_PAGE)
+ break;
+
+ if (node->item->type == E_CONFIG_PAGE_START)
+ break;
+
+ if (node->item->type == E_CONFIG_PAGE_FINISH)
+ break;
+
+ if (node->item->type == E_CONFIG_PAGE_PROGRESS)
+ break;
}
+ /* Find the corresponding GtkAssistant page number. */
+ if (link != NULL) {
+ node = (struct _widget_node *) link->data;
+ ec_assistant_find_page (ec, node->frame, &next_page);
+ } else
+ next_page = -1;
+
return next_page;
}
@@ -527,7 +555,7 @@ ec_rebuild (EConfig *emp)
GtkWidget *book = NULL, *page = NULL, *section = NULL, *root = NULL, *assistant = NULL;
gint pageno = 0, sectionno = 0, itemno = 0;
gint n_visible_widgets = 0;
- struct _widget_node *last_active_page = NULL;
+ GList *last_active_link = NULL;
gboolean is_assistant;
GList *link;
@@ -541,9 +569,20 @@ ec_rebuild (EConfig *emp)
/* because rebuild destroys pages, and destroying active page causes crashes */
is_assistant = emp->widget && GTK_IS_ASSISTANT (emp->widget);
if (is_assistant) {
+ GtkAssistant *assistant;
gint page_index = gtk_assistant_get_current_page (GTK_ASSISTANT (emp->widget));
- if (page_index != -1)
- last_active_page = ec_assistant_find_page (emp, gtk_assistant_get_nth_page (GTK_ASSISTANT (emp->widget), page_index), NULL);
+
+ assistant = GTK_ASSISTANT (emp->widget);
+ page_index = gtk_assistant_get_current_page (assistant);
+
+ if (page_index != -1) {
+ GtkWidget *nth_page;
+
+ nth_page = gtk_assistant_get_nth_page (
+ GTK_ASSISTANT (emp->widget), page_index);
+ last_active_link = ec_assistant_find_page (
+ emp, nth_page, NULL);
+ }
gtk_assistant_set_current_page (GTK_ASSISTANT (emp->widget), 0);
}
@@ -680,8 +719,7 @@ ec_rebuild (EConfig *emp)
break;
}
- if (item->type == E_CONFIG_PAGE_FINISH || wn->widget == NULL) {
- /* always rebuild finish page, to have it as the last page */
+ if (wn->widget == NULL) {
if (item->factory) {
page = item->factory(emp, item, root, wn->frame, wn->context->data);
} else {
@@ -989,11 +1027,15 @@ ec_rebuild (EConfig *emp)
}
}
- if (is_assistant && last_active_page) {
+ if (is_assistant && last_active_link != NULL) {
+ GtkAssistant *assistant;
+ struct _widget_node *wn;
gint page_index = -1;
- ec_assistant_find_page (emp, last_active_page->frame, &page_index);
- gtk_assistant_set_current_page (GTK_ASSISTANT (emp->widget), page_index);
+ wn = last_active_link->data;
+ assistant = GTK_ASSISTANT (emp->widget);
+ ec_assistant_find_page (emp, wn->frame, &page_index);
+ gtk_assistant_set_current_page (assistant, page_index);
}
}