From c83e76fb1252831f6eec1287efe71e57e94d976c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 16 Apr 2011 20:45:26 -0400 Subject: [PATCH] GtkAssistant: an new style for assistants GtkAssistant is widely recognized as a butt-ugly widget. This commit changes its style to look more modern. We deprecate the sidebar and header image properties and don't show them anymore. Instead, page titles are arranged in a sidebar, with the title of the current page shown in highlighted style. --- gtk/gtkassistant.c | 1036 +++++++++++++++----------------------------- gtk/gtkassistant.h | 56 +-- 2 files changed, 389 insertions(+), 703 deletions(-) diff --git a/gtk/gtkassistant.c b/gtk/gtkassistant.c index 17ecf46a87..7e9b7d1a6e 100644 --- a/gtk/gtkassistant.c +++ b/gtk/gtkassistant.c @@ -64,8 +64,9 @@ #include "gtkaccessibleprivate.h" #include "gtkbutton.h" -#include "gtkhbox.h" -#include "gtkhbbox.h" +#include "gtkbox.h" +#include "gtkeventbox.h" +#include "gtknotebook.h" #include "gtkimage.h" #include "gtklabel.h" #include "gtksizegroup.h" @@ -84,12 +85,15 @@ typedef struct _GtkAssistantPage GtkAssistantPage; struct _GtkAssistantPage { - GtkWidget *page; GtkAssistantPageType type; - guint complete : 1; + guint complete : 1; guint complete_set : 1; - GtkWidget *title; + gchar *title; + + GtkWidget *page; + GtkWidget *regular_title; + GtkWidget *current_title; GdkPixbuf *header_image; GdkPixbuf *sidebar_image; }; @@ -103,54 +107,37 @@ struct _GtkAssistantPrivate GtkWidget *close; GtkWidget *last; - GtkWidget *header_image; - GtkWidget *sidebar_image; - + GtkWidget *sidebar; + GtkWidget *content; GtkWidget *action_area; GList *pages; - + GSList *visited_pages; GtkAssistantPage *current_page; - GSList *visited_pages; - - GtkSizeGroup *size_group; + GtkSizeGroup *button_size_group; + GtkSizeGroup *title_size_group; GtkAssistantPageFunc forward_function; gpointer forward_function_data; GDestroyNotify forward_data_destroy; + gint extra_buttons; + guint committed : 1; }; static void gtk_assistant_class_init (GtkAssistantClass *class); static void gtk_assistant_init (GtkAssistant *assistant); static void gtk_assistant_destroy (GtkWidget *widget); -static void gtk_assistant_style_updated (GtkWidget *widget); -static void gtk_assistant_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural); -static void gtk_assistant_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural); -static void gtk_assistant_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); static void gtk_assistant_map (GtkWidget *widget); static void gtk_assistant_unmap (GtkWidget *widget); static gboolean gtk_assistant_delete_event (GtkWidget *widget, GdkEventAny *event); -static gboolean gtk_assistant_draw (GtkWidget *widget, - cairo_t *cr); -static gboolean gtk_assistant_focus (GtkWidget *widget, - GtkDirectionType direction); static void gtk_assistant_add (GtkContainer *container, GtkWidget *page); static void gtk_assistant_remove (GtkContainer *container, GtkWidget *page); -static void gtk_assistant_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); static void gtk_assistant_set_child_property (GtkContainer *container, GtkWidget *child, guint property_id, @@ -223,20 +210,13 @@ gtk_assistant_class_init (GtkAssistantClass *class) container_class = (GtkContainerClass *) class; widget_class->destroy = gtk_assistant_destroy; - widget_class->style_updated = gtk_assistant_style_updated; - widget_class->get_preferred_width = gtk_assistant_get_preferred_width; - widget_class->get_preferred_height = gtk_assistant_get_preferred_height; - widget_class->size_allocate = gtk_assistant_size_allocate; widget_class->map = gtk_assistant_map; widget_class->unmap = gtk_assistant_unmap; widget_class->delete_event = gtk_assistant_delete_event; - widget_class->draw = gtk_assistant_draw; - widget_class->focus = gtk_assistant_focus; widget_class->get_accessible = gtk_assistant_get_accessible; container_class->add = gtk_assistant_add; container_class->remove = gtk_assistant_remove; - container_class->forall = gtk_assistant_forall; container_class->set_child_property = gtk_assistant_set_child_property; container_class->get_child_property = gtk_assistant_get_child_property; @@ -262,9 +242,11 @@ gtk_assistant_class_init (GtkAssistantClass *class) * @assistant: the #GtkAssistant * @page: the current page * - * The ::prepare signal is emitted when a new page is set as the assistant's - * current page, before making the new page visible. A handler for this signal - * can do any preparation which are necessary before showing @page. + * The ::prepare signal is emitted when a new page is set as the + * assistant's current page, before making the new page visible. + * + * A handler for this signal can do any preparations which are + * necessary before showing @page. * * Since: 2.10 */ @@ -281,15 +263,17 @@ gtk_assistant_class_init (GtkAssistantClass *class) * GtkAssistant::apply: * @assistant: the #GtkAssistant * - * The ::apply signal is emitted when the apply button is clicked. The default - * behavior of the #GtkAssistant is to switch to the page after the current - * page, unless the current page is the last one. + * The ::apply signal is emitted when the apply button is clicked. * - * A handler for the ::apply signal should carry out the actions for which - * the wizard has collected data. If the action takes a long time to complete, - * you might consider putting a page of type %GTK_ASSISTANT_PAGE_PROGRESS - * after the confirmation page and handle this operation within the - * #GtkAssistant::prepare signal of the progress page. + * The default behavior of the #GtkAssistant is to switch to the page + * after the current page, unless the current page is the last one. + * + * A handler for the ::apply signal should carry out the actions for + * which the wizard has collected data. If the action takes a long time + * to complete, you might consider putting a page of type + * %GTK_ASSISTANT_PAGE_PROGRESS after the confirmation page and handle + * this operation within the #GtkAssistant::prepare signal of the progress + * page. * * Since: 2.10 */ @@ -357,9 +341,7 @@ gtk_assistant_class_init (GtkAssistantClass *class) /** * GtkAssistant:title: * - * The title that is displayed in the page header. - * - * If title and header-image are both %NULL, no header is displayed. + * The title of the page. * * Since: 2.10 */ @@ -374,11 +356,12 @@ gtk_assistant_class_init (GtkAssistantClass *class) /** * GtkAssistant:header-image: * - * The image that is displayed next to the title in the page header. - * - * If title and header-image are both %NULL, no header is displayed. + * This image used to be displayed in the page header. * * Since: 2.10 + * + * Deprecated: 3.2: Since GTK+ 3.2, a header is no longer shown; + * add your header decoration to the page content instead. */ gtk_container_class_install_child_property (container_class, CHILD_PROP_PAGE_HEADER_IMAGE, @@ -389,13 +372,13 @@ gtk_assistant_class_init (GtkAssistantClass *class) GTK_PARAM_READWRITE)); /** - * GtkAssistant:header-image: + * GtkAssistant:sidebar-image: * - * The image that is displayed next to the page. - * - * Set this to %NULL to make the sidebar disappear. + * This image used to be displayed in the 'sidebar'. * * Since: 2.10 + * + * Deprecated: 3.2: Since GTK+ 3.2, the sidebar image is no longer shown. */ gtk_container_class_install_child_property (container_class, CHILD_PROP_PAGE_SIDEBAR_IMAGE, @@ -404,12 +387,13 @@ gtk_assistant_class_init (GtkAssistantClass *class) P_("Sidebar image for the assistant page"), GDK_TYPE_PIXBUF, GTK_PARAM_READWRITE)); + /** * GtkAssistant:complete: * - * Setting the "complete" child property to %TRUE marks a page as complete - * (i.e.: all the required fields are filled out). GTK+ uses this information - * to control the sensitivity of the navigation buttons. + * Setting the "complete" child property to %TRUE marks a page as + * complete (i.e.: all the required fields are filled out). GTK+ uses + * this information to control the sensitivity of the navigation buttons. * * Since: 2.10 */ @@ -454,17 +438,23 @@ default_forward_function (gint current_page, gpointer data) return current_page; } -static void -compute_last_button_state (GtkAssistant *assistant) +static gboolean +last_button_visible (GtkAssistant *assistant, GtkAssistantPage *page) { GtkAssistantPrivate *priv = assistant->priv; - GtkAssistantPage *page_info, *current_page_info; + GtkAssistantPage *page_info; gint count, page_num, n_pages; + if (page == NULL) + return FALSE; + + if (page->type != GTK_ASSISTANT_PAGE_CONTENT) + return FALSE; + count = 0; - page_num = gtk_assistant_get_current_page (assistant); - n_pages = gtk_assistant_get_n_pages (assistant); - current_page_info = page_info = g_list_nth_data (priv->pages, page_num); + page_num = g_list_index (priv->pages, page); + n_pages = g_list_length (priv->pages); + page_info = page; while (page_num >= 0 && page_num < n_pages && page_info->type == GTK_ASSISTANT_PAGE_CONTENT && @@ -477,17 +467,64 @@ compute_last_button_state (GtkAssistant *assistant) count++; } - /* make the last button visible if we can skip multiple + /* Make the last button visible if we can skip multiple * pages and end on a confirmation or summary page */ if (count > 1 && page_info && (page_info->type == GTK_ASSISTANT_PAGE_CONFIRM || page_info->type == GTK_ASSISTANT_PAGE_SUMMARY)) + return TRUE; + else + return FALSE; +} + +static void +update_actions_size (GtkAssistant *assistant) +{ + GtkAssistantPrivate *priv = assistant->priv; + GList *l; + GtkAssistantPage *page; + gint buttons, page_buttons; + + if (!priv->current_page) + return; + + /* Some heuristics to find out how many buttons we should + * reserve space for. It is possible to trick this code + * with page forward functions and invisible pages, etc. + */ + buttons = 0; + for (l = priv->pages; l; l = l->next) { - gtk_widget_show (priv->last); - gtk_widget_set_sensitive (priv->last, - current_page_info->complete); + page = l->data; + + if (!gtk_widget_get_visible (page->page)) + continue; + + page_buttons = 2; /* cancel, forward/apply/close */ + if (l != priv->pages) + page_buttons += 1; /* back */ + if (last_button_visible (assistant, page)) + page_buttons += 1; /* last */ + + buttons = MAX (buttons, page_buttons); } + + buttons += priv->extra_buttons; + + gtk_widget_set_size_request (priv->action_area, + buttons * gtk_widget_get_allocated_width (priv->cancel) + (buttons - 1) * 6, + -1); +} + +static void +compute_last_button_state (GtkAssistant *assistant) +{ + GtkAssistantPrivate *priv = assistant->priv; + + gtk_widget_set_sensitive (priv->last, priv->current_page->complete); + if (last_button_visible (assistant, priv->current_page)) + gtk_widget_show (priv->last); else gtk_widget_hide (priv->last); } @@ -510,30 +547,7 @@ compute_progress_state (GtkAssistant *assistant) } static void -set_assistant_header_image (GtkAssistant *assistant) -{ - GtkAssistantPrivate *priv = assistant->priv; - - gtk_image_set_from_pixbuf (GTK_IMAGE (priv->header_image), - priv->current_page->header_image); -} - -static void -set_assistant_sidebar_image (GtkAssistant *assistant) -{ - GtkAssistantPrivate *priv = assistant->priv; - - gtk_image_set_from_pixbuf (GTK_IMAGE (priv->sidebar_image), - priv->current_page->sidebar_image); - - if (priv->current_page->sidebar_image) - gtk_widget_show (priv->sidebar_image); - else - gtk_widget_hide (priv->sidebar_image); -} - -static void -set_assistant_buttons_state (GtkAssistant *assistant) +update_buttons_state (GtkAssistant *assistant) { GtkAssistantPrivate *priv = assistant->priv; @@ -621,43 +635,93 @@ set_assistant_buttons_state (GtkAssistant *assistant) gtk_widget_hide (priv->back); } +static gboolean +update_page_title_state (GtkAssistant *assistant, GList *list) +{ + GtkAssistantPage *page, *other; + GtkAssistantPrivate *priv = assistant->priv; + gboolean visible; + GList *l; + + page = list->data; + + if (page->title == NULL || page->title[0] == 0) + visible = FALSE; + else + visible = gtk_widget_get_visible (page->page); + + if (page == priv->current_page) + { + gtk_widget_set_visible (page->regular_title, FALSE); + gtk_widget_set_visible (page->current_title, visible); + } + else + { + /* If multiple consecutive pages have the same title, + * we only show it once, since it would otherwise look + * silly. We have to be a little careful, since we + * _always_ show the title of the current page. + */ + if (list->prev) + { + other = list->prev->data; + if (g_strcmp0 (page->title, other->title) == 0) + visible = FALSE; + } + for (l = list->next; l; l = l->next) + { + other = l->data; + if (g_strcmp0 (page->title, other->title) != 0) + break; + + if (other == priv->current_page) + { + visible = FALSE; + break; + } + } + + gtk_widget_set_visible (page->regular_title, visible); + gtk_widget_set_visible (page->current_title, FALSE); + } + + return visible; +} + static void -set_current_page (GtkAssistant *assistant, - GtkAssistantPage *page) +update_title_state (GtkAssistant *assistant) { GtkAssistantPrivate *priv = assistant->priv; - GtkAssistantPage *old_page; + GList *l; + gboolean show_titles; - if (priv->current_page && - gtk_widget_is_drawable (priv->current_page->page)) - old_page = priv->current_page; - else - old_page = NULL; + show_titles = FALSE; + for (l = priv->pages; l != NULL; l = l->next) + { + if (update_page_title_state (assistant, l)) + show_titles = TRUE; + } - priv->current_page = page; + gtk_widget_set_visible (priv->sidebar, show_titles); +} - set_assistant_buttons_state (assistant); - set_assistant_header_image (assistant); - set_assistant_sidebar_image (assistant); +static void +set_current_page (GtkAssistant *assistant, + gint page_num) +{ + GtkAssistantPrivate *priv = assistant->priv; + + priv->current_page = (GtkAssistantPage *)g_list_nth_data (priv->pages, page_num); g_signal_emit (assistant, signals [PREPARE], 0, priv->current_page->page); - if (gtk_widget_get_visible (priv->current_page->page) && - gtk_widget_get_mapped (GTK_WIDGET (assistant))) - { - gtk_widget_set_child_visible (priv->current_page->page, TRUE); - gtk_widget_set_child_visible (priv->current_page->title, TRUE); - gtk_widget_map (priv->current_page->page); - gtk_widget_map (priv->current_page->title); - } + update_title_state (assistant); - if (old_page && gtk_widget_get_mapped (old_page->page)) - { - gtk_widget_set_child_visible (old_page->page, FALSE); - gtk_widget_set_child_visible (old_page->title, FALSE); - gtk_widget_unmap (old_page->page); - gtk_widget_unmap (old_page->title); - } + gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->content), page_num); + + /* update buttons state, flow may have changed */ + if (gtk_widget_get_mapped (GTK_WIDGET (assistant))) + update_buttons_state (assistant); if (!gtk_widget_child_focus (priv->current_page->page, GTK_DIR_TAB_FORWARD)) { @@ -702,7 +766,7 @@ compute_next_step (GtkAssistant *assistant) if (next_page >= 0 && next_page < n_pages) { priv->visited_pages = g_slist_prepend (priv->visited_pages, page_info); - set_current_page (assistant, g_list_nth_data (priv->pages, next_page)); + set_current_page (assistant, next_page); return TRUE; } @@ -787,37 +851,46 @@ gtk_assistant_init (GtkAssistant *assistant) { GtkAssistantPrivate *priv; GtkStyleContext *context; + GtkWidget *main_box; + GtkWidget *content_box; + GtkWidget *side_box; assistant->priv = G_TYPE_INSTANCE_GET_PRIVATE (assistant, GTK_TYPE_ASSISTANT, GtkAssistantPrivate); priv = assistant->priv; - gtk_container_set_reallocate_redraws (GTK_CONTAINER (assistant), TRUE); - gtk_container_set_border_width (GTK_CONTAINER (assistant), 12); + /* use border on inner panes instead */ + gtk_container_set_border_width (GTK_CONTAINER (assistant), 0); gtk_widget_push_composite_child (); - /* Header */ - priv->header_image = gtk_image_new (); - gtk_misc_set_alignment (GTK_MISC (priv->header_image), 1., 0.5); - gtk_widget_set_parent (priv->header_image, GTK_WIDGET (assistant)); - gtk_widget_show (priv->header_image); + main_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + priv->sidebar = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_container_set_border_width (GTK_CONTAINER (priv->sidebar), 12); + /* Add an event box so we can set the background */ + side_box = gtk_event_box_new (); + context = gtk_widget_get_style_context (side_box); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_SIDEBAR); - context = gtk_widget_get_style_context (priv->header_image); - gtk_style_context_add_class (context, GTK_STYLE_CLASS_HIGHLIGHT); + content_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (content_box), 12); + priv->content = gtk_notebook_new (); + gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->content), FALSE); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->content), FALSE); + priv->action_area = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - /* Sidebar */ - priv->sidebar_image = gtk_image_new (); - gtk_misc_set_alignment (GTK_MISC (priv->sidebar_image), 0., 0.); - gtk_widget_set_parent (priv->sidebar_image, GTK_WIDGET (assistant)); - gtk_widget_show (priv->sidebar_image); + gtk_container_add (GTK_CONTAINER (side_box), priv->sidebar); + gtk_box_pack_start (GTK_BOX (main_box), side_box, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (main_box), content_box, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (content_box), priv->content, TRUE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (content_box), priv->action_area, FALSE, TRUE, 0); + gtk_widget_set_halign (priv->action_area, GTK_ALIGN_END); - context = gtk_widget_get_style_context (priv->sidebar_image); - gtk_style_context_add_class (context, GTK_STYLE_CLASS_HIGHLIGHT); + gtk_widget_show_all (main_box); - /* Action area */ - priv->action_area = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_widget_set_parent (main_box, GTK_WIDGET (assistant)); + _gtk_bin_set_child (GTK_BIN (assistant), main_box); priv->close = gtk_button_new_from_stock (GTK_STOCK_CLOSE); priv->apply = gtk_button_new_from_stock (GTK_STOCK_APPLY); @@ -829,13 +902,13 @@ gtk_assistant_init (GtkAssistant *assistant) gtk_widget_set_can_default (priv->apply, TRUE); gtk_widget_set_can_default (priv->forward, TRUE); - priv->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - gtk_size_group_add_widget (priv->size_group, priv->close); - gtk_size_group_add_widget (priv->size_group, priv->apply); - gtk_size_group_add_widget (priv->size_group, priv->forward); - gtk_size_group_add_widget (priv->size_group, priv->back); - gtk_size_group_add_widget (priv->size_group, priv->cancel); - gtk_size_group_add_widget (priv->size_group, priv->last); + priv->button_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (priv->button_size_group, priv->close); + gtk_size_group_add_widget (priv->button_size_group, priv->apply); + gtk_size_group_add_widget (priv->button_size_group, priv->forward); + gtk_size_group_add_widget (priv->button_size_group, priv->back); + gtk_size_group_add_widget (priv->button_size_group, priv->cancel); + gtk_size_group_add_widget (priv->button_size_group, priv->last); if (!alternative_button_order (assistant)) { @@ -856,7 +929,6 @@ gtk_assistant_init (GtkAssistant *assistant) gtk_box_pack_end (GTK_BOX (priv->action_area), priv->last, FALSE, FALSE, 0); } - gtk_widget_set_parent (priv->action_area, GTK_WIDGET (assistant)); gtk_widget_show (priv->forward); gtk_widget_show (priv->back); gtk_widget_show (priv->cancel); @@ -864,6 +936,8 @@ gtk_assistant_init (GtkAssistant *assistant) gtk_widget_pop_composite_child (); + priv->title_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + priv->pages = NULL; priv->current_page = NULL; priv->visited_pages = NULL; @@ -887,11 +961,11 @@ gtk_assistant_init (GtkAssistant *assistant) } static void -gtk_assistant_set_child_property (GtkContainer *container, - GtkWidget *child, - guint property_id, - const GValue *value, - GParamSpec *pspec) +gtk_assistant_set_child_property (GtkContainer *container, + GtkWidget *child, + guint property_id, + const GValue *value, + GParamSpec *pspec) { switch (property_id) { @@ -963,9 +1037,11 @@ on_page_notify_visibility (GtkWidget *widget, { GtkAssistant *assistant = GTK_ASSISTANT (data); - /* update buttons state, flow may have changed */ if (gtk_widget_get_mapped (GTK_WIDGET (assistant))) - set_assistant_buttons_state (assistant); + { + update_buttons_state (assistant); + update_title_state (assistant); + } } static void @@ -1002,21 +1078,28 @@ remove_page (GtkAssistant *assistant, } } + g_signal_handlers_disconnect_by_func (page_info->page, on_page_notify_visibility, assistant); + + gtk_size_group_remove_widget (priv->title_size_group, page_info->regular_title); + gtk_size_group_remove_widget (priv->title_size_group, page_info->current_title); + + gtk_container_remove (GTK_CONTAINER (priv->sidebar), page_info->regular_title); + gtk_container_remove (GTK_CONTAINER (priv->sidebar), page_info->current_title); + + gtk_notebook_remove_page (GTK_NOTEBOOK (priv->content), gtk_notebook_page_num (GTK_NOTEBOOK (priv->content), page_info->page)); priv->pages = g_list_remove_link (priv->pages, element); priv->visited_pages = g_slist_remove_all (priv->visited_pages, page_info); - g_signal_handlers_disconnect_by_func (page_info->page, on_page_notify_visibility, assistant); - gtk_widget_unparent (page_info->page); + g_free (page_info->title); - if (page_info->header_image) - g_object_unref (page_info->header_image); - - if (page_info->sidebar_image) - g_object_unref (page_info->sidebar_image); - - gtk_widget_destroy (page_info->title); g_slice_free (GtkAssistantPage, page_info); g_list_free_1 (element); + + if (gtk_widget_get_mapped (GTK_WIDGET (assistant))) + { + update_buttons_state (assistant); + update_actions_size (assistant); + } } static void @@ -1025,28 +1108,33 @@ gtk_assistant_destroy (GtkWidget *widget) GtkAssistant *assistant = GTK_ASSISTANT (widget); GtkAssistantPrivate *priv = assistant->priv; - if (priv->header_image) - { - gtk_widget_destroy (priv->header_image); - priv->header_image = NULL; - } + /* We set current to NULL so that the remove code doesn't try + * to do anything funny + */ + priv->current_page = NULL; - if (priv->sidebar_image) - { - gtk_widget_destroy (priv->sidebar_image); - priv->sidebar_image = NULL; - } + while (priv->pages) + remove_page (assistant, priv->pages); + + if (priv->sidebar) + priv->sidebar = NULL; + + if (priv->content) + priv->content = NULL; if (priv->action_area) + priv->action_area = NULL; + + if (priv->button_size_group) { - gtk_widget_destroy (priv->action_area); - priv->action_area = NULL; + g_object_unref (priv->button_size_group); + priv->button_size_group = NULL; } - if (priv->size_group) + if (priv->title_size_group) { - g_object_unref (priv->size_group); - priv->size_group = NULL; + g_object_unref (priv->title_size_group); + priv->title_size_group = NULL; } if (priv->forward_function) @@ -1066,13 +1154,6 @@ gtk_assistant_destroy (GtkWidget *widget) priv->visited_pages = NULL; } - /* We set current to NULL so that the remove code doesn't try - * to do anything funny */ - priv->current_page = NULL; - - while (priv->pages) - remove_page (assistant, priv->pages); - GTK_WIDGET_CLASS (gtk_assistant_parent_class)->destroy (widget); } @@ -1095,238 +1176,6 @@ find_page (GtkAssistant *assistant, return NULL; } -static void -set_title_font (GtkWidget *assistant, - GtkWidget *title_label) -{ - PangoFontDescription *desc; - GtkStyleContext *context; - gint size; - - gtk_widget_override_font (title_label, NULL); - - desc = pango_font_description_new (); - context = gtk_widget_get_style_context (title_label); - size = pango_font_description_get_size (gtk_style_context_get_font (context, 0)); - - pango_font_description_set_weight (desc, PANGO_WEIGHT_ULTRABOLD); - pango_font_description_set_size (desc, size * PANGO_SCALE_XX_LARGE); - - gtk_widget_override_font (title_label, desc); - pango_font_description_free (desc); -} - -static void -gtk_assistant_style_updated (GtkWidget *widget) -{ - GtkAssistant *assistant = GTK_ASSISTANT (widget); - GtkAssistantPrivate *priv = assistant->priv; - GList *list; - - GTK_WIDGET_CLASS (gtk_assistant_parent_class)->style_updated (widget); - - list = priv->pages; - - while (list) - { - GtkAssistantPage *page = list->data; - - set_title_font (widget, page->title); - list = list->next; - } -} - -static void -gtk_assistant_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GtkAssistant *assistant = GTK_ASSISTANT (widget); - GtkAssistantPrivate *priv = assistant->priv; - GtkRequisition child_requisition; - gint header_padding, content_padding; - gint width, height, header_width, header_height; - guint border_width; - GList *list; - - gtk_widget_style_get (widget, - "header-padding", &header_padding, - "content-padding", &content_padding, - NULL); - width = height = 0; - header_width = header_height = 0; - list = priv->pages; - - while (list) - { - GtkAssistantPage *page = list->data; - gint w, h; - - gtk_widget_get_preferred_size (page->page, - &child_requisition, NULL); - width = MAX (width, child_requisition.width); - height = MAX (height, child_requisition.height); - - gtk_widget_get_preferred_size (page->title, - &child_requisition, NULL); - w = child_requisition.width; - h = child_requisition.height; - - if (page->header_image) - { - w += gdk_pixbuf_get_width (page->header_image) + HEADER_SPACING; - h = MAX (h, gdk_pixbuf_get_height (page->header_image)); - } - - header_width = MAX (header_width, w); - header_height = MAX (header_height, h); - - list = list->next; - } - - gtk_widget_get_preferred_size (priv->sidebar_image, - &child_requisition, NULL); - width += child_requisition.width; - height = MAX (height, child_requisition.height); - - gtk_widget_set_size_request (priv->header_image, header_width, header_height); - gtk_widget_get_preferred_size (priv->header_image, - &child_requisition, NULL); - width = MAX (width, header_width) + 2 * header_padding; - height += header_height + 2 * header_padding; - - gtk_widget_get_preferred_size (priv->action_area, - &child_requisition, NULL); - width = MAX (width, child_requisition.width); - height += child_requisition.height + ACTION_AREA_SPACING; - - border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); - width += border_width * 2 + content_padding * 2; - height += border_width * 2 + content_padding * 2; - - requisition->width = width; - requisition->height = height; -} - -static void -gtk_assistant_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - GtkRequisition requisition; - - gtk_assistant_size_request (widget, &requisition); - - *minimum = *natural = requisition.width; -} - -static void -gtk_assistant_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - GtkRequisition requisition; - - gtk_assistant_size_request (widget, &requisition); - - *minimum = *natural = requisition.height; -} - -static void -gtk_assistant_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkAssistant *assistant = GTK_ASSISTANT (widget); - GtkAssistantPrivate *priv = assistant->priv; - GtkRequisition header_requisition, action_requisition, sidebar_requisition; - GtkAllocation child_allocation, header_allocation; - GtkAllocation action_area_allocation, header_image_allocation; - gint header_padding, content_padding; - guint border_width; - gboolean rtl; - GList *pages; - - rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL); - pages = priv->pages; - - gtk_widget_style_get (widget, - "header-padding", &header_padding, - "content-padding", &content_padding, - NULL); - - gtk_widget_set_allocation (widget, allocation); - border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); - - /* Header */ - gtk_widget_get_preferred_size (priv->header_image, - &header_requisition, NULL); - - header_allocation.x = border_width + header_padding; - header_allocation.y = border_width + header_padding; - header_allocation.width = allocation->width - 2 * border_width - 2 * header_padding; - header_allocation.height = header_requisition.height; - - gtk_widget_size_allocate (priv->header_image, &header_allocation); - - /* Action area */ - gtk_widget_get_preferred_size (priv->action_area, - &action_requisition, NULL); - - child_allocation.x = border_width; - child_allocation.y = allocation->height - border_width - action_requisition.height; - child_allocation.width = allocation->width - 2 * border_width; - child_allocation.height = action_requisition.height; - - gtk_widget_size_allocate (priv->action_area, &child_allocation); - - gtk_widget_get_allocation (priv->header_image, &header_image_allocation); - gtk_widget_get_allocation (priv->action_area, &action_area_allocation); - - /* Sidebar */ - gtk_widget_get_preferred_size (priv->sidebar_image, - &sidebar_requisition, NULL); - - if (rtl) - child_allocation.x = allocation->width - border_width - sidebar_requisition.width; - else - child_allocation.x = border_width; - - child_allocation.y = border_width + header_image_allocation.height + 2 * header_padding; - child_allocation.width = sidebar_requisition.width; - child_allocation.height = allocation->height - 2 * border_width - - header_image_allocation.height - 2 * header_padding - action_area_allocation.height; - - gtk_widget_size_allocate (priv->sidebar_image, &child_allocation); - - /* Pages */ - child_allocation.x = border_width + content_padding; - child_allocation.y = border_width + - header_image_allocation.height + 2 * header_padding + content_padding; - child_allocation.width = allocation->width - 2 * border_width - 2 * content_padding; - child_allocation.height = allocation->height - 2 * border_width - - header_image_allocation.height - 2 * header_padding - ACTION_AREA_SPACING - action_area_allocation.height - 2 * content_padding; - - if (gtk_widget_get_visible (priv->sidebar_image)) - { - GtkAllocation sidebar_image_allocation; - - gtk_widget_get_allocation (priv->sidebar_image, &sidebar_image_allocation); - - if (!rtl) - child_allocation.x += sidebar_image_allocation.width; - - child_allocation.width -= sidebar_image_allocation.width; - } - - while (pages) - { - GtkAssistantPage *page = pages->data; - - gtk_widget_size_allocate (page->page, &child_allocation); - gtk_widget_size_allocate (page->title, &header_allocation); - pages = pages->next; - } -} - static void gtk_assistant_map (GtkWidget *widget) { @@ -1334,33 +1183,31 @@ gtk_assistant_map (GtkWidget *widget) GtkAssistantPrivate *priv = assistant->priv; GList *page_node; GtkAssistantPage *page; - - gtk_widget_set_mapped (widget, TRUE); - - gtk_widget_map (priv->header_image); - gtk_widget_map (priv->action_area); - - if (gtk_widget_get_visible (priv->sidebar_image) && - !gtk_widget_get_mapped (priv->sidebar_image)) - gtk_widget_map (priv->sidebar_image); + gint page_num; /* if there's no default page, pick the first one */ page = NULL; + page_num = 0; if (!priv->current_page) { page_node = priv->pages; while (page_node && !gtk_widget_get_visible (((GtkAssistantPage *) page_node->data)->page)) - page_node = page_node->next; + { + page_node = page_node->next; + page_num++; + } if (page_node) page = page_node->data; } - if (page && - gtk_widget_get_visible (page->page) && - !gtk_widget_get_mapped (page->page)) - set_current_page (assistant, page); + if (page && gtk_widget_get_visible (page->page)) + set_current_page (assistant, page_num); + + update_buttons_state (assistant); + update_actions_size (assistant); + update_title_state (assistant); GTK_WIDGET_CLASS (gtk_assistant_parent_class)->map (widget); } @@ -1371,23 +1218,6 @@ gtk_assistant_unmap (GtkWidget *widget) GtkAssistant *assistant = GTK_ASSISTANT (widget); GtkAssistantPrivate *priv = assistant->priv; - gtk_widget_set_mapped (widget, FALSE); - - gtk_widget_unmap (priv->header_image); - gtk_widget_unmap (priv->action_area); - - if (gtk_widget_is_drawable (priv->sidebar_image)) - gtk_widget_unmap (priv->sidebar_image); - - if (priv->current_page && - gtk_widget_is_drawable (priv->current_page->page)) - { - gtk_widget_set_child_visible (priv->current_page->page, FALSE); - gtk_widget_set_child_visible (priv->current_page->title, FALSE); - gtk_widget_unmap (priv->current_page->title); - gtk_widget_unmap (priv->current_page->page); - } - g_slist_free (priv->visited_pages); priv->visited_pages = NULL; priv->current_page = NULL; @@ -1411,147 +1241,6 @@ gtk_assistant_delete_event (GtkWidget *widget, return TRUE; } -static void -assistant_paint_colored_box (GtkWidget *widget, - cairo_t *cr) -{ - GtkAssistant *assistant = GTK_ASSISTANT (widget); - GtkAssistantPrivate *priv = assistant->priv; - GtkAllocation allocation, action_area_allocation, header_image_allocation; - GtkStyleContext *context; - GtkStateFlags state; - GdkRGBA color; - gint border_width, header_padding, content_padding; - gint content_x, content_width; - gboolean rtl; - - rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL); - border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); - - gtk_widget_style_get (widget, - "header-padding", &header_padding, - "content-padding", &content_padding, - NULL); - - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - gtk_widget_get_allocation (widget, &allocation); - gtk_widget_get_allocation (priv->action_area, &action_area_allocation); - gtk_widget_get_allocation (priv->header_image, &header_image_allocation); - - /* colored box */ - gtk_style_context_save (context); - gtk_style_context_add_class (context, GTK_STYLE_CLASS_HIGHLIGHT); - - gtk_style_context_get_background_color (context, state, &color); - gdk_cairo_set_source_rgba (cr, &color); - - cairo_rectangle (cr, - border_width, - border_width, - allocation.width - 2 * border_width, - allocation.height - action_area_allocation.height - 2 * border_width - ACTION_AREA_SPACING); - cairo_fill (cr); - - /* content box */ - content_x = content_padding + border_width; - content_width = allocation.width - 2 * content_padding - 2 * border_width; - - if (gtk_widget_get_visible (priv->sidebar_image)) - { - GtkAllocation sidebar_image_allocation; - - gtk_widget_get_allocation (priv->sidebar_image, &sidebar_image_allocation); - - if (!rtl) - content_x += sidebar_image_allocation.width; - content_width -= sidebar_image_allocation.width; - } - - gtk_style_context_restore (context); - - gtk_style_context_get_background_color (context, state, &color); - gdk_cairo_set_source_rgba (cr, &color); - - cairo_rectangle (cr, - content_x, - header_image_allocation.height + content_padding + 2 * header_padding + border_width, - content_width, - allocation.height - 2 * border_width - action_area_allocation.height - - header_image_allocation.height - 2 * content_padding - 2 * header_padding - ACTION_AREA_SPACING); - cairo_fill (cr); -} - -static gboolean -gtk_assistant_draw (GtkWidget *widget, - cairo_t *cr) -{ - GtkAssistant *assistant = GTK_ASSISTANT (widget); - GtkAssistantPrivate *priv = assistant->priv; - GtkContainer *container = GTK_CONTAINER (widget); - - if (GTK_WIDGET_CLASS (gtk_assistant_parent_class)->draw) - GTK_WIDGET_CLASS (gtk_assistant_parent_class)->draw (widget, cr); - - assistant_paint_colored_box (widget, cr); - - gtk_container_propagate_draw (container, priv->header_image, cr); - gtk_container_propagate_draw (container, priv->sidebar_image, cr); - gtk_container_propagate_draw (container, priv->action_area, cr); - - if (priv->current_page) - { - gtk_container_propagate_draw (container, priv->current_page->page, cr); - gtk_container_propagate_draw (container, priv->current_page->title, cr); - } - - return FALSE; -} - -static gboolean -gtk_assistant_focus (GtkWidget *widget, - GtkDirectionType direction) -{ - GtkAssistantPrivate *priv; - GtkContainer *container; - - container = GTK_CONTAINER (widget); - priv = GTK_ASSISTANT (widget)->priv; - - /* we only have to care about 2 widgets, action area and the current page */ - if (gtk_container_get_focus_child (container) == priv->action_area) - { - if (!gtk_widget_child_focus (priv->action_area, direction) && - (priv->current_page == NULL || - !gtk_widget_child_focus (priv->current_page->page, direction))) - { - /* if we're leaving the action area and the current page has no - * focusable widget, clear focus and go back to the action area - */ - gtk_container_set_focus_child (GTK_CONTAINER (priv->action_area), NULL); - gtk_widget_child_focus (priv->action_area, direction); - } - } - else - { - if ((priv->current_page == NULL || - !gtk_widget_child_focus (priv->current_page->page, direction)) && - !gtk_widget_child_focus (priv->action_area, direction)) - { - /* if we're leaving the current page and there isn't nothing - * focusable in the action area, try to clear focus and go back - * to the page - */ - gtk_window_set_focus (GTK_WINDOW (widget), NULL); - if (priv->current_page != NULL) - gtk_widget_child_focus (priv->current_page->page, direction); - } - } - - return TRUE; -} - static void gtk_assistant_add (GtkContainer *container, GtkWidget *page) @@ -1575,38 +1264,6 @@ gtk_assistant_remove (GtkContainer *container, } } -static void -gtk_assistant_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GtkAssistant *assistant = (GtkAssistant*) container; - GtkAssistantPrivate *priv = assistant->priv; - GList *pages; - - if (include_internals) - { - (*callback) (priv->header_image, callback_data); - (*callback) (priv->sidebar_image, callback_data); - (*callback) (priv->action_area, callback_data); - } - - pages = priv->pages; - - while (pages) - { - GtkAssistantPage *page = (GtkAssistantPage *) pages->data; - - (*callback) (page->page, callback_data); - - if (include_internals) - (*callback) (page->title, callback_data); - - pages = pages->next; - } -} - /** * gtk_assistant_new: * @@ -1630,11 +1287,11 @@ gtk_assistant_new (void) * gtk_assistant_get_current_page: * @assistant: a #GtkAssistant * - * Returns the page number of the current page + * Returns the page number of the current page. * * Return value: The index (starting from 0) of the current - * page in the @assistant, if the @assistant has no pages, - * -1 will be returned + * page in the @assistant, or -1 if the @assistant has no pages, + * or no current page. * * Since: 2.10 */ @@ -1683,7 +1340,10 @@ gtk_assistant_set_current_page (GtkAssistant *assistant, if (page_num >= 0) page = (GtkAssistantPage *) g_list_nth_data (priv->pages, page_num); else - page = (GtkAssistantPage *) g_list_last (priv->pages)->data; + { + page = (GtkAssistantPage *) g_list_last (priv->pages)->data; + page_num = g_list_length (priv->pages); + } g_return_if_fail (page != NULL); @@ -1698,7 +1358,7 @@ gtk_assistant_set_current_page (GtkAssistant *assistant, priv->visited_pages = g_slist_prepend (priv->visited_pages, priv->current_page); - set_current_page (assistant, page); + set_current_page (assistant, page_num); } /** @@ -1765,7 +1425,7 @@ gtk_assistant_previous_page (GtkAssistant *assistant) while (page_info->type == GTK_ASSISTANT_PAGE_PROGRESS || !gtk_widget_get_visible (page_info->page)); - set_current_page (assistant, page_info); + set_current_page (assistant, g_list_index (priv->pages, page_info)); } /** @@ -1891,8 +1551,8 @@ gtk_assistant_insert_page (GtkAssistant *assistant, { GtkAssistantPrivate *priv; GtkAssistantPage *page_info; - GtkStyleContext *context; gint n_pages; + GtkStyleContext *context; g_return_val_if_fail (GTK_IS_ASSISTANT (assistant), 0); g_return_val_if_fail (GTK_IS_WIDGET (page), 0); @@ -1903,18 +1563,25 @@ gtk_assistant_insert_page (GtkAssistant *assistant, page_info = g_slice_new0 (GtkAssistantPage); page_info->page = page; - page_info->title = gtk_label_new (NULL); + page_info->regular_title = gtk_label_new (NULL); + page_info->current_title = gtk_label_new (NULL); + + gtk_misc_set_alignment (GTK_MISC (page_info->regular_title), 0.,0.5); + gtk_widget_show (page_info->regular_title); + + gtk_misc_set_alignment (GTK_MISC (page_info->current_title), 0.,0.5); + gtk_widget_hide (page_info->current_title); + + context = gtk_widget_get_style_context (page_info->current_title); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_HIGHLIGHT); + gtk_widget_reset_style (page_info->current_title); + + gtk_size_group_add_widget (priv->title_size_group, page_info->regular_title); + gtk_size_group_add_widget (priv->title_size_group, page_info->current_title); g_signal_connect (G_OBJECT (page), "notify::visible", G_CALLBACK (on_page_notify_visibility), assistant); - gtk_misc_set_alignment (GTK_MISC (page_info->title), 0.,0.5); - set_title_font (GTK_WIDGET (assistant), page_info->title); - gtk_widget_show (page_info->title); - - context = gtk_widget_get_style_context (page_info->title); - gtk_style_context_add_class (context, GTK_STYLE_CLASS_HIGHLIGHT); - n_pages = g_list_length (priv->pages); if (position < 0 || position > n_pages) @@ -1922,19 +1589,19 @@ gtk_assistant_insert_page (GtkAssistant *assistant, priv->pages = g_list_insert (priv->pages, page_info, position); - gtk_widget_set_child_visible (page_info->page, FALSE); - gtk_widget_set_child_visible (page_info->title, FALSE); - gtk_widget_set_parent (page_info->page, GTK_WIDGET (assistant)); - gtk_widget_set_parent (page_info->title, GTK_WIDGET (assistant)); + gtk_box_pack_start (GTK_BOX (priv->sidebar), page_info->regular_title, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (priv->sidebar), page_info->current_title, FALSE, FALSE, 0); + gtk_box_reorder_child (GTK_BOX (priv->sidebar), page_info->regular_title, 2 * position); + gtk_box_reorder_child (GTK_BOX (priv->sidebar), page_info->current_title, 2 * position + 1); - if (gtk_widget_get_realized (GTK_WIDGET (assistant))) + gtk_notebook_insert_page (GTK_NOTEBOOK (priv->content), page, NULL, position); + + if (gtk_widget_get_mapped (GTK_WIDGET (assistant))) { - gtk_widget_realize (page_info->page); - gtk_widget_realize (page_info->title); + update_buttons_state (assistant); + update_actions_size (assistant); } - gtk_widget_queue_resize (GTK_WIDGET (assistant)); - return position; } @@ -1988,7 +1655,8 @@ gtk_assistant_set_forward_page_func (GtkAssistant *assistant, /* Page flow has possibly changed, so the * buttons state might need to change too */ - set_assistant_buttons_state (assistant); + if (gtk_widget_get_mapped (GTK_WIDGET (assistant))) + update_buttons_state (assistant); } /** @@ -2012,7 +1680,12 @@ gtk_assistant_add_action_widget (GtkAssistant *assistant, priv = assistant->priv; if (GTK_IS_BUTTON (child)) - gtk_size_group_add_widget (priv->size_group, child); + { + gtk_size_group_add_widget (priv->button_size_group, child); + priv->extra_buttons += 1; + if (gtk_widget_get_mapped (GTK_WIDGET (assistant))) + update_actions_size (assistant); + } gtk_box_pack_end (GTK_BOX (priv->action_area), child, FALSE, FALSE, 0); } @@ -2038,7 +1711,12 @@ gtk_assistant_remove_action_widget (GtkAssistant *assistant, priv = assistant->priv; if (GTK_IS_BUTTON (child)) - gtk_size_group_remove_widget (priv->size_group, child); + { + gtk_size_group_remove_widget (priv->button_size_group, child); + priv->extra_buttons -= 1; + if (gtk_widget_get_mapped (GTK_WIDGET (assistant))) + update_actions_size (assistant); + } gtk_container_remove (GTK_CONTAINER (priv->action_area), child); } @@ -2073,9 +1751,14 @@ gtk_assistant_set_page_title (GtkAssistant *assistant, page_info = (GtkAssistantPage*) child->data; - gtk_label_set_text ((GtkLabel*) page_info->title, title); + g_free (page_info->title); + page_info->title = g_strdup (title); + + gtk_label_set_text ((GtkLabel*) page_info->regular_title, title); + gtk_label_set_text ((GtkLabel*) page_info->current_title, title); + gtk_widget_queue_resize (GTK_WIDGET (assistant)); - gtk_widget_child_notify (page, "title"); + gtk_container_child_notify (GTK_CONTAINER (assistant), page, "title"); } /** @@ -2105,7 +1788,7 @@ gtk_assistant_get_page_title (GtkAssistant *assistant, page_info = (GtkAssistantPage*) child->data; - return gtk_label_get_text ((GtkLabel*) page_info->title); + return page_info->title; } /** @@ -2151,9 +1834,9 @@ gtk_assistant_set_page_type (GtkAssistant *assistant, /* Always set buttons state, a change in a future page * might change current page buttons */ - set_assistant_buttons_state (assistant); + update_buttons_state (assistant); - gtk_widget_child_notify (page, "page-type"); + gtk_container_child_notify (GTK_CONTAINER (assistant), page, "page-type"); } } @@ -2195,17 +1878,16 @@ gtk_assistant_get_page_type (GtkAssistant *assistant, * * Sets a header image for @page. * - * This image is displayed in the header area of the assistant - * when @page is the current page. - * * Since: 2.10 + * + * Deprecated: 3.2: Since GTK+ 3.2, a header is no longer shown; + * add your header decoration to the page content instead. */ void gtk_assistant_set_page_header_image (GtkAssistant *assistant, GtkWidget *page, GdkPixbuf *pixbuf) { - GtkAssistantPrivate *priv; GtkAssistantPage *page_info; GList *child; @@ -2213,7 +1895,6 @@ gtk_assistant_set_page_header_image (GtkAssistant *assistant, g_return_if_fail (GTK_IS_WIDGET (page)); g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf)); - priv = assistant->priv; child = find_page (assistant, page); g_return_if_fail (child != NULL); @@ -2231,10 +1912,7 @@ gtk_assistant_set_page_header_image (GtkAssistant *assistant, if (pixbuf) page_info->header_image = g_object_ref (pixbuf); - if (page_info == priv->current_page) - set_assistant_header_image (assistant); - - gtk_widget_child_notify (page, "header-image"); + gtk_container_child_notify (GTK_CONTAINER (assistant), page, "header-image"); } } @@ -2249,6 +1927,9 @@ gtk_assistant_set_page_header_image (GtkAssistant *assistant, * or %NULL if there's no header image for the page * * Since: 2.10 + * + * Deprecated: 3.2: Since GTK+ 3.2, a header is no longer shown; + * add your header decoration to the page content instead. */ GdkPixbuf* gtk_assistant_get_page_header_image (GtkAssistant *assistant, @@ -2273,21 +1954,23 @@ gtk_assistant_get_page_header_image (GtkAssistant *assistant, * gtk_assistant_set_page_side_image: * @assistant: a #GtkAssistant * @page: a page of @assistant - * @pixbuf: (allow-none): the new header image @page + * @pixbuf: (allow-none): the new side image @page * - * Sets a header image for @page. + * Sets a side image for @page. * - * This image is displayed in the side area of the assistant + * This image used to be displayed in the side area of the assistant * when @page is the current page. * * Since: 2.10 + * + * Deprecated: 3.2: Since GTK+ 3.2, sidebar images are not + * shown anymore. */ void gtk_assistant_set_page_side_image (GtkAssistant *assistant, GtkWidget *page, GdkPixbuf *pixbuf) { - GtkAssistantPrivate *priv; GtkAssistantPage *page_info; GList *child; @@ -2295,7 +1978,6 @@ gtk_assistant_set_page_side_image (GtkAssistant *assistant, g_return_if_fail (GTK_IS_WIDGET (page)); g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf)); - priv = assistant->priv; child = find_page (assistant, page); g_return_if_fail (child != NULL); @@ -2313,10 +1995,7 @@ gtk_assistant_set_page_side_image (GtkAssistant *assistant, if (pixbuf) page_info->sidebar_image = g_object_ref (pixbuf); - if (page_info == priv->current_page) - set_assistant_sidebar_image (assistant); - - gtk_widget_child_notify (page, "sidebar-image"); + gtk_container_child_notify (GTK_CONTAINER (assistant), page, "sidebar-image"); } } @@ -2325,12 +2004,15 @@ gtk_assistant_set_page_side_image (GtkAssistant *assistant, * @assistant: a #GtkAssistant * @page: a page of @assistant * - * Gets the header image for @page. + * Gets the side image for @page. * * Return value: (transfer none): the side image for @page, * or %NULL if there's no side image for the page * * Since: 2.10 + * + * Deprecated: 3.2: Since GTK+ 3.2, sidebar images are not + * shown anymore. */ GdkPixbuf* gtk_assistant_get_page_side_image (GtkAssistant *assistant, @@ -2389,9 +2071,9 @@ gtk_assistant_set_page_complete (GtkAssistant *assistant, /* Always set buttons state, a change in a future page * might change current page buttons */ - set_assistant_buttons_state (assistant); + update_buttons_state (assistant); - gtk_widget_child_notify (page, "complete"); + gtk_container_child_notify (GTK_CONTAINER (assistant), page, "complete"); } } @@ -2446,7 +2128,7 @@ gtk_assistant_update_buttons_state (GtkAssistant *assistant) { g_return_if_fail (GTK_IS_ASSISTANT (assistant)); - set_assistant_buttons_state (assistant); + update_buttons_state (assistant); } /** @@ -2475,7 +2157,7 @@ gtk_assistant_commit (GtkAssistant *assistant) assistant->priv->committed = TRUE; - set_assistant_buttons_state (assistant); + update_buttons_state (assistant); } static AtkObject * diff --git a/gtk/gtkassistant.h b/gtk/gtkassistant.h index 62f9eadbc2..e380f835ae 100644 --- a/gtk/gtkassistant.h +++ b/gtk/gtkassistant.h @@ -128,50 +128,54 @@ void gtk_assistant_next_page (GtkAssistant void gtk_assistant_previous_page (GtkAssistant *assistant); gint gtk_assistant_get_current_page (GtkAssistant *assistant); void gtk_assistant_set_current_page (GtkAssistant *assistant, - gint page_num); + gint page_num); gint gtk_assistant_get_n_pages (GtkAssistant *assistant); GtkWidget *gtk_assistant_get_nth_page (GtkAssistant *assistant, - gint page_num); + gint page_num); gint gtk_assistant_prepend_page (GtkAssistant *assistant, - GtkWidget *page); + GtkWidget *page); gint gtk_assistant_append_page (GtkAssistant *assistant, - GtkWidget *page); + GtkWidget *page); gint gtk_assistant_insert_page (GtkAssistant *assistant, - GtkWidget *page, - gint position); + GtkWidget *page, + gint position); void gtk_assistant_set_forward_page_func (GtkAssistant *assistant, - GtkAssistantPageFunc page_func, - gpointer data, - GDestroyNotify destroy); + GtkAssistantPageFunc page_func, + gpointer data, + GDestroyNotify destroy); void gtk_assistant_set_page_type (GtkAssistant *assistant, - GtkWidget *page, - GtkAssistantPageType type); + GtkWidget *page, + GtkAssistantPageType type); GtkAssistantPageType gtk_assistant_get_page_type (GtkAssistant *assistant, - GtkWidget *page); + GtkWidget *page); void gtk_assistant_set_page_title (GtkAssistant *assistant, - GtkWidget *page, - const gchar *title); + GtkWidget *page, + const gchar *title); G_CONST_RETURN gchar *gtk_assistant_get_page_title (GtkAssistant *assistant, - GtkWidget *page); + GtkWidget *page); + +#if !defined (GTK_DISABLE_DEPRECATED) || defined (GTK_COMPILATION) void gtk_assistant_set_page_header_image (GtkAssistant *assistant, - GtkWidget *page, - GdkPixbuf *pixbuf); + GtkWidget *page, + GdkPixbuf *pixbuf); GdkPixbuf *gtk_assistant_get_page_header_image (GtkAssistant *assistant, - GtkWidget *page); + GtkWidget *page); void gtk_assistant_set_page_side_image (GtkAssistant *assistant, - GtkWidget *page, - GdkPixbuf *pixbuf); + GtkWidget *page, + GdkPixbuf *pixbuf); GdkPixbuf *gtk_assistant_get_page_side_image (GtkAssistant *assistant, - GtkWidget *page); + GtkWidget *page); +#endif + void gtk_assistant_set_page_complete (GtkAssistant *assistant, - GtkWidget *page, - gboolean complete); + GtkWidget *page, + gboolean complete); gboolean gtk_assistant_get_page_complete (GtkAssistant *assistant, - GtkWidget *page); + GtkWidget *page); void gtk_assistant_add_action_widget (GtkAssistant *assistant, - GtkWidget *child); + GtkWidget *child); void gtk_assistant_remove_action_widget (GtkAssistant *assistant, - GtkWidget *child); + GtkWidget *child); void gtk_assistant_update_buttons_state (GtkAssistant *assistant); void gtk_assistant_commit (GtkAssistant *assistant);