]> git.street.me.uk Git - andy/viking.git/blob - src/datasource_file.c
Scale waypoint icons to give large or small icons as necessary.
[andy/viking.git] / src / datasource_file.c
1 /*
2  * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
3  *
4  * Copyright (C) 2011, Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24 #include <string.h>
25
26 #include <glib/gprintf.h>
27 #include <glib/gi18n.h>
28
29 #include <gtk/gtk.h>
30
31 #include "viking.h"
32 #include "babel.h"
33 #include "gpx.h"
34 #include "acquire.h"
35
36 typedef struct {
37   GtkWidget *file;
38   GtkWidget *type;
39 } datasource_file_widgets_t;
40
41 /* The last used directory */
42 static gchar *last_folder_uri = NULL;
43
44 /* The last used file filter */
45 /* Nb: we use a complex strategy for this because the UI is rebuild each
46  time, so it is not possible to reuse directly the GtkFileFilter as they are
47  differents. */
48 static BabelFile *last_file_filter = NULL;
49
50 /* The last file format selected */
51 static int last_type = 0;
52
53 static gpointer datasource_file_init( );
54 static void datasource_file_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data );
55 static void datasource_file_get_cmd_string ( datasource_file_widgets_t *widgets, gchar **cmd, gchar **input_file_type );        
56 static void datasource_file_cleanup ( gpointer data );
57
58 VikDataSourceInterface vik_datasource_file_interface = {
59   N_("Import file with GPSBabel"),
60   N_("Imported file"),
61   VIK_DATASOURCE_GPSBABEL_DIRECT,
62   VIK_DATASOURCE_ADDTOLAYER,
63   VIK_DATASOURCE_INPUTTYPE_NONE,
64   TRUE,
65   TRUE,
66   (VikDataSourceInitFunc)               datasource_file_init,
67   (VikDataSourceCheckExistenceFunc)     NULL,
68   (VikDataSourceAddSetupWidgetsFunc)    datasource_file_add_setup_widgets,
69   (VikDataSourceGetCmdStringFunc)       datasource_file_get_cmd_string,
70   (VikDataSourceProgressFunc)           NULL,
71   (VikDataSourceAddProgressWidgetsFunc) NULL,
72   (VikDataSourceCleanupFunc)            datasource_file_cleanup,
73   (VikDataSourceOffFunc)                NULL,
74 };
75
76 /* See VikDataSourceInterface */
77 static gpointer datasource_file_init ( )
78 {
79   datasource_file_widgets_t *widgets = g_malloc(sizeof(*widgets));
80   return widgets;
81 }
82
83 static void fill_combo_box (gpointer data, gpointer user_data)
84 {
85   const gchar *label = ((BabelFile*) data)->label;
86 #if GTK_CHECK_VERSION (2,24,0)
87   GtkComboBoxText *combo = GTK_COMBO_BOX_TEXT (user_data);
88   gtk_combo_box_text_append_text (combo, label);
89 #else
90   GtkComboBox *combo = GTK_COMBO_BOX (user_data);
91   gtk_combo_box_append_text (combo, label);
92 #endif
93 }
94
95 static void add_file_filter (gpointer data, gpointer user_data)
96 {
97   GtkFileChooser *chooser = GTK_FILE_CHOOSER ( user_data );
98   const gchar *label = ((BabelFile*) data)->label;
99   const gchar *ext = ((BabelFile*) data)->ext;
100   if ( ext == NULL || ext[0] == '\0' )
101     /* No file extension => no filter */
102         return;
103   gchar *pattern = g_strdup_printf ( "*.%s", ext );
104
105   GtkFileFilter *filter = gtk_file_filter_new ();
106   gtk_file_filter_add_pattern ( filter, pattern );
107   if ( strstr ( label, pattern+1 ) ) {
108     gtk_file_filter_set_name ( filter, label );
109   } else {
110     /* Ensure displayed label contains file pattern */
111         /* NB: we skip the '*' in the pattern */
112         gchar *name = g_strdup_printf ( "%s (%s)", label, pattern+1 );
113     gtk_file_filter_set_name ( filter, name );
114         g_free ( name );
115   }
116   g_object_set_data ( G_OBJECT(filter), "Babel", data );
117   gtk_file_chooser_add_filter ( chooser, filter );
118   if ( last_file_filter == data )
119     /* Previous selection used this filter */
120     gtk_file_chooser_set_filter ( chooser, filter );
121
122   g_free ( pattern );
123 }
124
125 /* See VikDataSourceInterface */
126 static void datasource_file_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data )
127 {
128   datasource_file_widgets_t *widgets = (datasource_file_widgets_t *)user_data;
129   GtkWidget *filename_label, *type_label;
130
131   /* The file selector */
132   filename_label = gtk_label_new (_("File:"));
133   widgets->file = gtk_file_chooser_button_new (_("File to import"), GTK_FILE_CHOOSER_ACTION_OPEN);
134   if (last_folder_uri)
135     gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(widgets->file), last_folder_uri);
136   /* Add filters */
137   g_list_foreach ( a_babel_file_list, add_file_filter, widgets->file );
138   GtkFileFilter *all_filter = gtk_file_filter_new ();
139   gtk_file_filter_add_pattern ( all_filter, "*" );
140   gtk_file_filter_set_name ( all_filter, _("All files") );
141   gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER(widgets->file), all_filter );
142   if ( last_file_filter == NULL )
143     /* No previously selected filter or 'All files' selected */
144     gtk_file_chooser_set_filter ( GTK_FILE_CHOOSER(widgets->file), all_filter );
145
146   /* The file format selector */
147   type_label = gtk_label_new (_("File type:"));
148 #if GTK_CHECK_VERSION (2,24,0)
149   widgets->type = gtk_combo_box_text_new ();
150 #else
151   widgets->type = gtk_combo_box_new_text ();
152 #endif
153   g_list_foreach (a_babel_file_list, fill_combo_box, widgets->type);
154   gtk_combo_box_set_active (GTK_COMBO_BOX (widgets->type), last_type);
155
156   /* Packing all these widgets */
157   gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), filename_label, FALSE, FALSE, 5 );
158   gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), widgets->file, FALSE, FALSE, 5 );
159   gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), type_label, FALSE, FALSE, 5 );
160   gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), widgets->type, FALSE, FALSE, 5 );
161   gtk_widget_show_all(dialog);
162 }
163
164 /* See VikDataSourceInterface */
165 static void datasource_file_get_cmd_string ( datasource_file_widgets_t *widgets, gchar **cmd, gchar **input_file )
166 {
167   gchar *filename, *type;
168
169   /* Retrieve the file selected */
170   filename = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(widgets->file) );
171
172   /* Memorize the directory for later use */
173   g_free (last_folder_uri);
174   last_folder_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(widgets->file) );
175   last_folder_uri = g_strdup (last_folder_uri);
176
177   /* Memorize the file filter for later use */
178   GtkFileFilter *filter = gtk_file_chooser_get_filter ( GTK_FILE_CHOOSER(widgets->file) );
179   last_file_filter = g_object_get_data ( G_OBJECT(filter), "Babel" );
180
181   /* Retrieve and memorize file format selected */
182   last_type = gtk_combo_box_get_active ( GTK_COMBO_BOX (widgets->type) );
183   type = ((BabelFile*)g_list_nth_data (a_babel_file_list, last_type))->name;
184
185   /* Build the string */
186   *cmd = g_strdup_printf( "-i %s", type);
187   *input_file = g_strdup(filename);
188
189   /* Free memory */
190   g_free (filename);
191
192   g_debug(_("using babel args '%s' and file '%s'"), *cmd, *input_file);
193 }
194
195 /* See VikDataSourceInterface */
196 static void datasource_file_cleanup ( gpointer data )
197 {
198   g_free ( data );
199 }
200