From a3484d5c29988bd7af037fc59a9950ffebf8a053 Mon Sep 17 00:00:00 2001 From: hiro Date: Tue, 21 May 2013 09:03:41 +0000 Subject: filesel: automatically modify file extension when file type is changed. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@3258 ee746299-78ed-0310-b773-934348b2243d --- ChangeLog | 7 +++++++ src/filesel.c | 49 ++++++++++++++++++++++++++++++++++++++++++------- src/filesel.h | 10 +++++++++- src/messageview.c | 12 +++++++----- src/summaryview.c | 13 ++++++++----- 5 files changed, 73 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index ab76fbe5..dd578203 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2013-05-21 + + * src/filesel.[ch] + src/messageview.c + src/summaryview.c: automatically modify file extension when + file type is changed. + 2013-05-20 * src/textview.c: textview_write_link(): insert space between diff --git a/src/filesel.c b/src/filesel.c index 593b54f6..12a93cb4 100644 --- a/src/filesel.c +++ b/src/filesel.c @@ -47,7 +47,7 @@ static GSList *filesel_select_file_full (const gchar *title, const gchar *file, GtkFileChooserAction action, gboolean multiple, - GSList *types, + FileselFileType *types, gint default_type, gint *selected_type); @@ -58,6 +58,9 @@ static void filesel_save_expander_set_expanded (GtkWidget *dialog, gboolean expanded); static gboolean filesel_save_expander_get_expanded (GtkWidget *dialog); +static void filesel_combo_changed_cb (GtkComboBox *combo_box, + gpointer data); + #if GTK_CHECK_VERSION(2, 8, 0) static GtkFileChooserConfirmation filesel_confirm_overwrite_cb (GtkFileChooser *chooser, @@ -160,7 +163,7 @@ static void filesel_save_dir_for_action(GtkFileChooserAction action, static GSList *filesel_select_file_full(const gchar *title, const gchar *file, GtkFileChooserAction action, gboolean multiple, - GSList *types, + FileselFileType *types, gint default_type, gint *selected_type) { gchar *cwd; @@ -202,23 +205,27 @@ static GSList *filesel_select_file_full(const gchar *title, const gchar *file, /* create types combo box */ if (types) { - GSList *cur; GtkWidget *hbox; GtkWidget *label; + gint i; hbox = gtk_hbox_new(FALSE, 12); label = gtk_label_new(_("File type:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); combo = gtk_combo_box_new_text(); - for (cur = types; cur != NULL; cur = cur->next) { - gtk_combo_box_append_text(GTK_COMBO_BOX(combo), (const gchar *)cur->data); + for (i = 0; types[i].type != NULL; i++) { + gtk_combo_box_append_text(GTK_COMBO_BOX(combo), types[i].type); } gtk_box_pack_start(GTK_BOX(hbox), combo, FALSE, FALSE, 0); gtk_widget_show_all(hbox); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(dialog), hbox); gtk_combo_box_set_active(GTK_COMBO_BOX(combo), default_type); + + g_object_set_data(G_OBJECT(combo), "types", types); + g_signal_connect(GTK_COMBO_BOX(combo), "changed", + G_CALLBACK(filesel_combo_changed_cb), dialog); } gtk_widget_show(dialog); @@ -296,7 +303,7 @@ gchar *filesel_save_as(const gchar *file) return filename; } -gchar *filesel_save_as_type(const gchar *file, GSList *types, +gchar *filesel_save_as_type(const gchar *file, FileselFileType *types, gint default_type, gint *selected_type) { GSList *list; @@ -304,7 +311,8 @@ gchar *filesel_save_as_type(const gchar *file, GSList *types, list = filesel_select_file_full(_("Save as"), file, GTK_FILE_CHOOSER_ACTION_SAVE, FALSE, - types, default_type, selected_type); + types, + default_type, selected_type); if (list) { filename = (gchar *)list->data; slist_free_strings(list->next); @@ -415,6 +423,33 @@ static gboolean filesel_save_expander_get_expanded(GtkWidget *dialog) return FALSE; } +static void filesel_combo_changed_cb(GtkComboBox *combo_box, gpointer data) +{ + GtkFileChooser *chooser = data; + gint active; + gchar *filename; + gchar *base; + gchar *new_filename; + gchar *p; + FileselFileType *types; + + active = gtk_combo_box_get_active(combo_box); + filename = gtk_file_chooser_get_filename(chooser); + types = g_object_get_data(G_OBJECT(combo_box), "types"); + g_print("active: %d filename: %s\n", active, filename); + g_print("type ext: %s\n", types[active].ext); + base = g_path_get_basename(filename); + p = strrchr(base, '.'); + if (p) + *p = '\0'; + new_filename = g_strconcat(base, ".", types[active].ext, NULL); + g_print("new_filename: %s\n", new_filename); + gtk_file_chooser_set_current_name(chooser, new_filename); + g_free(new_filename); + g_free(base); + g_free(filename); +} + #if GTK_CHECK_VERSION(2, 8, 0) static GtkFileChooserConfirmation filesel_confirm_overwrite_cb (GtkFileChooser *chooser, diff --git a/src/filesel.h b/src/filesel.h index c694ef24..e14397a4 100644 --- a/src/filesel.h +++ b/src/filesel.h @@ -23,6 +23,14 @@ #include #include +typedef struct _FileselFileType FileselFileType; + +struct _FileselFileType +{ + gchar *type; + gchar *ext; +}; + gchar *filesel_select_file (const gchar *title, const gchar *file, GtkFileChooserAction action); @@ -32,7 +40,7 @@ GSList *filesel_select_files (const gchar *title, gchar *filesel_save_as (const gchar *file); gchar *filesel_save_as_type (const gchar *file, - GSList *types, + FileselFileType *types, gint default_type, gint *selected_type); gchar *filesel_select_dir (const gchar *dir); diff --git a/src/messageview.c b/src/messageview.c index 0ccff0de..d5428d94 100644 --- a/src/messageview.c +++ b/src/messageview.c @@ -913,7 +913,7 @@ void messageview_save_as(MessageView *messageview) gchar *filename = NULL; MsgInfo *msginfo; gchar *src, *dest; - GSList *types; + FileselFileType types[4] = {{NULL, NULL}}; gint selected_type = 0; gint result; gboolean all_headers; @@ -928,11 +928,13 @@ void messageview_save_as(MessageView *messageview) } subst_for_filename(filename); - types = g_slist_append(NULL, _("Original (EML/RFC 822)")); - types = g_slist_append(types, _("Text")); - types = g_slist_append(types, _("Text (UTF-8)")); + types[0].type = _("Original (EML/RFC 822)"); + types[0].ext = "eml"; + types[1].type = _("Text"); + types[1].ext = "txt"; + types[2].type = _("Text (UTF-8)"); + types[2].ext = "txt"; dest = filesel_save_as_type(filename, types, 0, &selected_type); - g_slist_free(types); g_free(filename); if (!dest) diff --git a/src/summaryview.c b/src/summaryview.c index c22a431c..d9c93019 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -3891,7 +3891,7 @@ void summary_save_as(SummaryView *summaryview) MsgInfo *msginfo = NULL; gchar *filename; gchar *src, *dest; - GSList *types; + FileselFileType types[4] = {{NULL, NULL}}; gint selected_type = 0; gint result; gboolean all_headers; @@ -3912,11 +3912,14 @@ void summary_save_as(SummaryView *summaryview) } subst_for_filename(filename); - types = g_slist_append(NULL, _("Original (EML/RFC 822)")); - types = g_slist_append(types, _("Text")); - types = g_slist_append(types, _("Text (UTF-8)")); + types[0].type = _("Original (EML/RFC 822)"); + types[0].ext = "eml"; + types[1].type = _("Text"); + types[1].ext = "txt"; + types[2].type = _("Text (UTF-8)"); + types[2].ext = "txt"; + dest = filesel_save_as_type(filename, types, 0, &selected_type); - g_slist_free(types); g_free(filename); if (!dest) -- cgit v1.2.3