]> git.street.me.uk Git - andy/viking.git/commitdiff
Allow creating a File Chooser dialog with optional file filters.
authorRob Norris <rw_norris@hotmail.com>
Mon, 30 Sep 2013 18:42:41 +0000 (19:42 +0100)
committerRob Norris <rw_norris@hotmail.com>
Wed, 16 Oct 2013 22:45:10 +0000 (23:45 +0100)
src/dialog.c
src/uibuilder.c
src/vikfileentry.c
src/vikfileentry.h
src/vikgeoreflayer.c
src/vikmapslayer.c

index b3e41ea04e564712a8d42971eebcf5641f95307a..72ef23383bf3f0e4742e286b23c4b5d1e707952f 100644 (file)
@@ -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;
index 26d7386e8632526454876a8249cd245a21f4b9e4..67a7bcd1b654a06aa267e5f9d698a514ca9dcbe2 100644 (file)
@@ -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 );
       }
index b5ec18b7970dff591b80e96db34983b9aac571ce..aed0df1648dbf97c176fd70c58d0a5228f939502 100644 (file)
@@ -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 )
index c58fb8c3821956d655b6f9f9f87e592706a928d6..d5585f2edfeca85b2d4caba74ac1f7e6a6dd6eac 100644 (file)
@@ -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 );
 
index 571fd7beed5e48d7b8e9d200199f16d80de0a23e..bb522311b109865569205eb499cd28041a99747a 100644 (file)
@@ -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)
   {
index 8fd4fa57a4598529092e7c21ebf251d4633ae648..7f982ed4b2c0791b5fb02e639d3983f007e71a27 100644 (file)
@@ -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 },