summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dive.h1
-rw-r--r--divelist.c11
-rw-r--r--flag.pngbin0 -> 4314 bytes
-rw-r--r--gps.c73
4 files changed, 71 insertions, 14 deletions
diff --git a/dive.h b/dive.h
index 08d3aae8d..1cb0613ee 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 e6fb710b5..c190d7d38 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);
@@ -2470,6 +2475,10 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int
g_signal_connect(menuitem, "activate", G_CALLBACK(edit_dive_from_path_cb), path);
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);
+
/* only offer trip editing options when we are displaying the tree model */
if (dive_list.model == dive_list.treemodel) {
int depth = gtk_tree_path_get_depth(path);
@@ -2503,9 +2512,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/flag.png b/flag.png
new file mode 100644
index 000000000..56b3ce421
--- /dev/null
+++ b/flag.png
Binary files differ
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);
+}