1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
3 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
5 * Copyright (C) 2011, Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include <glib/gprintf.h>
28 #include <glib/gi18n.h>
34 #include "geotag_exif.h"
39 GSList *filelist; // Files selected
40 } datasource_geotag_user_data_t;
42 /* The last used directory */
43 static gchar *last_folder_uri = NULL;
45 static gpointer datasource_geotag_init( );
46 static void datasource_geotag_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data );
47 static void datasource_geotag_get_cmd_string ( gpointer user_data, gchar **babelargs_or_shellcmd, gchar **inputfile_or_inputtype );
48 static gboolean datasource_geotag_process ( VikTrwLayer *vtl, const gchar *cmd, const gchar *extra, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw );
49 static void datasource_geotag_cleanup ( gpointer user_data );
51 VikDataSourceInterface vik_datasource_geotag_interface = {
52 N_("Create Waypoints from Geotagged Images"),
53 N_("Geotagged Images"),
54 VIK_DATASOURCE_INTERNAL,
55 VIK_DATASOURCE_ADDTOLAYER,
56 VIK_DATASOURCE_INPUTTYPE_NONE,
59 (VikDataSourceInitFunc) datasource_geotag_init,
60 (VikDataSourceCheckExistenceFunc) NULL,
61 (VikDataSourceAddSetupWidgetsFunc) datasource_geotag_add_setup_widgets,
62 (VikDataSourceGetCmdStringFunc) datasource_geotag_get_cmd_string,
63 (VikDataSourceProcessFunc) datasource_geotag_process,
64 (VikDataSourceProgressFunc) NULL,
65 (VikDataSourceAddProgressWidgetsFunc) NULL,
66 (VikDataSourceCleanupFunc) datasource_geotag_cleanup,
67 (VikDataSourceOffFunc) NULL,
76 /* See VikDataSourceInterface */
77 static gpointer datasource_geotag_init ( )
79 datasource_geotag_user_data_t *user_data = g_malloc(sizeof(datasource_geotag_user_data_t));
80 user_data->filelist = NULL;
84 /* See VikDataSourceInterface */
85 static void datasource_geotag_add_setup_widgets ( GtkWidget *dialog, VikViewport *vvp, gpointer user_data )
87 datasource_geotag_user_data_t *userdata = (datasource_geotag_user_data_t *)user_data;
91 /* The files selector */
92 userdata->files = gtk_file_chooser_widget_new ( GTK_FILE_CHOOSER_ACTION_OPEN );
94 // try to make it a nice size - otherwise seems to default to something impractically small
95 gtk_window_set_default_size ( GTK_WINDOW (dialog) , 600, 300 );
97 if ( last_folder_uri )
98 gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(userdata->files), last_folder_uri );
100 GtkFileChooser *chooser = GTK_FILE_CHOOSER ( userdata->files );
103 GtkFileFilter *filter;
104 filter = gtk_file_filter_new ();
105 gtk_file_filter_set_name ( filter, _("All") );
106 gtk_file_filter_add_pattern ( filter, "*" );
107 gtk_file_chooser_add_filter ( chooser, filter );
109 filter = gtk_file_filter_new ();
110 gtk_file_filter_set_name ( filter, _("JPG") );
111 gtk_file_filter_add_mime_type ( filter, "image/jpeg");
112 gtk_file_chooser_add_filter ( chooser, filter );
115 gtk_file_chooser_set_filter ( chooser, filter );
117 // Allow selecting more than one
118 gtk_file_chooser_set_select_multiple ( chooser, TRUE );
120 // Could add code to setup a default symbol (see dialog.c for symbol usage)
121 // Store in user_data type and then apply when creating the waypoints
122 // However not much point since these will have images associated with them!
124 /* Packing all widgets */
125 gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), userdata->files, TRUE, TRUE, 0 );
127 gtk_widget_show_all ( dialog );
130 static void datasource_geotag_get_cmd_string ( gpointer user_data, gchar **babelargs_or_shellcmd, gchar **inputfile_or_inputtype )
132 datasource_geotag_user_data_t *userdata = (datasource_geotag_user_data_t *)user_data;
133 /* Retrieve the files selected */
134 userdata->filelist = gtk_file_chooser_get_filenames ( GTK_FILE_CHOOSER(userdata->files) ); // Not reusable !!
136 /* Memorize the directory for later use */
137 g_free ( last_folder_uri );
138 last_folder_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(userdata->files) );
139 last_folder_uri = g_strdup ( last_folder_uri );
141 /* TODO Memorize the file filter for later use... */
142 //GtkFileFilter *filter = gtk_file_chooser_get_filter ( GTK_FILE_CHOOSER(userdata->files) );
144 // return some value so processing will continue
145 *babelargs_or_shellcmd = g_strdup ("fake command"); // Not really used, thus no translations
150 * Process selected files and try to generate waypoints storing them in the given vtl
152 static gboolean datasource_geotag_process ( VikTrwLayer *vtl, const gchar *cmd, const gchar *extra, BabelStatusFunc status_cb, acq_dialog_widgets_t *adw )
154 datasource_geotag_user_data_t *user_data = (datasource_geotag_user_data_t *)adw->user_data;
156 // Process selected files
157 // In prinicple this loading should be quite fast and so don't need to have any progress monitoring
158 GSList *cur_file = user_data->filelist;
160 gchar *filename = cur_file->data;
162 VikWaypoint *wp = a_geotag_create_waypoint_from_file ( filename, vik_viewport_get_coord_mode ( user_data->vvp ), &name );
164 // Create name if geotag method didn't return one
166 name = g_strdup ( a_file_basename ( filename ) );
167 vik_trw_layer_filein_add_waypoint ( vtl, name, wp );
171 g_warning ( _("Unable to create waypoint from %s"), filename );
174 cur_file = g_slist_next ( cur_file );
178 g_slist_free ( user_data->filelist );
184 /* See VikDataSourceInterface */
185 static void datasource_geotag_cleanup ( gpointer user_data )
187 g_free ( user_data );