diff --git a/src/gui/event-editor/gcal-event-editor-dialog.c b/src/gui/event-editor/gcal-event-editor-dialog.c index de39f352..4ba9bf48 100644 --- a/src/gui/event-editor/gcal-event-editor-dialog.c +++ b/src/gui/event-editor/gcal-event-editor-dialog.c @@ -102,6 +102,10 @@ enum static guint signals[NUM_SIGNALS] = { 0, }; static GParamSpec* properties[N_PROPS] = { NULL, }; +static void on_ask_recurrence_response_save_cb (GcalEvent *event, + GcalRecurrenceModType mod_type, + gpointer user_data); + /* * Auxiliary methods @@ -114,7 +118,7 @@ set_writable (GcalEventEditorDialog *self, if (self->writable == writable) return; - gtk_button_set_label (GTK_BUTTON (self->done_button), writable ? _("Save") : _("Done")); + gtk_button_set_label (GTK_BUTTON (self->done_button), writable ? _("_Save") : _("_Done")); self->writable = writable; @@ -224,11 +228,110 @@ setup_context (GcalEventEditorDialog *self) GCAL_EXIT; } +static void +save_event_and_close_dialog (GcalEventEditorDialog *self) +{ + GcalCalendar *selected_calendar; + GcalCalendar *calendar; + GcalManager *manager; + gboolean can_show_mod_all; + gboolean was_recurrent; + gboolean calendar_changed; + gint i; + + manager = gcal_context_get_manager (self->context); + calendar = gcal_event_get_calendar (self->event); + + if (gcal_calendar_is_read_only (calendar)) + GCAL_GOTO (out); + + selected_calendar = gcal_calendar_combo_row_get_calendar (self->calendar_combo_row); + calendar_changed = selected_calendar && calendar != selected_calendar; + can_show_mod_all = TRUE; + if (!self->event_is_new) + { + gboolean anything_changed = calendar_changed; + + for (i = 0; i < G_N_ELEMENTS (self->sections); i++) + { + gboolean section_changed; + + section_changed = gcal_event_editor_section_changed (self->sections[i]); + anything_changed |= section_changed; + } + + if (!anything_changed) + goto out; + + can_show_mod_all = + !gcal_schedule_section_recurrence_changed (GCAL_SCHEDULE_SECTION (self->schedule_section)) && + !gcal_schedule_section_day_changed (GCAL_SCHEDULE_SECTION (self->schedule_section)); + } + + /* + * We don't want to ask the recurrence mod type if the event wasn't + * actually recurrent. + */ + was_recurrent = gcal_event_has_recurrence (self->event); + + for (i = 0; i < G_N_ELEMENTS (self->sections); i++) + { + if (gcal_event_editor_section_changed (self->sections[i])) + gcal_event_editor_section_apply (self->sections[i]); + } + + if (calendar_changed) + { + if (self->event_is_new) + { + gcal_event_set_calendar (self->event, selected_calendar); + } + else + { + ESource *source = gcal_calendar_get_source (selected_calendar); + + gcal_manager_move_event_to_source (manager, self->event, source); + goto out; + } + } + + if (self->event_is_new) + { + gcal_manager_create_event (manager, self->event); + } + else if (was_recurrent && gcal_event_has_recurrence (self->event)) + { + gcal_utils_ask_recurrence_modification_type (GTK_WIDGET (self), + self->event, + can_show_mod_all, + on_ask_recurrence_response_save_cb, + self); + return; + } + else + { + gcal_manager_update_event (manager, self->event, GCAL_RECURRENCE_MOD_THIS_ONLY); + } + +out: + clear_and_hide_dialog (self); +} + /* * Callbacks */ +static void +on_event_editor_save_action_activated_cb (GtkWidget *widget, + const gchar *action_name, + GVariant *parameter) +{ + GcalEventEditorDialog *self = GCAL_EVENT_EDITOR_DIALOG (widget); + + save_event_and_close_dialog (self); +} + static void on_cancel_button_clicked_cb (GtkButton *button, GcalEventEditorDialog *self) @@ -355,90 +458,7 @@ static void on_done_button_clicked_cb (GtkButton *button, GcalEventEditorDialog *self) { - GcalCalendar *selected_calendar; - GcalCalendar *calendar; - GcalManager *manager; - gboolean can_show_mod_all; - gboolean was_recurrent; - gboolean calendar_changed; - gint i; - - manager = gcal_context_get_manager (self->context); - calendar = gcal_event_get_calendar (self->event); - - if (gcal_calendar_is_read_only (calendar)) - GCAL_GOTO (out); - - selected_calendar = gcal_calendar_combo_row_get_calendar (self->calendar_combo_row); - calendar_changed = selected_calendar && calendar != selected_calendar; - can_show_mod_all = TRUE; - if (!self->event_is_new) - { - gboolean anything_changed = calendar_changed; - - for (i = 0; i < G_N_ELEMENTS (self->sections); i++) - { - gboolean section_changed; - - section_changed = gcal_event_editor_section_changed (self->sections[i]); - anything_changed |= section_changed; - } - - if (!anything_changed) - goto out; - - can_show_mod_all = - !gcal_schedule_section_recurrence_changed (GCAL_SCHEDULE_SECTION (self->schedule_section)) && - !gcal_schedule_section_day_changed (GCAL_SCHEDULE_SECTION (self->schedule_section)); - } - - /* - * We don't want to ask the recurrence mod type if the event wasn't - * actually recurrent. - */ - was_recurrent = gcal_event_has_recurrence (self->event); - - for (i = 0; i < G_N_ELEMENTS (self->sections); i++) - { - if (gcal_event_editor_section_changed (self->sections[i])) - gcal_event_editor_section_apply (self->sections[i]); - } - - if (calendar_changed) - { - if (self->event_is_new) - { - gcal_event_set_calendar (self->event, selected_calendar); - } - else - { - ESource *source = gcal_calendar_get_source (selected_calendar); - - gcal_manager_move_event_to_source (manager, self->event, source); - goto out; - } - } - - if (self->event_is_new) - { - gcal_manager_create_event (manager, self->event); - } - else if (was_recurrent && gcal_event_has_recurrence (self->event)) - { - gcal_utils_ask_recurrence_modification_type (GTK_WIDGET (self), - self->event, - can_show_mod_all, - on_ask_recurrence_response_save_cb, - self); - return; - } - else - { - gcal_manager_update_event (manager, self->event, GCAL_RECURRENCE_MOD_THIS_ONLY); - } - -out: - clear_and_hide_dialog (self); + save_event_and_close_dialog (self); } @@ -595,6 +615,8 @@ gcal_event_editor_dialog_class_init (GcalEventEditorDialogClass *klass) gtk_widget_class_bind_template_callback (widget_class, on_cancel_button_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, on_delete_row_activated_cb); gtk_widget_class_bind_template_callback (widget_class, on_done_button_clicked_cb); + + gtk_widget_class_install_action (widget_class, "event-editor.save", NULL, on_event_editor_save_action_activated_cb); } static void diff --git a/src/gui/event-editor/gcal-event-editor-dialog.ui b/src/gui/event-editor/gcal-event-editor-dialog.ui index 92e719a0..6e3d057a 100644 --- a/src/gui/event-editor/gcal-event-editor-dialog.ui +++ b/src/gui/event-editor/gcal-event-editor-dialog.ui @@ -132,6 +132,18 @@ + + + + + + <Control>s + action(event-editor.save) + + + + + vertical