From 79672b858b676683a52cc5d70b4f8200ac6ef28f Mon Sep 17 00:00:00 2001 From: Jocelyn Jaubert Date: Sun, 15 Mar 2009 13:38:02 +0100 Subject: [PATCH] Fix bug #2481237: Maps directory file chooser should look for directory This adds a parameter to vik_file_entry_new() to specify if we are looking for a file or a directory. There is also a new parameter for widget type: VIK_LAYER_WIDGET_FOLDERENTRY in addition to VIK_LAYER_WIDGET_FILEENTRY. Now, we can correctly select a directory when looking at the maps directory property of maps layers. Thanks Andrew Lunn to have reported the bug. --- src/dialog.c | 2 +- src/uibuilder.c | 11 ++++++++++- src/uibuilder.h | 1 + src/vikfileentry.c | 6 ++++-- src/vikfileentry.h | 2 +- src/vikgeoreflayer.c | 2 +- src/vikmapslayer.c | 2 +- 7 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/dialog.c b/src/dialog.c index 06965fd1..a3c4bdba 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -257,7 +257,7 @@ gboolean a_dialog_new_waypoint ( GtkWindow *parent, gchar **dest, VikWaypoint *w gtk_entry_set_text(GTK_ENTRY(commententry), cmt); imagelabel = gtk_label_new (_("Image:")); - imageentry = vik_file_entry_new (); + imageentry = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN); { GtkCellRenderer *r; diff --git a/src/uibuilder.c b/src/uibuilder.c index a277724d..d9b497c3 100644 --- a/src/uibuilder.c +++ b/src/uibuilder.c @@ -138,10 +138,18 @@ 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 (); + rv = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN); vik_file_entry_set_filename ( VIK_FILE_ENTRY(rv), data.s ); } break; + case VIK_LAYER_WIDGET_FOLDERENTRY: + if ( param->type == VIK_LAYER_PARAM_STRING ) + { + rv = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + vik_file_entry_set_filename ( VIK_FILE_ENTRY(rv), data.s ); + } + break; + case VIK_LAYER_WIDGET_FILELIST: if ( param->type == VIK_LAYER_PARAM_STRING_LIST ) { @@ -202,6 +210,7 @@ VikLayerParamData a_uibuilder_widget_get_value ( GtkWidget *widget, VikLayerPara rv.s = gtk_entry_get_text ( GTK_ENTRY(widget) ); break; case VIK_LAYER_WIDGET_FILEENTRY: + case VIK_LAYER_WIDGET_FOLDERENTRY: rv.s = vik_file_entry_get_filename ( VIK_FILE_ENTRY(widget) ); break; case VIK_LAYER_WIDGET_FILELIST: diff --git a/src/uibuilder.h b/src/uibuilder.h index f7a4b07d..b9669c4e 100644 --- a/src/uibuilder.h +++ b/src/uibuilder.h @@ -58,6 +58,7 @@ VIK_LAYER_WIDGET_SPINBUTTON, VIK_LAYER_WIDGET_ENTRY, VIK_LAYER_WIDGET_PASSWORD, VIK_LAYER_WIDGET_FILEENTRY, +VIK_LAYER_WIDGET_FOLDERENTRY, VIK_LAYER_WIDGET_HSCALE, VIK_LAYER_WIDGET_COLOR, VIK_LAYER_WIDGET_COMBOBOX, diff --git a/src/vikfileentry.c b/src/vikfileentry.c index e151ef26..707fb015 100644 --- a/src/vikfileentry.c +++ b/src/vikfileentry.c @@ -34,6 +34,7 @@ struct _VikFileEntry { GtkHBox parent; GtkWidget *entry, *button; GtkWidget *file_selector; + GtkFileChooserAction action; }; GType vik_file_entry_get_type (void) @@ -60,11 +61,12 @@ GType vik_file_entry_get_type (void) return vs_type; } -GtkWidget *vik_file_entry_new () +GtkWidget *vik_file_entry_new (GtkFileChooserAction action) { VikFileEntry *vfe = VIK_FILE_ENTRY ( g_object_new ( VIK_FILE_ENTRY_TYPE, NULL ) ); vfe->entry = gtk_entry_new (); vfe->button = gtk_button_new_with_label ( _("Browse...") ); + vfe->action = action; g_signal_connect_swapped ( G_OBJECT(vfe->button), "clicked", G_CALLBACK(choose_file), vfe ); gtk_box_pack_start ( GTK_BOX(vfe), vfe->entry, TRUE, TRUE, 3 ); @@ -93,7 +95,7 @@ static void choose_file ( VikFileEntry *vfe ) g_assert ( (win = gtk_widget_get_toplevel(GTK_WIDGET(vfe))) ); vfe->file_selector = gtk_file_chooser_dialog_new (_("Choose file"), GTK_WINDOW(win), - GTK_FILE_CHOOSER_ACTION_OPEN, + vfe->action, /* open file or directory */ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); diff --git a/src/vikfileentry.h b/src/vikfileentry.h index a9f46c04..b83af580 100644 --- a/src/vikfileentry.h +++ b/src/vikfileentry.h @@ -44,7 +44,7 @@ struct _VikFileEntryClass GType vik_file_entry_get_type (); -GtkWidget *vik_file_entry_new (); +GtkWidget *vik_file_entry_new (GtkFileChooserAction action); G_CONST_RETURN 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 34947f34..9134e9f9 100644 --- a/src/vikgeoreflayer.c +++ b/src/vikgeoreflayer.c @@ -416,7 +416,7 @@ static gboolean georef_layer_dialog ( VikGeorefLayer **vgl, gpointer vp, GtkWind yspin = gtk_spin_button_new ( (GtkAdjustment *) gtk_adjustment_new ( 4, VIK_VIEWPORT_MIN_ZOOM, VIK_VIEWPORT_MAX_ZOOM, 1, 5, 5 ), 1, 8 ); imagelabel = gtk_label_new ( _("Map Image:") ); - imageentry = vik_file_entry_new (); + imageentry = vik_file_entry_new (GTK_FILE_CHOOSER_ACTION_OPEN); if (*vgl) { diff --git a/src/vikmapslayer.c b/src/vikmapslayer.c index 1021b3e8..5f722eb8 100644 --- a/src/vikmapslayer.c +++ b/src/vikmapslayer.c @@ -117,7 +117,7 @@ static VikLayerParamScale params_scales[] = { VikLayerParam maps_layer_params[] = { { "mode", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Map Type:"), VIK_LAYER_WIDGET_RADIOGROUP, NULL, NULL }, - { "directory", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Maps Directory (Optional):"), VIK_LAYER_WIDGET_FILEENTRY }, + { "directory", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Maps Directory (Optional):"), VIK_LAYER_WIDGET_FOLDERENTRY }, { "alpha", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Alpha:"), VIK_LAYER_WIDGET_HSCALE, params_scales }, { "autodownload", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Autodownload maps:"), VIK_LAYER_WIDGET_CHECKBUTTON }, { "mapzoom", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Zoom Level:"), VIK_LAYER_WIDGET_COMBOBOX, params_mapzooms }, -- 2.39.5