summaryrefslogtreecommitdiffstats
path: root/gps.c
diff options
context:
space:
mode:
Diffstat (limited to 'gps.c')
-rw-r--r--gps.c73
1 files changed, 59 insertions, 14 deletions
diff --git a/gps.c b/gps.c
index e0771ae76..87c8a99ea 100644
--- a/gps.c
+++ b/gps.c
@@ -2,6 +2,7 @@
/* Creates the UI displaying the dives locations on a map.
*/
#include <glib/gi18n.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
#include "osm-gps-map.h"
@@ -10,7 +11,10 @@
#include "display-gtk.h"
#include "divelist.h"
-static OsmGpsMapSource_t opt_map_provider = OSM_GPS_MAP_SOURCE_OPENSTREETMAP;
+/* Several map providers are available, such as OSM_GPS_MAP_SOURCE_OPENSTREETMAP
+ and OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE. We should make more of
+ them available from e.g. a pull-down menu */
+static OsmGpsMapSource_t opt_map_provider = OSM_GPS_MAP_SOURCE_GOOGLE_STREET;
static void on_close (GtkWidget *widget, gpointer user_data)
@@ -27,15 +31,11 @@ static void add_gps_point(OsmGpsMap *map, float latitude, float longitude)
}
-void show_gps_locations()
+OsmGpsMap *init_map()
{
- GtkWidget *window;
-
OsmGpsMap *map;
OsmGpsMapLayer *osd;
char *cachedir, *cachebasedir;
- int idx;
- struct dive *dp;
cachebasedir = osm_gps_map_get_default_cache_directory();
cachedir = g_strdup(OSM_GPS_MAP_CACHE_AUTO);
@@ -59,14 +59,12 @@ void show_gps_locations()
osm_gps_map_layer_add(OSM_GPS_MAP(map), osd);
g_object_unref(G_OBJECT(osd));
- for (idx = 0; idx < dive_table.nr; idx++) {
- dp = dive_table.dives[idx];
- if (dp->latitude.udeg != 0 && dp->longitude.udeg != 0){
- add_gps_point(map, dp->latitude.udeg / 1000000.0,
- dp->longitude.udeg / 1000000.0);
- }
- }
- osm_gps_map_set_center_and_zoom(map, 0, 0, 0);
+ return map;
+}
+
+void show_map(OsmGpsMap *map)
+{
+ GtkWidget *window;
/* Enable keyboard navigation */
osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_FULLSCREEN, GDK_F11);
@@ -89,3 +87,50 @@ void show_gps_locations()
gtk_widget_show_all (window);
}
+
+void show_gps_location(struct dive *dp)
+{
+ OsmGpsMap *map;
+ GError *gerror = NULL;
+ GdkPixbuf *picture;
+
+ double lat = dp->latitude.udeg / 1000000.0;
+ double lng = dp->longitude.udeg / 1000000.0;
+
+ map = init_map();
+
+ if (lat != 0 || lng != 0) {
+ add_gps_point(map, lat, lng);
+ osm_gps_map_set_center_and_zoom(map, lat, lng, 8);
+ picture = gdk_pixbuf_new_from_file("./flag.png", &gerror);
+ if (picture) {
+ osm_gps_map_image_add_with_alignment(map, lat, lng, picture, 0, 1);
+ } else {
+ printf("error message: %s\n", gerror->message);
+ }
+
+ } else {
+ osm_gps_map_set_center_and_zoom(map, 0, 0, 2);
+ }
+ show_map(map);
+}
+
+void show_gps_locations()
+{
+ OsmGpsMap *map;
+ struct dive *dp;
+ int idx;
+
+ map = init_map();
+
+ for (idx = 0; idx < dive_table.nr; idx++) {
+ dp = dive_table.dives[idx];
+ if (dp->latitude.udeg != 0 || dp->longitude.udeg != 0){
+ add_gps_point(map, dp->latitude.udeg / 1000000.0,
+ dp->longitude.udeg / 1000000.0);
+ }
+ }
+ osm_gps_map_set_center_and_zoom(map, 0, 0, 2);
+
+ show_map(map);
+}