From 21ff24d4b4d5fe58cbc34cf005ad3eccf35fc499 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 17 Sep 2018 22:12:51 +0200 Subject: [PATCH] =?UTF-8?q?I#128=20-=20Add=20=E2=80=9CCollection=20Account?= =?UTF-8?q?=E2=80=9D=20to=20=E2=80=9CFile=20=E2=80=BA=20New=E2=80=9D=20men?= =?UTF-8?q?u?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://gitlab.gnome.org/GNOME/evolution/issues/128 --- src/e-util/e-accounts-window.c | 1 + src/e-util/e-collection-account-wizard.c | 229 +++++++++++++++++++++++ src/e-util/e-collection-account-wizard.h | 2 + src/shell/e-shell-window-actions.c | 28 ++- 4 files changed, 259 insertions(+), 1 deletion(-) diff --git a/src/e-util/e-accounts-window.c b/src/e-util/e-accounts-window.c index e57c49b4db..0004b65837 100644 --- a/src/e-util/e-accounts-window.c +++ b/src/e-util/e-accounts-window.c @@ -1680,6 +1680,7 @@ accounts_window_constructed (GObject *object) gtk_window_set_default_size (GTK_WINDOW (accounts_window), 480, 410); gtk_window_set_title (GTK_WINDOW (accounts_window), _("Evolution Accounts")); + gtk_window_set_type_hint (GTK_WINDOW (accounts_window), GDK_WINDOW_TYPE_HINT_DIALOG); gtk_container_set_border_width (GTK_CONTAINER (accounts_window), 12); widget = gtk_notebook_new (); diff --git a/src/e-util/e-collection-account-wizard.c b/src/e-util/e-collection-account-wizard.c index e03f9fb65d..5c5e865543 100644 --- a/src/e-util/e-collection-account-wizard.c +++ b/src/e-util/e-collection-account-wizard.c @@ -88,6 +88,207 @@ static guint signals[LAST_SIGNAL]; G_DEFINE_TYPE (ECollectionAccountWizard, e_collection_account_wizard, GTK_TYPE_NOTEBOOK) +typedef struct _WizardWindowData { + GtkWidget *window; + GtkWidget *close_button; + GtkWidget *prev_button; + GtkButton *next_button; + ECollectionAccountWizard *collection_wizard; +} WizardWindowData; + +static void +collection_wizard_window_update_button_captions (WizardWindowData *wwd) +{ + g_return_if_fail (wwd != NULL); + + if (gtk_notebook_get_current_page (GTK_NOTEBOOK (wwd->collection_wizard))) { + gtk_widget_hide (wwd->close_button); + gtk_widget_show (wwd->prev_button); + } else { + gtk_widget_hide (wwd->prev_button); + gtk_widget_show (wwd->close_button); + } + + if (e_collection_account_wizard_is_finish_page (wwd->collection_wizard)) + gtk_button_set_label (wwd->next_button, _("_Finish")); + else + gtk_button_set_label (wwd->next_button, _("_Next")); +} + +static void +collection_wizard_window_back_button_clicked_cb (GtkButton *button, + gpointer user_data) +{ + WizardWindowData *wwd = user_data; + + g_return_if_fail (wwd != NULL); + + if (!e_collection_account_wizard_prev (wwd->collection_wizard)) { + e_collection_account_wizard_abort (wwd->collection_wizard); + gtk_widget_destroy (wwd->window); + } else { + collection_wizard_window_update_button_captions (wwd); + } +} + +static void +collection_wizard_window_next_button_clicked_cb (GtkButton *button, + gpointer user_data) +{ + WizardWindowData *wwd = user_data; + gboolean is_finish_page; + + g_return_if_fail (wwd != NULL); + + is_finish_page = e_collection_account_wizard_is_finish_page (wwd->collection_wizard); + + if (e_collection_account_wizard_next (wwd->collection_wizard)) { + if (is_finish_page) { + gtk_widget_destroy (wwd->window); + } else { + collection_wizard_window_update_button_captions (wwd); + } + } +} + +static void +collection_wizard_window_done (WizardWindowData *wwd, + const gchar *uid) +{ + g_return_if_fail (wwd != NULL); + + e_collection_account_wizard_abort (wwd->collection_wizard); + gtk_widget_destroy (wwd->window); +} + +static GtkWindow * +collection_account_wizard_create_window (GtkWindow *parent, + GtkWidget *wizard) +{ + GtkWidget *widget, *vbox, *hbox; + GtkWindow *window; + GtkAccelGroup *accel_group; + WizardWindowData *wwd; + + window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); + gtk_window_set_default_size (window, 480, 410); + gtk_window_set_title (window, _("New Collection Account")); + gtk_window_set_position (window, parent ? GTK_WIN_POS_CENTER_ON_PARENT : GTK_WIN_POS_CENTER); + gtk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DIALOG); + gtk_container_set_border_width (GTK_CONTAINER (window), 12); + + if (parent) { + gtk_window_set_transient_for (window, parent); + gtk_window_set_destroy_with_parent (window, TRUE); + } + + wwd = g_new0 (WizardWindowData, 1); + wwd->window = GTK_WIDGET (window); + + g_object_weak_ref (G_OBJECT (window), (GWeakNotify) g_free, wwd); + + widget = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_NONE); + gtk_widget_set_hexpand (widget, TRUE); + gtk_widget_set_vexpand (widget, TRUE); + gtk_container_add (GTK_CONTAINER (window), widget); + gtk_widget_show (widget); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add (GTK_CONTAINER (widget), vbox); + gtk_widget_show (vbox); + + widget = wizard; + g_object_set (G_OBJECT (widget), + "hexpand", TRUE, + "halign", GTK_ALIGN_FILL, + "vexpand", TRUE, + "valign", GTK_ALIGN_FILL, + "visible", TRUE, + NULL); + gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0); + wwd->collection_wizard = E_COLLECTION_ACCOUNT_WIZARD (widget); + + g_signal_connect_swapped (wwd->collection_wizard, "done", + G_CALLBACK (collection_wizard_window_done), wwd); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + g_object_set (G_OBJECT (hbox), + "hexpand", TRUE, + "halign", GTK_ALIGN_END, + "vexpand", FALSE, + "valign", GTK_ALIGN_START, + "visible", TRUE, + NULL); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + + widget = e_dialog_button_new_with_icon ("window-close", _("_Close")); + g_object_set (G_OBJECT (widget), + "hexpand", FALSE, + "halign", GTK_ALIGN_END, + "vexpand", FALSE, + "valign", GTK_ALIGN_START, + "visible", TRUE, + NULL); + gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0); + + accel_group = gtk_accel_group_new (); + gtk_widget_add_accelerator ( + widget, "activate", accel_group, + GDK_KEY_Escape, (GdkModifierType) 0, + GTK_ACCEL_VISIBLE); + gtk_window_add_accel_group (GTK_WINDOW (window), accel_group); + + wwd->close_button = widget; + + g_signal_connect (widget, "clicked", + G_CALLBACK (collection_wizard_window_back_button_clicked_cb), wwd); + + widget = e_dialog_button_new_with_icon ("go-previous", _("_Previous")); + g_object_set (G_OBJECT (widget), + "hexpand", FALSE, + "halign", GTK_ALIGN_END, + "vexpand", FALSE, + "valign", GTK_ALIGN_START, + "visible", FALSE, + NULL); + gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0); + + wwd->prev_button = widget; + + g_signal_connect (widget, "clicked", + G_CALLBACK (collection_wizard_window_back_button_clicked_cb), wwd); + + widget = e_dialog_button_new_with_icon ("go-next", _("_Next")); + g_object_set (G_OBJECT (widget), + "hexpand", TRUE, + "halign", GTK_ALIGN_END, + "vexpand", FALSE, + "valign", GTK_ALIGN_START, + "visible", TRUE, + "can-default", TRUE, + NULL); + gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0); + + wwd->next_button = GTK_BUTTON (widget); + + e_binding_bind_property ( + wwd->collection_wizard, "can-run", + widget, "sensitive", + G_BINDING_DEFAULT); + + g_signal_connect (widget, "clicked", + G_CALLBACK (collection_wizard_window_next_button_clicked_cb), wwd); + + gtk_widget_grab_default (GTK_WIDGET (wwd->next_button)); + + e_collection_account_wizard_reset (wwd->collection_wizard); + collection_wizard_window_update_button_captions (wwd); + + return window; +} + enum { PART_COLUMN_BOOL_ENABLED, /* G_TYPE_BOOLEAN */ PART_COLUMN_BOOL_ENABLED_VISIBLE, /* G_TYPE_BOOLEAN */ @@ -1989,6 +2190,34 @@ e_collection_account_wizard_new (ESourceRegistry *registry) NULL); } +/** + * e_collection_account_wizard_new_window: + * @parent: (nullable): an optional #GtkWindow parent of the new window + * @registry: an #ESourceRegistry + * + * Creates a new #ECollectionAccountWizard instance as part of a #GtkWindow. + * This window takes care of all the #ECollectionAccountWizard functionality. + * + * Returns: (transfer full): a new #GtkWindow containing an #ECollectionAccountWizard + * + * Since: 3.32 + **/ +GtkWindow * +e_collection_account_wizard_new_window (GtkWindow *parent, + ESourceRegistry *registry) +{ + GtkWidget *wizard; + + if (parent) + g_return_val_if_fail (GTK_IS_WINDOW (parent), NULL); + g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL); + + wizard = e_collection_account_wizard_new (registry); + g_return_val_if_fail (wizard != NULL, NULL); + + return collection_account_wizard_create_window (parent, wizard); +} + /** * e_collection_account_wizard_get_registry: * @wizard: an #ECollectionAccountWizard diff --git a/src/e-util/e-collection-account-wizard.h b/src/e-util/e-collection-account-wizard.h index 68e3e29c3d..f4331aa02b 100644 --- a/src/e-util/e-collection-account-wizard.h +++ b/src/e-util/e-collection-account-wizard.h @@ -76,6 +76,8 @@ struct _ECollectionAccountWizardClass { GType e_collection_account_wizard_get_type (void) G_GNUC_CONST; GtkWidget * e_collection_account_wizard_new (ESourceRegistry *registry); +GtkWindow * e_collection_account_wizard_new_window (GtkWindow *parent, + ESourceRegistry *registry); ESourceRegistry * e_collection_account_wizard_get_registry (ECollectionAccountWizard *wizard); gboolean e_collection_account_wizard_get_can_run (ECollectionAccountWizard *wizard); diff --git a/src/shell/e-shell-window-actions.c b/src/shell/e-shell-window-actions.c index 068a0a9dda..7e38da48bc 100644 --- a/src/shell/e-shell-window-actions.c +++ b/src/shell/e-shell-window-actions.c @@ -743,6 +743,19 @@ action_work_online_cb (GtkAction *action, g_object_unref (settings); } +static void +action_new_collection_account_cb (GtkAction *action, + EShellWindow *shell_window) +{ + EShell *shell; + GtkWindow *window; + + shell = e_shell_window_get_shell (shell_window); + window = e_collection_account_wizard_new_window (GTK_WINDOW (shell_window), e_shell_get_registry (shell)); + + gtk_window_present (window); +} + /** * E_SHELL_WINDOW_ACTION_GROUP_CUSTOM_RULES: * @window: an #EShellWindow @@ -773,6 +786,16 @@ action_work_online_cb (GtkAction *action, * @window: an #EShellWindow **/ +static GtkActionEntry new_source_entries[] = { + + { "new-collection-account", + "evolution", + N_("Collect_ion Account"), + NULL, + N_("Create a new collection account"), + G_CALLBACK (action_new_collection_account_cb) } +}; + static GtkActionEntry shell_entries[] = { { "about", @@ -1201,7 +1224,7 @@ shell_window_extract_actions (EShellWindow *shell_window, backend_name = g_object_get_data ( G_OBJECT (action), "backend-name"); - if (strcmp (backend_name, current_view) != 0) + if (g_strcmp0 (backend_name, current_view) != 0) continue; if (g_object_get_data (G_OBJECT (action), "primary")) @@ -1236,6 +1259,9 @@ e_shell_window_actions_init (EShellWindow *shell_window) e_load_ui_manager_definition (ui_manager, "evolution-shell.ui"); + e_shell_window_register_new_source_actions (shell_window, "shell", + new_source_entries, G_N_ELEMENTS (new_source_entries)); + /* Shell Actions */ action_group = ACTION_GROUP (SHELL); gtk_action_group_add_actions (