--- trunk/src/map-tool.c 2009/08/12 19:20:00 54 +++ trunk/src/map-tool.c 2009/08/14 12:19:45 56 @@ -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 */ @@ -32,17 +33,6 @@ #define RAD2DEG(a) (((a)*180.0)/M_PI) #define DEG2RAD(a) (((a)*M_PI)/180.0) -typedef struct { - appdata_t *appdata; - GtkWidget *widget; - GtkWidget *zoomin, *zoomout, *gps; - gint handler_id; - cache_t *press_on; -#if MAEMO_VERSION_MAJOR == 5 - GtkWidget *old_view; -#endif -} map_context_t; - #define PROXY_KEY "/system/http_proxy/" static const char *get_proxy_uri(appdata_t *appdata) { @@ -88,8 +78,13 @@ 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)); + + /* hmm ... this doesn't really work */ + osm_gps_map_osd_speed(map, zoom); /* save new zoom */ context->appdata->map.zoom = zoom; @@ -134,6 +129,10 @@ 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; @@ -153,16 +152,8 @@ /* get error */ float eph = gps_get_eph(context->appdata); - if(!isnan(eph)) { - - /* world at zoom 1 == 512 pixels */ - gint zoom; - g_object_get(OSM_GPS_MAP(context->widget), "zoom", &zoom, NULL); - float m_per_pix = - cos(DEG2RAD(refpos->lat))*2*M_PI*EQ_RADIUS/(1<<(8+zoom)); - - radius = eph/m_per_pix; - } + if(!isnan(eph)) + radius = dist2pixel(context, eph/1000, refpos->lat); } g_object_set(context->widget, "gps-track-highlight-radius", radius, NULL); @@ -222,6 +213,7 @@ appdata_t *appdata; GtkWidget *window; GMainLoop *loop; + cache_t *cache; } popup_context_t; /* draw shape */ @@ -232,7 +224,7 @@ #define POPUP_WIDTH 300 #define POPUP_HEIGHT 100 #else -#define POPUP_WIDTH 350 +#define POPUP_WIDTH 360 #define POPUP_HEIGHT 120 #endif @@ -393,9 +385,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); @@ -461,19 +460,25 @@ /* --- 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(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(GTK_BOX(ihbox), - icon_get_widget(ICON_CACHE_TYPE, cache->type), - FALSE, FALSE, 5); - - gtk_box_pack_start_defaults(GTK_BOX(ihbox), - gtk_label_big_left_new(cache->id)); +#if 0 + 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); +#endif - 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); @@ -481,7 +486,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), @@ -576,17 +581,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 @@ -640,7 +634,11 @@ return FALSE; } -static void save_map_state(map_context_t *context) { +static void on_window_destroy(GtkWidget *widget, map_context_t *context) { + appdata_t *appdata = context->appdata; + + printf("destroy map window\n"); + /* save map parameters */ OsmGpsMap *map = OSM_GPS_MAP(context->widget); gint zoom; @@ -651,24 +649,28 @@ g_object_get(map, "latitude", &lat, "longitude", &lon, NULL); context->appdata->map.pos.lat = lat; context->appdata->map.pos.lon = lon; -} #if MAEMO_VERSION_MAJOR == 5 -static void on_window_destroy(GtkWidget *widget, map_context_t *context) { - printf("destroy map view\n"); - - save_map_state(context); - /* restore cur_view */ context->appdata->cur_view = context->old_view; +#endif gtk_timeout_remove(context->handler_id); + g_free(context); + appdata->map.context = NULL; } -#endif void map(appdata_t *appdata) { - map_context_t *context = g_new0(map_context_t, 1); + map_context_t *context = NULL; + + /* if the map window already exists, just raise it */ + if(appdata->map.context) { + gtk_window_present(GTK_WINDOW(appdata->map.context->window)); + return; + } + + context = appdata->map.context = g_new0(map_context_t, 1); context->appdata = appdata; GtkWidget *hbox = gtk_hbox_new(FALSE, 0); @@ -677,16 +679,14 @@ const char *proxy = get_proxy_uri(appdata); context->widget = g_object_new(OSM_TYPE_GPS_MAP, - "repo-uri", MAP_SOURCE_OPENSTREETMAP, - "tile-cache", path, - "auto-center", FALSE, - "record-trip-history", FALSE, - "show-trip-history", FALSE, + "map-source", MAP_SOURCE, + "tile-cache", path, + "auto-center", FALSE, + "record-trip-history", FALSE, + "show-trip-history", FALSE, + proxy?"proxy-uri":NULL, proxy, NULL); - if(proxy) - g_object_set(OSM_GPS_MAP(context->widget), "proxy-uri", proxy, NULL); - g_free(path); char *name = NULL; @@ -710,21 +710,20 @@ char *title = g_strdup_printf(_("Map - %s"), name); g_free(name); -#if MAEMO_VERSION_MAJOR == 5 - GtkWidget *window = hildon_stackable_window_new(); - gtk_window_set_title(GTK_WINDOW(window), title); +#ifdef USE_MAEMO +#ifdef USE_STACKABLE_WINDOW + context->window = hildon_stackable_window_new(); #else - GtkWidget *dialog = gtk_dialog_new_with_buttons(title, - GTK_WINDOW(appdata->window), - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - NULL); - -#ifndef USE_MAEMO - gtk_window_set_default_size(GTK_WINDOW(dialog), 640, 480); + context->window = hildon_window_new(); +#endif #else - gtk_window_set_default_size(GTK_WINDOW(dialog), 800, 480); + context->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); #endif + + gtk_window_set_title(GTK_WINDOW(context->window), title); + +#ifndef USE_MAEMO + gtk_window_set_default_size(GTK_WINDOW(context->window), 640, 480); #endif g_free(title); @@ -756,6 +755,7 @@ 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 */ context->handler_id = gtk_timeout_add(1000, map_gps_update, context); gtk_box_pack_start(GTK_BOX(vbox), context->gps, FALSE, FALSE, 0); @@ -766,21 +766,11 @@ /* prevent some of the main screen things */ context->old_view = appdata->cur_view; appdata->cur_view = NULL; +#endif - g_signal_connect(G_OBJECT(window), "destroy", + g_signal_connect(G_OBJECT(context->window), "destroy", G_CALLBACK(on_window_destroy), context); - gtk_container_add(GTK_CONTAINER(window), hbox); - gtk_widget_show_all(GTK_WIDGET(window)); - -#else - gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox); - gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE); - gtk_widget_show_all(dialog); - gtk_dialog_run(GTK_DIALOG(dialog)); - save_map_state(context); - gtk_timeout_remove(context->handler_id); - gtk_widget_destroy(dialog); - g_free(context); -#endif + gtk_container_add(GTK_CONTAINER(context->window), hbox); + gtk_widget_show_all(GTK_WIDGET(context->window)); }