X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-wizard-dialog.c;h=401d9228e3dd9739d07d18401a397166ab13ede6;hb=c1066a95c306c71fc8034646ba5d7c1b1b67973e;hp=ce595ae56c250fdc9676f446a747ad38e2bd1467;hpb=627c4af6ac85444cc3256fa568baf4a8d62178ae;p=modest diff --git a/src/widgets/modest-wizard-dialog.c b/src/widgets/modest-wizard-dialog.c index ce595ae..401d922 100644 --- a/src/widgets/modest-wizard-dialog.c +++ b/src/widgets/modest-wizard-dialog.c @@ -54,13 +54,13 @@ #include #endif -#ifdef MODEST_PLATFORM_MAEMO -#ifdef MODEST_HAVE_HILDON0_WIDGETS +#ifndef MODEST_TOOLKIT_GTK +#if MODEST_HILDON_API == 0 #include #else #include -#endif /*MODEST_HAVE_HILDON0_WIDGETS*/ -#endif /*MODEST_PLATFORM_MAEMO*/ +#endif /*MODEST_HILDON_API == 0*/ +#endif /*!MODEST_TOOLKIT_GTK*/ #include "modest-wizard-dialog.h" #include "modest-debug.h" @@ -94,9 +94,11 @@ static void make_buttons_sensitive (ModestWizardDialog *wizard_dialog, gboolean previous, gboolean finish, gboolean next); - + static gboolean invoke_before_next_vfunc (ModestWizardDialog *wizard_dialog); static void invoke_enable_buttons_vfunc (ModestWizardDialog *wizard_dialog); +static void invoke_update_model_vfunc (ModestWizardDialog *wizard_dialog); +static gboolean invoke_save_vfunc (ModestWizardDialog *wizard_dialog); enum { PROP_ZERO, @@ -111,6 +113,8 @@ struct _ModestWizardDialogPrivate { GtkBox *box; GtkWidget *image; gboolean autotitle; + + ModestWizardDialogResponseOverrideFunc override_func; }; @@ -157,6 +161,11 @@ class_init (ModestWizardDialogClass *wizard_dialog_class) object_class->get_property = get_property; object_class->finalize = finalize; + wizard_dialog_class->before_next = NULL; + wizard_dialog_class->update_model = NULL; + wizard_dialog_class->save = NULL; + wizard_dialog_class->enable_buttons = NULL; + /** * ModestWizardDialog:wizard-name: * @@ -248,9 +257,15 @@ init (ModestWizardDialog *wizard_dialog) GtkWidget *vbox = gtk_vbox_new (FALSE, 0); gtk_dialog_set_has_separator (dialog, FALSE); wizard_dialog->priv = priv; + priv->override_func = NULL; priv->box = GTK_BOX (gtk_hbox_new (FALSE, 0)); -#ifdef MODEST_PLATFORM_MAEMO -#ifdef MODEST_HAVE_HILDON0_WIDGETS +#ifdef MODEST_TOOLKIT_HILDON2 + priv->image = NULL; +#else +#ifdef MODEST_TOOLKIT_GTK + priv->image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_DIALOG); +#else /*MODEST_TOOLKIT_GTK*/ +#if MODEST_HILDON_API == 0 priv->image = gtk_image_new_from_icon_name ("qgn_widg_wizard", HILDON_ICON_SIZE_WIDG_WIZARD); #else @@ -259,27 +274,37 @@ init (ModestWizardDialog *wizard_dialog) icon_size = gtk_icon_size_register("modest_wizard", 50, 50); priv->image = gtk_image_new_from_icon_name ("qgn_widg_wizard", icon_size); -#endif /*MODEST_HILDON_VERSION_0*/ -#else /*MODEST_PLATFORM_MAEMO*/ - priv->image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_DIALOG); -#endif /*MODEST_PLATFORM_MAEMO*/ +#endif /*MODEST_HILDON_API == 0*/ +#endif /*!MODEST_TOOLKIT_GTK*/ +#endif /*MODEST_TOOLKIT_HILDON2 */ /* Default values for user provided properties */ priv->notebook = NULL; priv->wizard_name = NULL; priv->autotitle = TRUE; /* Build wizard layout */ - gtk_box_pack_start_defaults (GTK_BOX (dialog->vbox), GTK_WIDGET (priv->box)); - gtk_box_pack_start_defaults (GTK_BOX (priv->box), GTK_WIDGET (vbox)); - gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (priv->image), FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (dialog->vbox), GTK_WIDGET (priv->box), TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (priv->box), GTK_WIDGET (vbox), FALSE, FALSE, 0); + gtk_widget_show (vbox); + gtk_widget_show (GTK_WIDGET (priv->box)); + if (priv->image) { + gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (priv->image), TRUE, TRUE, 0); + gtk_widget_show (priv->image); + } /* Add response buttons: finish, previous, next, cancel */ -#ifdef MODEST_PLATFORM_MAEMO +#ifdef MODEST_TOOLKIT_HILDON1 gtk_dialog_add_button (dialog, _HL("ecdg_bd_wizard_finish"), MODEST_WIZARD_DIALOG_FINISH); gtk_dialog_add_button (dialog, _HL("ecdg_bd_wizard_previous"), MODEST_WIZARD_DIALOG_PREVIOUS); gtk_dialog_add_button (dialog, _HL("ecdg_bd_wizard_next"), MODEST_WIZARD_DIALOG_NEXT); gtk_dialog_add_button (dialog, _HL("ecdg_bd_wizard_cancel"), MODEST_WIZARD_DIALOG_CANCEL); -#else +#endif +#ifdef MODEST_TOOLKIT_HILDON2 + gtk_dialog_add_button (dialog, _HL("wdgt_bd_finish"), MODEST_WIZARD_DIALOG_FINISH); + gtk_dialog_add_button (dialog, _HL("wdgt_bd_previous"), MODEST_WIZARD_DIALOG_PREVIOUS); + gtk_dialog_add_button (dialog, _HL("wdgt_bd_next"), MODEST_WIZARD_DIALOG_NEXT); +#endif +#ifdef MODEST_TOOLKIT_GTK gtk_dialog_add_button (dialog, GTK_STOCK_SAVE, MODEST_WIZARD_DIALOG_FINISH); gtk_dialog_add_button (dialog, GTK_STOCK_GO_BACK, MODEST_WIZARD_DIALOG_PREVIOUS); gtk_dialog_add_button (dialog, GTK_STOCK_GO_FORWARD, MODEST_WIZARD_DIALOG_NEXT); @@ -289,12 +314,12 @@ init (ModestWizardDialog *wizard_dialog) /* Set initial button states: previous and finish buttons are disabled */ make_buttons_sensitive (wizard_dialog, FALSE, FALSE, TRUE); - /* Show all the internal widgets */ - gtk_widget_show_all (GTK_WIDGET (dialog->vbox)); + gtk_widget_show (GTK_WIDGET (dialog->vbox)); /* connect to dialog's response signal */ g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (response), NULL); + } #if GTK_CHECK_VERSION(2, 10, 0) /* These signals were added in GTK+ 2.10: */ @@ -328,6 +353,17 @@ static void on_notebook_page_removed(GtkNotebook *notebook, #endif /* GTK_CHECK_VERSION */ static void +on_notebook_switch_page (GtkNotebook *notebook, + GtkNotebookPage *page, + guint page_num, + ModestWizardDialog *self) +{ + g_return_if_fail (MODEST_IS_WIZARD_DIALOG(self)); + + create_title (self); +} + +static void connect_to_notebook_signals(ModestWizardDialog* dialog) { #if GTK_CHECK_VERSION(2, 10, 0) /* These signals were added in GTK+ 2.10: */ @@ -341,6 +377,8 @@ connect_to_notebook_signals(ModestWizardDialog* dialog) g_signal_connect (G_OBJECT (priv->notebook), "page-removed", G_CALLBACK (on_notebook_page_removed), dialog); #endif /* GTK_CHECK_VERSION */ + g_signal_connect_after (G_OBJECT (priv->notebook), "switch-page", + G_CALLBACK (on_notebook_switch_page), dialog); } @@ -397,7 +435,7 @@ set_property (GObject *object, * and remove borders) to make it look like a nice wizard widget */ gtk_notebook_set_show_tabs (priv->notebook, FALSE); gtk_notebook_set_show_border (priv->notebook, FALSE); - gtk_box_pack_start_defaults (GTK_BOX( priv->box), GTK_WIDGET (priv->notebook)); + gtk_box_pack_start (GTK_BOX( priv->box), GTK_WIDGET (priv->notebook), TRUE, TRUE, 0); /* Show the notebook so that a gtk_widget_show on the dialog is * all that is required to display the dialog correctly */ @@ -491,7 +529,7 @@ create_title (ModestWizardDialog *wizard_dialog) priv->wizard_name, current + 1, pages, steps); */ - str = g_strdup_printf (_HL("%s: %s"), + str = g_strdup_printf ((steps&&*steps)?_HL("%s: %s"):_HL("%s"), priv->wizard_name, steps); /* } */ @@ -517,6 +555,18 @@ response (ModestWizardDialog *wizard_dialog, GtkNotebook *notebook = priv->notebook; gint current = 0; gboolean is_first, is_last; + + if (priv->override_func) { + if (priv->override_func (wizard_dialog, response_id, gtk_notebook_get_current_page (notebook))) { + /* Don't let the dialog close */ + g_signal_stop_emission_by_name (wizard_dialog, "response"); + + /* Force refresh of title */ + if (priv->autotitle) + create_title (wizard_dialog); + return; + } + } switch (response_id) { @@ -545,25 +595,29 @@ response (ModestWizardDialog *wizard_dialog, gint last = gtk_notebook_get_n_pages (notebook) - 1; is_last = current == last; is_first = current == 0; - + /* If first page, previous and finish are disabled, if last page, next is disabled */ make_buttons_sensitive (wizard_dialog, - !is_first /* previous */, !is_first /* finish */, !is_last /* next*/); - + (is_first) ? FALSE : TRUE, + TRUE, + (is_last) ? FALSE : TRUE); + /* Allow derived classes to disable buttons to prevent navigation, * according to their own validation logic: */ invoke_enable_buttons_vfunc (wizard_dialog); - + /* Don't let the dialog close */ g_signal_stop_emission_by_name (wizard_dialog, "response"); /* We show the default image on first and last pages */ last = gtk_notebook_get_n_pages (notebook) - 1; - if (current == last || current == 0) - gtk_widget_show (GTK_WIDGET(priv->image)); - else - gtk_widget_hide (GTK_WIDGET(priv->image)); + if (priv->image) { + if (current == last || current == 0) + gtk_widget_show (GTK_WIDGET(priv->image)); + else + gtk_widget_hide (GTK_WIDGET(priv->image)); + } /* New page number may appear in the title, update it */ if (priv->autotitle) @@ -674,3 +728,52 @@ invoke_enable_buttons_vfunc (ModestWizardDialog *wizard_dialog) (*(klass->enable_buttons))(wizard_dialog, current_page_widget); } } + +static void +invoke_update_model_vfunc (ModestWizardDialog *wizard_dialog) +{ + ModestWizardDialogClass *klass = MODEST_WIZARD_DIALOG_GET_CLASS (wizard_dialog); + + /* Call the vfunc, which may be overridden by derived classes: */ + if (klass->update_model) { + (*(klass->update_model)) (wizard_dialog); + } +} + +static gboolean +invoke_save_vfunc (ModestWizardDialog *wizard_dialog) +{ + ModestWizardDialogClass *klass = MODEST_WIZARD_DIALOG_GET_CLASS (wizard_dialog); + + /* Call the vfunc, which may be overridden by derived classes: */ + if (klass->save) { + return (*(klass->save)) (wizard_dialog); + } else { + return TRUE; + } +} + +void +modest_wizard_dialog_set_response_override_handler (ModestWizardDialog *wizard_dialog, + ModestWizardDialogResponseOverrideFunc callback) +{ + ModestWizardDialogPrivate *priv = wizard_dialog->priv; + + priv->override_func = callback; +} + +void +modest_wizard_dialog_update_model (ModestWizardDialog *wizard_dialog) +{ + g_return_if_fail (MODEST_IS_WIZARD_DIALOG (wizard_dialog)); + + invoke_update_model_vfunc (wizard_dialog); +} + +gboolean +modest_wizard_dialog_save (ModestWizardDialog *wizard_dialog) +{ + g_return_val_if_fail (MODEST_IS_WIZARD_DIALOG (wizard_dialog), FALSE); + + return invoke_save_vfunc (wizard_dialog); +}