[PATCH] Added a function in gtk-gui.c for setting default file filters to a widget

Lubomir I. Ivanov neolit123 at gmail.com
Tue Jul 31 16:57:29 PDT 2012


From: "Lubomir I. Ivanov" <neolit123 at gmail.com>

The function add_default_file_filters takes a widget (presumably
a GtkFileChooser) and adds a couple of default file filter to it:
"XML files", and "All files".

"All files" could be somehow conventiant when the user decides
to browse for a file, which could be technically a supported format,
but with a different extension.

The name of the function is add_default_... at this point,
since later on there could be abstraction, where each dialog has its own
set of filters for saving and loading different supported types.

There is also a slight change in the label of the import dialog to
generalize the file chooser change: "Load a XML file" -> "Load a file".

Signed-off-by: Lubomir I. Ivanov <neolit123 at gmail.com>
---
 gtk-gui.c |   73 ++++++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 43 insertions(+), 30 deletions(-)

diff --git a/gtk-gui.c b/gtk-gui.c
index 45aa212..df26190 100644
--- a/gtk-gui.c
+++ b/gtk-gui.c
@@ -96,7 +96,7 @@ void report_error(GError* error)
 	{
 		return;
 	}
-	
+
 	if (error_info_bar == NULL)
 	{
 		error_count = 1;
@@ -106,11 +106,11 @@ void report_error(GError* error)
 		g_signal_connect(error_info_bar, "response", G_CALLBACK(on_info_bar_response), NULL);
 		gtk_info_bar_set_message_type(GTK_INFO_BAR(error_info_bar),
 		                              GTK_MESSAGE_ERROR);
-		
+
 		error_label = gtk_label_new(error->message);
 		GtkWidget *container = gtk_info_bar_get_content_area(GTK_INFO_BAR(error_info_bar));
 		gtk_container_add(GTK_CONTAINER(container), error_label);
-		
+
 		gtk_box_pack_start(GTK_BOX(main_vbox), error_info_bar, FALSE, FALSE, 0);
 		gtk_widget_show_all(main_vbox);
 	}
@@ -123,10 +123,32 @@ void report_error(GError* error)
 	}
 }
 
+static void add_default_file_filters(GtkWidget *file_chooser)
+{
+	GtkFileFilter *file_filter_all;
+	GtkFileFilter *file_filter_xml;
+
+	file_filter_all = gtk_file_filter_new();
+	gtk_file_filter_add_pattern(file_filter_all, "*.*");
+	gtk_file_filter_set_name(file_filter_all, "All files");
+
+	file_filter_xml = gtk_file_filter_new();
+	gtk_file_filter_add_pattern(file_filter_xml, "*.xml");
+	gtk_file_filter_add_pattern(file_filter_xml, "*.XML");
+	gtk_file_filter_add_pattern(file_filter_xml, "*.sda");
+	gtk_file_filter_add_pattern(file_filter_xml, "*.SDA");
+	gtk_file_filter_add_mime_type(file_filter_xml, "text/xml");
+	gtk_file_filter_set_name(file_filter_xml, "XML files");
+
+	gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_chooser), file_filter_all);
+	gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_chooser), file_filter_xml);
+
+	gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(file_chooser), file_filter_xml);
+}
+
 static void file_open(GtkWidget *w, gpointer data)
 {
 	GtkWidget *dialog;
-	GtkFileFilter *filter;
 
 	dialog = gtk_file_chooser_dialog_new("Open File",
 		GTK_WINDOW(main_window),
@@ -136,20 +158,13 @@ static void file_open(GtkWidget *w, gpointer data)
 		NULL);
 	gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
 
-	filter = gtk_file_filter_new();
-	gtk_file_filter_add_pattern(filter, "*.xml");
-	gtk_file_filter_add_pattern(filter, "*.XML");
-	gtk_file_filter_add_pattern(filter, "*.sda");
-	gtk_file_filter_add_pattern(filter, "*.SDA");
-	gtk_file_filter_add_mime_type(filter, "text/xml");
-	gtk_file_filter_set_name(filter, "XML file");
-	gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
+	add_default_file_filters(dialog);
 
 	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
 		GSList *filenames, *fn_glist;
 		char *filename;
 		filenames = fn_glist = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));
-		
+
 		GError *error = NULL;
 		while(filenames != NULL) {
 			filename = filenames->data;
@@ -160,19 +175,21 @@ static void file_open(GtkWidget *w, gpointer data)
 				g_error_free(error);
 				error = NULL;
 			}
-			
+
 			g_free(filename);
 			filenames = g_slist_next(filenames);
 		}
 		g_slist_free(fn_glist);
 		report_dives(FALSE);
 	}
+
 	gtk_widget_destroy(dialog);
 }
 
 static void file_save(GtkWidget *w, gpointer data)
 {
 	GtkWidget *dialog;
+
 	dialog = gtk_file_chooser_dialog_new("Save File",
 		GTK_WINDOW(main_window),
 		GTK_FILE_CHOOSER_ACTION_SAVE,
@@ -180,6 +197,9 @@ static void file_save(GtkWidget *w, gpointer data)
 		GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
 		NULL);
 	gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
+
+	add_default_file_filters(dialog);
+
 	if (!existing_filename) {
 		gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "Untitled document");
 	} else
@@ -192,6 +212,7 @@ static void file_save(GtkWidget *w, gpointer data)
 		g_free(filename);
 		mark_divelist_changed(FALSE);
 	}
+
 	gtk_widget_destroy(dialog);
 }
 
@@ -1023,17 +1044,16 @@ static void on_file_set(GtkFileChooserButton *widget, gpointer _data)
 	gtk_dialog_response(main_dialog, GTK_RESPONSE_ACCEPT);
 }
 
-static GtkWidget *xml_file_selector(GtkWidget *vbox, GtkWidget *main_dialog)
+static GtkWidget *file_selector(GtkWidget *vbox, GtkWidget *main_dialog)
 {
 	GtkWidget *hbox, *frame, *chooser, *dialog;
-	GtkFileFilter *filter;
 
 	hbox = gtk_hbox_new(FALSE, 6);
 	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3);
 
-	frame = gtk_frame_new("XML file name");
+	frame = gtk_frame_new("File name");
 	gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 3);
-	dialog = gtk_file_chooser_dialog_new("Open XML File",
+	dialog = gtk_file_chooser_dialog_new("Open a file",
 		GTK_WINDOW(main_window),
 		GTK_FILE_CHOOSER_ACTION_OPEN,
 		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
@@ -1041,14 +1061,7 @@ static GtkWidget *xml_file_selector(GtkWidget *vbox, GtkWidget *main_dialog)
 		NULL);
 	gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), FALSE);
 
-	filter = gtk_file_filter_new();
-	gtk_file_filter_add_pattern(filter, "*.xml");
-	gtk_file_filter_add_pattern(filter, "*.XML");
-	gtk_file_filter_add_pattern(filter, "*.sda");
-	gtk_file_filter_add_pattern(filter, "*.SDA");
-	gtk_file_filter_add_mime_type(filter, "text/xml");
-	gtk_file_filter_set_name(filter, "XML file");
-	gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
+	add_default_file_filters(dialog);
 
 	chooser = gtk_file_chooser_button_new_with_dialog(dialog);
 	g_signal_connect(G_OBJECT(chooser), "file-set", G_CALLBACK(on_file_set), main_dialog);
@@ -1101,7 +1114,7 @@ void import_dialog(GtkWidget *w, gpointer data)
 	GtkWidget *dialog, *hbox, *vbox, *label, *info = NULL;
 	GtkComboBox *computer;
 	GtkEntry *device;
-	GtkWidget *XMLchooser;
+	GtkWidget *file_chooser;
 	device_data_t devicedata = {
 		.devname = NULL,
 	};
@@ -1114,9 +1127,9 @@ void import_dialog(GtkWidget *w, gpointer data)
 		NULL);
 
 	vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
-	label = gtk_label_new("Import: \nLoad XML file or import directly from dive computer");
+	label = gtk_label_new("Import: \nLoad a file or import directly from dive computer");
 	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 3);
-	XMLchooser = xml_file_selector(vbox, dialog);
+	file_chooser = file_selector(vbox, dialog);
 	computer = dive_computer_selector(vbox);
 	device = dive_computer_device(vbox);
 	hbox = gtk_hbox_new(FALSE, 6);
@@ -1137,7 +1150,7 @@ repeat:
 		 * we ignore whether a dive computer model was picked */
 		if (info)
 			gtk_widget_destroy(info);
-		list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(XMLchooser));
+		list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(file_chooser));
 		if (g_slist_length(list) == 0) {
 			const char *vendor, *product;
 
-- 
1.7.6.msysgit.0



More information about the subsurface mailing list