[gnumeric] Save As: fix bad interaction with file chooser's completions.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Save As: fix bad interaction with file chooser's completions.
- Date: Thu, 18 Apr 2013 00:02:44 +0000 (UTC)
commit 7df69ab4c8eea6a1ef072e1b24a766148b197cc8
Author: Morten Welinder <terra gnome org>
Date: Wed Apr 17 20:02:13 2013 -0400
Save As: fix bad interaction with file chooser's completions.
ChangeLog | 7 +++++
NEWS | 1 +
src/gui-file.c | 84 +++++++++++++++++++++++++++++++++++++++++++---------------
3 files changed, 71 insertions(+), 21 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 9903f54..55db2cb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-04-17 Morten Welinder <terra gnome org>
+
+ * src/gui-file.c (file_saver_format_changed_cb): New function to
+ change the extension when the format is changed.
+ (gui_file_save_as): Don't try to hide the extension -- it
+ interferes with the file chooser's completion. Fixes #695839.
+
2013-04-16 Morten Welinder <terra gnome org>
* src/wbc-gtk.c (wbcg_update_action_sensitivity): Turn on context
diff --git a/NEWS b/NEWS
index b80b352..75471dd 100644
--- a/NEWS
+++ b/NEWS
@@ -48,6 +48,7 @@ Morten:
* Fix database criteria anchoring. [#661800]
* Fix database criterias "=" and "<>" for emptiness test. [#686156]
* Enable context menu for graph sheet tabs. [#685446]
+ * Fix bad interaction between save-as and GtkFileChooser. [#695839]
--------------------------------------------------------------------------
Gnumeric 1.12.1
diff --git a/src/gui-file.c b/src/gui-file.c
index dd7911a..9315d22 100644
--- a/src/gui-file.c
+++ b/src/gui-file.c
@@ -32,9 +32,9 @@
typedef struct {
GOCharmapSel *go_charmap_sel;
- GtkWidget *charmap_label;
+ GtkWidget *charmap_label;
GList *openers;
-} file_format_changed_cb_data;
+} file_opener_format_changed_cb_data;
@@ -64,16 +64,15 @@ make_format_chooser (GList *list, GtkComboBox *combo)
/* Make format chooser */
for (l = list; l != NULL; l = l->next) {
+ GObject *obj = l->data;
gchar const *descr;
- if (!l->data)
+ if (!obj)
descr = _("Automatically detected");
- else if (GO_IS_FILE_OPENER (l->data))
- descr = go_file_opener_get_description (
- GO_FILE_OPENER (l->data));
+ else if (GO_IS_FILE_OPENER (obj))
+ descr = go_file_opener_get_description (GO_FILE_OPENER (obj));
else
- descr = go_file_saver_get_description (
- GO_FILE_SAVER (l->data));
+ descr = go_file_saver_get_description (GO_FILE_SAVER (obj));
gtk_combo_box_text_append_text (bt, descr);
}
@@ -161,8 +160,8 @@ gui_file_template (WBCGtk *wbcg, char const *uri)
}
static void
-file_format_changed_cb (GtkComboBox *format_combo,
- file_format_changed_cb_data *data)
+file_opener_format_changed_cb (GtkComboBox *format_combo,
+ file_opener_format_changed_cb_data *data)
{
GOFileOpener *fo = g_list_nth_data (data->openers,
gtk_combo_box_get_active (format_combo));
@@ -220,7 +219,7 @@ gui_file_open (WBCGtk *wbcg, file_open_t type, char const *default_format)
GtkWidget *advanced_button;
GtkComboBox *format_combo;
GtkWidget *go_charmap_sel;
- file_format_changed_cb_data data;
+ file_opener_format_changed_cb_data data;
gint opener_default;
char const *title = NULL;
GSList *uris = NULL;
@@ -317,10 +316,10 @@ gui_file_open (WBCGtk *wbcg, file_open_t type, char const *default_format)
format_combo = GTK_COMBO_BOX (gtk_combo_box_text_new ());
make_format_chooser (openers, format_combo);
g_signal_connect (G_OBJECT (format_combo), "changed",
- G_CALLBACK (file_format_changed_cb), &data);
+ G_CALLBACK (file_opener_format_changed_cb), &data);
gtk_combo_box_set_active (format_combo, opener_default);
gtk_widget_set_sensitive (GTK_WIDGET (format_combo), opener_default == 0);
- file_format_changed_cb (format_combo, &data);
+ file_opener_format_changed_cb (format_combo, &data);
fsel = GTK_FILE_CHOOSER
(g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG,
@@ -473,6 +472,44 @@ extension_check_disabled (GOFileSaver *fs)
return (NULL != g_slist_find_custom (list, id, go_str_compare));
}
+typedef struct {
+ GtkFileChooser *fsel;
+ GList *savers;
+} file_saver_format_changed_cb_data;
+
+/*
+ * Change or add the extension for the newly chosen saver to the file
+ * name in the file chooser.
+ */
+static void
+file_saver_format_changed_cb (GtkComboBox *format_combo,
+ file_saver_format_changed_cb_data *data)
+{
+ GOFileSaver *fs = g_list_nth_data (data->savers, gtk_combo_box_get_active (format_combo));
+ char *uri = gtk_file_chooser_get_uri (data->fsel);
+ char *basename = NULL, *newname = NULL, *dot;
+ char const *ext = go_file_saver_get_extension (fs);
+
+ if (!uri || !ext)
+ goto out;
+
+ basename = go_basename_from_uri (uri);
+ if (!basename)
+ goto out;
+
+ dot = strchr (basename, '.');
+ if (dot)
+ *dot = 0;
+
+ newname = g_strconcat (basename, ".", ext, NULL);
+ gtk_file_chooser_set_current_name (data->fsel, newname);
+
+out:
+ g_free (uri);
+ g_free (basename);
+ g_free (newname);
+}
+
gboolean
gui_file_save_as (WBCGtk *wbcg, WorkbookView *wb_view, file_save_as_t type,
char const *default_format)
@@ -481,6 +518,7 @@ gui_file_save_as (WBCGtk *wbcg, WorkbookView *wb_view, file_save_as_t type,
GtkFileChooser *fsel;
GtkComboBox *format_combo;
GOFileSaver *fs;
+ file_saver_format_changed_cb_data data;
gboolean success = FALSE;
gchar const *wb_uri;
char *uri;
@@ -514,9 +552,9 @@ gui_file_save_as (WBCGtk *wbcg, WorkbookView *wb_view, file_save_as_t type,
savers = g_list_prepend (savers, l->data);
break;
}
- savers = g_list_sort (savers, file_saver_description_cmp);
+ data.savers = savers = g_list_sort (savers, file_saver_description_cmp);
- fsel = GTK_FILE_CHOOSER
+ data.fsel = fsel = GTK_FILE_CHOOSER
(g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG,
"action", GTK_FILE_CHOOSER_ACTION_SAVE,
"local-only", FALSE,
@@ -567,6 +605,8 @@ gui_file_save_as (WBCGtk *wbcg, WorkbookView *wb_view, file_save_as_t type,
GtkWidget *label = gtk_label_new_with_mnemonic (_("File _type:"));
format_combo = GTK_COMBO_BOX (gtk_combo_box_text_new ());
make_format_chooser (savers, format_combo);
+ g_signal_connect (G_OBJECT (format_combo), "changed",
+ G_CALLBACK (file_saver_format_changed_cb), &data);
gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 6);
gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (format_combo), FALSE, TRUE, 6);
@@ -599,15 +639,17 @@ gui_file_save_as (WBCGtk *wbcg, WorkbookView *wb_view, file_save_as_t type,
if (wb_uri != NULL) {
char *basename = go_basename_from_uri (wb_uri);
- char *dot = basename ? strrchr (basename, '.') : NULL;
+ /*
+ * If the file exists, the following is dominated by the
+ * final set_uri. If the file does not exist, we get the
+ * directory from the first set_uri and the basename set
+ * with set_current_name.
+ */
gtk_file_chooser_set_uri (fsel, wb_uri);
- gtk_file_chooser_unselect_all (fsel);
-
- /* Remove extension. */
- if (dot && dot != basename)
- *dot = 0;
gtk_file_chooser_set_current_name (fsel, basename);
+ gtk_file_chooser_set_uri (fsel, wb_uri);
+
g_free (basename);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]