One feature that I would like is to be able to get waypoints from the web, like
geocaching.com, into viking easier. This patch is a proof of concept for that.
It adds a menu option for track/waypoint layers to be able to auto append loc
and gpx files from a specified directory. The user just needs to download the
waypoint to that directory and viking gobbles it up automatically and puts in
the specified layer.
If this is of interest, I could add more polish to it.
Eric
>From 9920b418f62e36f7daef1b18746d60b6249341ce Mon Sep 17 00:00:00 2001
From: eric <crc1...@gmail.com>
Date: Wed, 15 Jul 2009 21:17:26 -0500
Subject: [testtest] added ability to auto append gpx and loc files as they appear in a directory
Signed-off-by: eric <crc1...@gmail.com>
---
src/dialog.c | 167 ++++++++++++++++++++++++++++++++++++-----------------
src/dialog.h | 2 +
src/file.c | 32 ++++++++++-
src/file.h | 1 +
src/viktrwlayer.c | 161 ++++++++++++++++++++++++++++++++++++++-------------
5 files changed, 267 insertions(+), 96 deletions(-)
diff --git a/src/dialog.c b/src/dialog.c
index a3c4bdb..2de0674 100644
--- a/src/dialog.c
+++ b/src/dialog.c
@@ -756,3 +756,64 @@ gboolean a_dialog_map_n_zoom(GtkWindow *parent, gchar *mapnames[], gint default_
gtk_widget_destroy(dialog);
return TRUE;
}
+
+
+gint a_dialog_auto_append ( GtkWindow *parent, gboolean enable_stop, gchar **dir, gchar **patterns)
+{
+ gint resp;
+ gint ret = 0;
+ GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Auto Append"),
+ parent,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ GTK_STOCK_STOP,
+ GTK_RESPONSE_NO,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_ACCEPT,
+ NULL);
+ GtkWidget *dirlabel, *direntry, *patlabel, *patentry, *warninglabel;
+
+ gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_NO, enable_stop);
+
+ if (*patterns == NULL)
+ *patterns = g_strdup("*.gpx;*.loc");
+
+ dirlabel = gtk_label_new (_("Directory:"));
+ direntry = gtk_entry_new ();
+ patlabel = gtk_label_new (_("Patterns:"));
+ patentry = gtk_entry_new ();
+ warninglabel = gtk_label_new(_("\nWarning:\nthis will delete files after appending!\n"));
+
+ g_signal_connect_swapped ( direntry, "activate", G_CALLBACK(a_dialog_response_accept), GTK_DIALOG(dialog) );
+ direntry = gtk_entry_new ();
+
+ gtk_entry_set_text ( GTK_ENTRY(direntry), *dir);
+ gtk_entry_set_text ( GTK_ENTRY(patentry), *patterns);
+
+ gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), dirlabel, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), direntry, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), patlabel, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), patentry, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), warninglabel, FALSE, FALSE, 0);
+
+ gtk_widget_show_all ( GTK_DIALOG(dialog)->vbox );
+
+ resp = gtk_dialog_run ( GTK_DIALOG(dialog) );
+ if ( resp == GTK_RESPONSE_ACCEPT ) {
+ /* FIXME check that directory exits, and good stuff like that */
+ if (*dir)
+ g_free(*dir);
+ *dir = g_strdup(gtk_entry_get_text(GTK_ENTRY(direntry)));
+ if (*patterns)
+ g_free(*patterns);
+ *patterns = g_strdup(gtk_entry_get_text(GTK_ENTRY(patentry)));
+ ret = 1;
+ }
+ else if (resp == GTK_RESPONSE_NO) {
+ ret = -1;
+ }
+
+ gtk_widget_destroy ( dialog );
+ return ret;
+}
diff --git a/src/dialog.h b/src/dialog.h
index 7a8d77f..091cf40 100644
--- a/src/dialog.h
+++ b/src/dialog.h
@@ -64,4 +64,6 @@ void a_dialog_choose_dir ( GtkWidget *entry );
gboolean a_dialog_map_n_zoom(GtkWindow *parent, gchar *mapnames[], gint default_map, gchar *zoom_list[], gint default_zoom, gint *selected_map, gint *selected_zoom);
GList *a_dialog_select_from_list ( GtkWindow *parent, GHashTable *tracks, GList *track_names, gboolean multiple_selection_allowed, const gchar *title, const gchar *msg );
+
+gint a_dialog_auto_append ( GtkWindow *parent, gboolean enable_stop, gchar **dir, gchar **patterns);
#endif
diff --git a/src/file.c b/src/file.c
index 3c30c30..91be079 100644
--- a/src/file.c
+++ b/src/file.c
@@ -589,6 +589,34 @@ gshort a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar *filen
}
}
+
+/* 0 on failure, 2 on success */
+gshort a_file_append_to_layer ( VikTrwLayer *vtl, VikViewport *vp, const gchar *filename )
+{
+ VikCoord new_center;
+ FILE *f = xfopen ( filename, "r" );
+
+ if ( ! f )
+ return 0;
+
+ if ( check_magic ( f, VIK_MAGIC ) )
+ return 0;
+
+ if ( check_magic ( f, GPX_MAGIC ) )
+ a_gpx_read_file ( VIK_TRW_LAYER(vtl), f );
+ else
+ a_gpspoint_read_file ( VIK_TRW_LAYER(vtl), f );
+
+ vik_layer_post_read ( VIK_LAYER(vtl), vp, TRUE );
+
+ if ( vik_trw_layer_find_center ( VIK_TRW_LAYER(vtl), &new_center ) )
+ vik_viewport_set_center_coord ( VIK_VIEWPORT(vp), &new_center );
+ xfclose(f);
+ return 2;
+}
+
+
+
gboolean a_file_save ( VikAggregateLayer *top, gpointer vp, const gchar *filename )
{
FILE *f = g_fopen(filename, "w");
diff --git a/src/file.h b/src/file.h
index 5c06c4a..aa8d949 100644
--- a/src/file.h
+++ b/src/file.h
@@ -36,6 +36,7 @@ const gchar *a_file_basename ( const gchar *filename );
/* 0 on failure, 1 on success (vik file) 2 on success (other file) */
gshort a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar *filename );
+gshort a_file_append_to_layer ( VikTrwLayer *vtl, VikViewport *vp, const gchar *filename );
gboolean a_file_save ( VikAggregateLayer *top, gpointer vp, const gchar *filename );
gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, gshort file_type );
const gchar *a_get_viking_dir();
diff --git a/src/viktrwlayer.c b/src/viktrwlayer.c
index a28c7cd..85a5edb 100644
--- a/src/viktrwlayer.c
+++ b/src/viktrwlayer.c
@@ -45,6 +45,7 @@
#endif
#include "acquire.h"
#include "util.h"
+#include "file.h"
#include "icons/icons.h"
@@ -184,6 +185,10 @@ struct _VikTrwLayer {
VikStdLayerMenuItem menu_selection;
gint highest_wp_number;
+
+ gchar* auto_append_dir;
+ gchar* auto_append_patterns;
+ gboolean auto_append_on;
};
/* A caached waypoint image. */
@@ -1707,6 +1712,75 @@ static void trw_layer_new_wp ( gpointer lav[2] )
vik_layers_panel_emit_update ( vlp );
}
+static gboolean trw_layer_auto_append_timer(VikTrwLayer *vtl)
+{
+ GDir* dir;
+ VikWindow *vw = (VikWindow *)(VIK_GTK_WINDOW_FROM_LAYER(vtl));
+ VikViewport *vvp = vik_window_viewport(vw);
+ gchar** glob_list;
+
+ if (vtl->auto_append_on == FALSE)
+ return FALSE;
+ dir = g_dir_open(vtl->auto_append_dir, 0, NULL);
+ if (dir == NULL) {
+ /* FIXME signal user */
+ vtl->auto_append_on = FALSE;
+ return FALSE;
+ }
+
+ glob_list = g_strsplit(vtl->auto_append_patterns, ";", 0);
+ while (1) {
+ const gchar* filename = g_dir_read_name(dir);
+ gchar* full_path;
+
+ if (filename == NULL)
+ break;
+ else {
+ gchar** glob_list2 = glob_list;
+ gboolean match = FALSE;
+ while (*glob_list2 != NULL && !match) {
+ match = g_pattern_match_simple(*glob_list2, filename);
+ glob_list2++;
+ }
+ if (!match)
+ continue;
+ }
+
+ full_path = g_strconcat(vtl->auto_append_dir, "/", filename, NULL);
+ if (a_file_append_to_layer(vtl, vvp, full_path) == 2)
+ g_unlink(full_path);
+ else {
+ vtl->auto_append_on = FALSE;
+ /* FIXME signal user */
+ }
+ g_free(full_path);
+ }
+ g_strfreev(glob_list);
+
+ g_dir_close(dir);
+ return TRUE;
+}
+
+static void trw_layer_auto_append ( gpointer lav[2] )
+{
+ VikTrwLayer *vtl = VIK_TRW_LAYER(lav[0]);
+ //VikLayersPanel *vlp = VIK_LAYERS_PANEL(lav[1]);
+ gint ret = a_dialog_auto_append(VIK_GTK_WINDOW_FROM_LAYER(vtl),
+ vtl->auto_append_on,
+ &vtl->auto_append_dir,
+ &vtl->auto_append_patterns);
+ if (ret > 0) {
+ if (vtl->auto_append_on == FALSE) {
+ g_timeout_add_seconds(1, (GSourceFunc) trw_layer_auto_append_timer, vtl);
+ }
+ vtl->auto_append_on = TRUE;
+ }
+ else if (ret < 0) {
+ vtl->auto_append_on = FALSE;
+ }
+}
+
+
void vik_trw_layer_add_menu_items ( VikTrwLayer *vtl, GtkMenu *menu, gpointer vlp )
{
static gpointer pass_along[2];
@@ -1751,6 +1825,11 @@ void vik_trw_layer_add_menu_items ( VikTrwLayer *vtl, GtkMenu *menu, gpointer vl
gtk_menu_shell_append (GTK_MENU_SHELL (export_submenu), item);
gtk_widget_show ( item );
+ item = gtk_menu_item_new_with_label ( _("Auto Append") );
+ g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_auto_append), pass_along );
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show ( item );
+
item = gtk_menu_item_new_with_label ( _("New Waypoint") );
g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_new_wp), pass_along );
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
--
1.6.3.3
------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge
This is your chance to win up to $100,000 in prizes! For a limited time,
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Viking-devel mailing list
Viking-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/viking-devel
Viking home page: http://viking.sf.net/