[PATCH] Show single dives in map.

subsurface at henrik.synth.no subsurface at henrik.synth.no
Tue Jan 15 13:01:55 PST 2013


From: Henrik Brautaset Aronsen <subsurface at henrik.synth.no>

This adds a "Show in map" entry in the dive list context menu.  It will
zoom to the dive location if it exists, otherwise the full map will be
displayed.

I've also switched map tiles from OpenStreetMap to Google Maps just to
show off that we can.

Signed-off-by: Henrik Brautaset Aronsen <subsurface at henrik.synth.no>
---

Ignore the previous patch.  It only showed the "show in map" entry for selected dives.
That's fixed here.

Henrik


 dive.h     |  1 +
 divelist.c | 12 ++++++++++++
 gps.c      | 63 ++++++++++++++++++++++++++++++++++++++++++++++++--------------
 3 files changed, 62 insertions(+), 14 deletions(-)

diff --git a/dive.h b/dive.h
index 28ea799..449092e 100644
--- a/dive.h
+++ b/dive.h
@@ -500,6 +500,7 @@ extern void show_dive_stats(struct dive *);
 extern void clear_stats_widgets(void);
 
 extern void show_gps_locations(void);
+extern void show_gps_location(struct dive *);
 
 extern void show_yearly_stats(void);
 
diff --git a/divelist.c b/divelist.c
index e6fb710..7088c02 100644
--- a/divelist.c
+++ b/divelist.c
@@ -1659,6 +1659,11 @@ void edit_dive_when_cb(GtkWidget *menuitem, struct dive *dive)
 	}
 }
 
+static void show_gps_location_cb(GtkWidget *menuitem, struct dive *dive)
+{
+	show_gps_location(dive);
+}
+
 static void expand_all_cb(GtkWidget *menuitem, GtkTreeView *tree_view)
 {
 	gtk_tree_view_expand_all(tree_view);
@@ -2440,6 +2445,11 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int
 				menuitem = gtk_menu_item_new_with_label(_("Edit dive date/time"));
 				g_signal_connect(menuitem, "activate", G_CALLBACK(edit_dive_when_cb), dive);
 				gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
+				menuitem = gtk_menu_item_new_with_label(_("Show in map"));
+				g_signal_connect(menuitem, "activate", G_CALLBACK(show_gps_location_cb), dive);
+				gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
 			} else {
 				deletelabel = _(deleteplurallabel);
 				editlabel = _(editplurallabel);
@@ -2503,9 +2513,11 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int
 	menuitem = gtk_menu_item_new_with_label(_("Expand all"));
 	g_signal_connect(menuitem, "activate", G_CALLBACK(expand_all_cb), tree_view);
 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
 	menuitem = gtk_menu_item_new_with_label(_("Collapse all"));
 	g_signal_connect(menuitem, "activate", G_CALLBACK(collapse_all_cb), tree_view);
 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
 	gtk_widget_show_all(menu);
 
 	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
diff --git a/gps.c b/gps.c
index e0771ae..7cdc941 100644
--- a/gps.c
+++ b/gps.c
@@ -10,7 +10,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 +30,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 +58,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 +86,41 @@ void show_gps_locations()
 
 	gtk_widget_show_all (window);
 }
+
+void show_gps_location(struct dive *dp)
+{
+	OsmGpsMap *map;
+
+	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);
+	} 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);
+}
-- 
1.8.0.1



More information about the subsurface mailing list