--- trunk/src/map-tool.c 2009/08/07 07:57:33 48 +++ trunk/src/map-tool.c 2009/08/13 12:01:52 55 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Till Harbaum . + * Copyright (C) 2008-2009 Till Harbaum . * * This file is part of GPXView. * @@ -24,6 +24,7 @@ #include "osm-gps-map.h" #endif +#define MAP_SOURCE OSM_GPS_MAP_SOURCE_OPENSTREETMAP #define GPS_DEFAULT_ZOOM 13 /* equatorial radius in meters */ @@ -88,8 +89,10 @@ zoom = osm_gps_map_set_zoom(map, zoom+step); /* enable/disable zoom buttons as required */ - gtk_widget_set_sensitive(context->zoomin, zoom<17); - gtk_widget_set_sensitive(context->zoomout, zoom>1); + gtk_widget_set_sensitive(context->zoomin, + zoom < osm_gps_map_source_get_max_zoom(MAP_SOURCE)); + gtk_widget_set_sensitive(context->zoomout, + zoom > osm_gps_map_source_get_min_zoom(MAP_SOURCE)); /* save new zoom */ context->appdata->map.zoom = zoom; @@ -123,11 +126,10 @@ } static GtkWidget -*map_add_button(const gchar *icon, GCallback cb, gpointer data, +*map_add_button(int icon, GCallback cb, gpointer data, char *tooltip) { GtkWidget *button = gtk_button_new(); - gtk_button_set_image(GTK_BUTTON(button), - gtk_image_new_from_stock(icon, GTK_ICON_SIZE_BUTTON)); + gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_MISC, icon)); g_signal_connect(button, "clicked", cb, data); #ifndef USE_MAEMO gtk_widget_set_tooltip_text(button, tooltip); @@ -135,15 +137,39 @@ return button; } +static int dist2pixel(map_context_t *context, float km, float lat) { + return 1000.0*km/osm_gps_map_get_scale(OSM_GPS_MAP(context->widget)); +} + static gboolean map_gps_update(gpointer data) { map_context_t *context = (map_context_t*)data; + /* get reference position ... */ pos_t *refpos = get_pos(context->appdata); gboolean ok = (refpos!= NULL) && !isnan(refpos->lat) && !isnan(refpos->lon); - /* get reference position and go there */ + /* ... and enable "goto" button if it's valid */ gtk_widget_set_sensitive(context->gps, ok); + if(ok) { + float heading = NAN; + int radius = 0; + + if(context->appdata->use_gps) { + heading = gps_get_heading(context->appdata); + + /* get error */ + float eph = gps_get_eph(context->appdata); + if(!isnan(eph)) + radius = dist2pixel(context, eph/1000, refpos->lat); + } + + g_object_set(context->widget, "gps-track-highlight-radius", radius, NULL); + osm_gps_map_draw_gps(OSM_GPS_MAP(context->widget), + refpos->lat, refpos->lon, heading); + } else + osm_gps_map_clear_gps(OSM_GPS_MAP(context->widget)); + return TRUE; } @@ -195,6 +221,7 @@ appdata_t *appdata; GtkWidget *window; GMainLoop *loop; + cache_t *cache; } popup_context_t; /* draw shape */ @@ -205,7 +232,7 @@ #define POPUP_WIDTH 300 #define POPUP_HEIGHT 100 #else -#define POPUP_WIDTH 350 +#define POPUP_WIDTH 360 #define POPUP_HEIGHT 120 #endif @@ -366,9 +393,16 @@ } #endif +static gboolean +on_cache_button_clicked(GtkButton *button, popup_context_t *context) { + printf("clicked %s\n", context->cache->name); + return FALSE; +} + void cache_popup(map_context_t *mcontext, cache_t *cache) { popup_context_t pcontext; pcontext.appdata = mcontext->appdata; + pcontext.cache = cache; pcontext.window = gtk_window_new(GTK_WINDOW_POPUP); gtk_widget_realize(pcontext.window); @@ -434,19 +468,23 @@ /* --- actual content ---- */ GtkWidget *vbox = gtk_vbox_new(FALSE, 0); + GtkWidget *hbox = gtk_hbox_new(FALSE, 0); - if(cache->id) { - GtkWidget *ihbox = gtk_hbox_new(FALSE, 0); - - gtk_box_pack_start(GTK_BOX(ihbox), - icon_get_widget(ICON_CACHE_TYPE, cache->type), - FALSE, FALSE, 5); + gtk_box_pack_start(GTK_BOX(hbox), + icon_get_widget(ICON_CACHE_TYPE, cache->type), + FALSE, FALSE, 5); + + if(cache->id) + gtk_box_pack_start_defaults(GTK_BOX(hbox), + gtk_label_big_left_new(cache->id)); - gtk_box_pack_start_defaults(GTK_BOX(ihbox), - gtk_label_big_left_new(cache->id)); + GtkWidget *button = gtk_button_new(); + gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_MISC, 12)); + g_signal_connect(button, "clicked", + G_CALLBACK(on_cache_button_clicked), &pcontext); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); - gtk_box_pack_start_defaults(GTK_BOX(vbox), ihbox); - } + gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox); if(cache->name) { GtkWidget *label = gtk_label_small_left_new(cache->name); @@ -454,7 +492,7 @@ gtk_box_pack_start_defaults(GTK_BOX(vbox), label); } - GtkWidget *hbox = gtk_hbox_new(FALSE, 0); + hbox = gtk_hbox_new(FALSE, 0); if(cache->terrain) { GtkWidget *ihbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(ihbox), @@ -549,17 +587,6 @@ return pos; } -static int dist2pixel(map_context_t *context, float km, float lat) { - gint zoom; - g_object_get(OSM_GPS_MAP(context->widget), "zoom", &zoom, NULL); - - /* world at zoom 1 == 512 pixels */ - float m_per_pix = - cos(DEG2RAD(lat))*2*M_PI*EQ_RADIUS/(1<<(8+zoom)); - - return 1000.0*km/m_per_pix; -} - #define CLICK_FUZZ (24) static gboolean @@ -650,9 +677,12 @@ const char *proxy = get_proxy_uri(appdata); context->widget = g_object_new(OSM_TYPE_GPS_MAP, - "repo-uri", MAP_SOURCE_OPENSTREETMAP, - "tile-cache", path, - proxy?"proxy-uri":NULL, proxy, + "map-source", MAP_SOURCE, + "tile-cache", path, + "auto-center", FALSE, + "record-trip-history", FALSE, + "show-trip-history", FALSE, + proxy?"proxy-uri":NULL, proxy, NULL); g_free(path); @@ -711,17 +741,17 @@ GtkWidget *vbox = gtk_vbox_new(FALSE,0); context->zoomin = - map_add_button(GTK_STOCK_ZOOM_IN, G_CALLBACK(cb_map_zoomin), + map_add_button(10, G_CALLBACK(cb_map_zoomin), context, _("Zoom in")); gtk_box_pack_start(GTK_BOX(vbox), context->zoomin, FALSE, FALSE, 0); context->zoomout = - map_add_button(GTK_STOCK_ZOOM_OUT, G_CALLBACK(cb_map_zoomout), + map_add_button(11, G_CALLBACK(cb_map_zoomout), context, _("Zoom out")); gtk_box_pack_start(GTK_BOX(vbox), context->zoomout, FALSE, FALSE, 0); context->gps = - map_add_button(GTK_STOCK_HOME, G_CALLBACK(cb_map_gps), + map_add_button(9, G_CALLBACK(cb_map_gps), context, _("Jump to GPS position")); gtk_widget_set_sensitive(context->gps, FALSE); /* install handler for timed updates of the gps button */