diff --git a/src/gcal-source-dialog.c b/src/gcal-source-dialog.c index bd2e27ca..f0f03fd0 100644 --- a/src/gcal-source-dialog.c +++ b/src/gcal-source-dialog.c @@ -93,7 +93,7 @@ static void action_widget_activated (GtkWidget *w static void back_button_clicked (GtkButton *button, gpointer user_data); -static void calendar_file_selected (GtkFileChooserButton *button, +static void calendar_file_selected (GtkFileChooser *button, gpointer user_data); static void calendar_listbox_row_activated (GtkListBox *box, @@ -104,6 +104,9 @@ static void calendar_visible_check_toggled (GObject *ob GParamSpec *pspec, gpointer user_data); +static void cancel_button_clicked (GtkWidget *button, + gpointer user_data); + static void clear_pages (GcalSourceDialog *dialog); static void color_set (GtkColorButton *button, @@ -135,6 +138,10 @@ static void new_name_entry_text_changed (GObject *ob GParamSpec *pspec, gpointer user_data); +static void on_file_activated (GSimpleAction *action, + GVariant *param, + gpointer user_data); + static void remove_source (GcalManager *manager, ESource *source, gpointer user_data); @@ -169,9 +176,9 @@ static void discover_sources_cb (GObject *so G_DEFINE_TYPE_WITH_PRIVATE (GcalSourceDialog, gcal_source_dialog, GTK_TYPE_DIALOG) GActionEntry actions[] = { - {"file", NULL, NULL, NULL, NULL}, - {"local", NULL, NULL, NULL, NULL}, - {"web", NULL, NULL, NULL, NULL} + {"file", on_file_activated, NULL, NULL, NULL}, + {"local", NULL, NULL, NULL, NULL}, + {"web", NULL, NULL, NULL, NULL} }; static void @@ -276,6 +283,22 @@ calendar_visible_check_toggled (GObject *object, gcal_manager_disable_source (priv->manager, priv->source); } +static void +cancel_button_clicked (GtkWidget *button, + gpointer user_data) +{ + GcalSourceDialogPrivate *priv = GCAL_SOURCE_DIALOG (user_data)->priv; + + // Destroy the ongoing created source + if (priv->source != NULL) + { + g_object_unref (priv->source); + priv->source = NULL; + } + + gcal_source_dialog_set_mode (GCAL_SOURCE_DIALOG (user_data), GCAL_SOURCE_DIALOG_MODE_NORMAL); +} + /** * clear_pages: * @@ -641,7 +664,7 @@ stack_visible_child_name_changed (GObject *object, * Returns: */ static void -calendar_file_selected (GtkFileChooserButton *button, +calendar_file_selected (GtkFileChooser *button, gpointer user_data) { GcalSourceDialogPrivate *priv = GCAL_SOURCE_DIALOG (user_data)->priv; @@ -649,7 +672,7 @@ calendar_file_selected (GtkFileChooserButton *button, ESource *source; GFile *file; - //file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (priv->select_file_button)); + file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (button)); if (file == NULL) return; @@ -815,6 +838,36 @@ url_entry_text_changed (GObject *object, } } +static void +on_file_activated (GSimpleAction *action, + GVariant *param, + gpointer user_data) +{ + GtkWidget *dialog; + GtkFileFilter *filter; + + // Dialog + dialog = gtk_file_chooser_dialog_new (_("Select a calendar file"), + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (user_data))), + GTK_FILE_CHOOSER_ACTION_SAVE, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Open"), GTK_RESPONSE_OK, + NULL); + + g_signal_connect (dialog, "file-activated", G_CALLBACK (calendar_file_selected), user_data); + + // File filter + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, _("Calendar files")); + gtk_file_filter_add_mime_type (filter, "text/calendar"); + + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); + + gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); +} + /** * validate_url_cb: * @@ -1217,7 +1270,6 @@ gcal_source_dialog_constructed (GObject *object) { GcalSourceDialog *self = (GcalSourceDialog *)object; GcalSourceDialogPrivate *priv = gcal_source_dialog_get_instance_private (self); - GtkFileFilter *filter; GtkBuilder *builder; GMenuModel *menu; @@ -1227,20 +1279,12 @@ gcal_source_dialog_constructed (GObject *object) gtk_dialog_set_default_response (GTK_DIALOG (object), GTK_RESPONSE_CANCEL); g_object_set_data (G_OBJECT (priv->add_button), "response", GINT_TO_POINTER (GTK_RESPONSE_APPLY)); - g_object_set_data (G_OBJECT (priv->cancel_button), "response", GINT_TO_POINTER (GTK_RESPONSE_CANCEL)); g_object_set_data (G_OBJECT (priv->remove_button), "response", GINT_TO_POINTER (GCAL_RESPONSE_REMOVE_SOURCE)); // Setup listbox header functions gtk_list_box_set_header_func (GTK_LIST_BOX (priv->calendars_listbox), display_header_func, NULL, NULL); gtk_list_box_set_header_func (GTK_LIST_BOX (priv->online_accounts_listbox), display_header_func, NULL, NULL); - /* File filter */ - filter = gtk_file_filter_new (); - gtk_file_filter_set_name (filter, _("Calendar files")); - gtk_file_filter_add_mime_type (filter, "text/calendar"); - - //gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (priv->select_file_button), filter); - // Action group priv->action_group = g_simple_action_group_new (); gtk_widget_insert_action_group (GTK_WIDGET (object), "source", G_ACTION_GROUP (priv->action_group)); @@ -1305,6 +1349,7 @@ gcal_source_dialog_class_init (GcalSourceDialogClass *klass) gtk_widget_class_bind_template_callback (widget_class, calendar_file_selected); gtk_widget_class_bind_template_callback (widget_class, calendar_listbox_row_activated); gtk_widget_class_bind_template_callback (widget_class, calendar_visible_check_toggled); + gtk_widget_class_bind_template_callback (widget_class, cancel_button_clicked); gtk_widget_class_bind_template_callback (widget_class, color_set); gtk_widget_class_bind_template_callback (widget_class, default_check_toggled); gtk_widget_class_bind_template_callback (widget_class, description_label_link_activated); @@ -1351,7 +1396,6 @@ gcal_source_dialog_set_manager (GcalSourceDialog *dialog, g_signal_connect (priv->manager, "source-added", G_CALLBACK (add_source), dialog); g_signal_connect (priv->manager, "source-removed", G_CALLBACK (remove_source), dialog); - /* TODO: connect ::source-removed signals */ } /**