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/

Reply via email to