[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