From: Rob Norris Date: Mon, 30 Sep 2013 18:42:41 +0000 (+0100) Subject: Allow creating a File Chooser dialog with optional file filters. X-Git-Url: https://git.street.me.uk/andy/viking.git/commitdiff_plain/857baaa37b04001e3c4b22c9d26f859514d6094d Allow creating a File Chooser dialog with optional file filters. --- diff --git a/src/dialog.c b/src/dialog.c index b3e41ea0..72ef2338 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -272,7 +272,7 @@ gchar *a_dialog_waypoint ( GtkWindow *parent, gchar *default_name, VikTrwLayer * descriptionentry = gtk_entry_new (); imagelabel = gtk_label_new (_("Image:")); - imageentry = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN); + imageentry = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN, VF_FILTER_IMAGE); { GtkCellRenderer *r; diff --git a/src/uibuilder.c b/src/uibuilder.c index 26d7386e..67a7bcd1 100644 --- a/src/uibuilder.c +++ b/src/uibuilder.c @@ -188,7 +188,7 @@ GtkWidget *a_uibuilder_new_widget ( VikLayerParam *param, VikLayerParamData data case VIK_LAYER_WIDGET_FILEENTRY: if ( param->type == VIK_LAYER_PARAM_STRING ) { - rv = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN); + rv = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN, GPOINTER_TO_INT(param->widget_data)); if ( vlpd.s ) vik_file_entry_set_filename ( VIK_FILE_ENTRY(rv), vlpd.s ); } @@ -196,7 +196,7 @@ GtkWidget *a_uibuilder_new_widget ( VikLayerParam *param, VikLayerParamData data case VIK_LAYER_WIDGET_FOLDERENTRY: if ( param->type == VIK_LAYER_PARAM_STRING ) { - rv = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + rv = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, VF_FILTER_NONE); if ( vlpd.s ) vik_file_entry_set_filename ( VIK_FILE_ENTRY(rv), vlpd.s ); } diff --git a/src/vikfileentry.c b/src/vikfileentry.c index b5ec18b7..aed0df16 100644 --- a/src/vikfileentry.c +++ b/src/vikfileentry.c @@ -35,6 +35,7 @@ struct _VikFileEntry { GtkWidget *entry, *button; GtkWidget *file_selector; GtkFileChooserAction action; + gint filter_type; }; GType vik_file_entry_get_type (void) @@ -61,7 +62,10 @@ GType vik_file_entry_get_type (void) return vs_type; } -GtkWidget *vik_file_entry_new (GtkFileChooserAction action) +/** + * Create a file entry with an optional file filter + */ +GtkWidget *vik_file_entry_new (GtkFileChooserAction action, vf_filter_type filter_type) { VikFileEntry *vfe = VIK_FILE_ENTRY ( g_object_new ( VIK_FILE_ENTRY_TYPE, NULL ) ); vfe->entry = gtk_entry_new (); @@ -73,6 +77,7 @@ GtkWidget *vik_file_entry_new (GtkFileChooserAction action) gtk_box_pack_start ( GTK_BOX(vfe), vfe->button, FALSE, FALSE, 3 ); vfe->file_selector = NULL; + vfe->filter_type = filter_type; return GTK_WIDGET(vfe); } @@ -101,6 +106,39 @@ static void choose_file ( VikFileEntry *vfe ) NULL); gtk_window_set_transient_for ( GTK_WINDOW(vfe->file_selector), GTK_WINDOW(win) ); gtk_window_set_destroy_with_parent ( GTK_WINDOW(vfe->file_selector), TRUE ); + + switch ( vfe->filter_type ) { + case VF_FILTER_IMAGE: { + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("JPG") ); + gtk_file_filter_add_mime_type ( filter, "image/jpeg"); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("PNG") ); + gtk_file_filter_add_mime_type ( filter, "image/png"); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + + break; + } + case VF_FILTER_MBTILES: { + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_set_name ( filter, _("MBTiles") ); + gtk_file_filter_add_pattern ( filter, "*.sqlite" ); + gtk_file_filter_add_pattern ( filter, "*.mbtiles" ); + gtk_file_filter_add_pattern ( filter, "*.db3" ); + gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(vfe->file_selector), filter ); + break; + } + default: break; + } + if ( vfe->filter_type ) { + // Always have an catch all filter at the end + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("All") ); + gtk_file_filter_add_pattern ( filter, "*" ); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vfe->file_selector), filter); + } } if ( gtk_dialog_run ( GTK_DIALOG(vfe->file_selector) ) == GTK_RESPONSE_ACCEPT ) diff --git a/src/vikfileentry.h b/src/vikfileentry.h index c58fb8c3..d5585f2e 100644 --- a/src/vikfileentry.h +++ b/src/vikfileentry.h @@ -44,7 +44,14 @@ struct _VikFileEntryClass GType vik_file_entry_get_type (); -GtkWidget *vik_file_entry_new (GtkFileChooserAction action); +typedef enum { + VF_FILTER_NONE = 0, + VF_FILTER_IMAGE, // JPG+PNG + VF_FILTER_MBTILES, + VF_FILTER_LAST +} vf_filter_type; + +GtkWidget *vik_file_entry_new (GtkFileChooserAction action, vf_filter_type filter_type); const gchar *vik_file_entry_get_filename ( VikFileEntry *vfe ); void vik_file_entry_set_filename ( VikFileEntry *vfe, const gchar *filename ); diff --git a/src/vikgeoreflayer.c b/src/vikgeoreflayer.c index 571fd7be..bb522311 100644 --- a/src/vikgeoreflayer.c +++ b/src/vikgeoreflayer.c @@ -549,7 +549,7 @@ static gboolean georef_layer_dialog ( VikGeorefLayer **vgl, gpointer vp, GtkWind gtk_widget_set_tooltip_text ( GTK_WIDGET(yspin), _("the scale of the map in the Y direction (meters per pixel)") ); imagelabel = gtk_label_new ( _("Map Image:") ); - imageentry = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN); + imageentry = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN, VF_FILTER_IMAGE); if (*vgl) { diff --git a/src/vikmapslayer.c b/src/vikmapslayer.c index 8fd4fa57..7f982ed4 100644 --- a/src/vikmapslayer.c +++ b/src/vikmapslayer.c @@ -136,7 +136,7 @@ static VikLayerParamData mapzoom_default ( void ) { return VIK_LPD_UINT ( 0 ); } VikLayerParam maps_layer_params[] = { { VIK_LAYER_MAPS, "mode", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Map Type:"), VIK_LAYER_WIDGET_COMBOBOX, NULL, NULL, NULL, mode_default, NULL, NULL }, { VIK_LAYER_MAPS, "directory", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Maps Directory:"), VIK_LAYER_WIDGET_FOLDERENTRY, NULL, NULL, NULL, directory_default, NULL, NULL }, - { VIK_LAYER_MAPS, "mapfile", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Map File:"), VIK_LAYER_WIDGET_FILEENTRY, NULL, NULL, + { VIK_LAYER_MAPS, "mapfile", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Map File:"), VIK_LAYER_WIDGET_FILEENTRY, GINT_TO_POINTER(VF_FILTER_MBTILES), NULL, N_("An MBTiles file. Only applies when the map type method is 'MBTiles'"), file_default, NULL, NULL }, { VIK_LAYER_MAPS, "alpha", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Alpha:"), VIK_LAYER_WIDGET_HSCALE, params_scales, NULL, N_("Control the Alpha value for transparency effects"), alpha_default, NULL, NULL },