X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/a8c22c3fc71674ff141f59be5addac159bf89a06..e8bab170981ff0e1cd572107ca4de122d4aafe8c:/src/vikmapslayer.c diff --git a/src/vikmapslayer.c b/src/vikmapslayer.c index ff4d2c35..213f06fc 100644 --- a/src/vikmapslayer.c +++ b/src/vikmapslayer.c @@ -55,6 +55,7 @@ #include "icons/icons.h" #include "metatile.h" #include "ui_util.h" +#include "map_ids.h" #ifdef HAVE_SQLITE3_H #include "sqlite3.h" @@ -126,7 +127,7 @@ static VikLayerParamScale params_scales[] = { { 0, 255, 3, 0 }, /* alpha */ }; -static VikLayerParamData id_default ( void ) { return VIK_LPD_UINT ( 19 ); } // OSM MapQuest maps +static VikLayerParamData id_default ( void ) { return VIK_LPD_UINT ( MAP_ID_MAPQUEST_OSM ); } static VikLayerParamData directory_default ( void ) { VikLayerParamData data; @@ -411,9 +412,40 @@ void maps_layer_register_map_source ( VikMapSource *map ) #define MAPS_LAYER_NTH_ID(n) (params_maptypes_ids[n]) #define MAPS_LAYER_NTH_TYPE(n) (VIK_MAP_SOURCE(g_list_nth_data(__map_types, (n)))) -gint vik_maps_layer_get_map_type(VikMapsLayer *vml) +/** + * vik_maps_layer_get_map_type: + * + * Returns the actual map id (rather than the internal type index value) + */ +guint vik_maps_layer_get_map_type(VikMapsLayer *vml) +{ + return MAPS_LAYER_NTH_ID(vml->maptype); +} + +/** + * vik_maps_layer_set_map_type: + * + */ +void vik_maps_layer_set_map_type(VikMapsLayer *vml, guint map_type) +{ + gint maptype = map_uniq_id_to_index(map_type); + if ( maptype == NUM_MAP_TYPES ) + g_warning(_("Unknown map type")); + else + vml->maptype = maptype; +} + +/** + * vik_maps_layer_get_default_map_type: + * + */ +guint vik_maps_layer_get_default_map_type () { - return(vml->maptype); + VikLayerInterface *vli = vik_layer_get_interface ( VIK_LAYER_MAPS ); + VikLayerParamData vlpd = a_layer_defaults_get ( vli->fixed_layer_name, "mode", VIK_LAYER_PARAM_UINT ); + if ( vlpd.u == 0 ) + vlpd = id_default(); + return vlpd.u; } gchar *vik_maps_layer_get_map_label(VikMapsLayer *vml) @@ -833,6 +865,7 @@ static VikMapsLayer *maps_layer_unmarshall( guint8 *data, gint len, VikViewport { VikMapsLayer *rv = maps_layer_new ( vvp ); vik_layer_unmarshall_params ( VIK_LAYER(rv), data, len, vvp ); + maps_layer_post_read ( VIK_LAYER(rv), vvp, FALSE ); return rv; } @@ -1013,7 +1046,7 @@ static GdkPixbuf *pixbuf_apply_settings ( GdkPixbuf *pixbuf, VikMapsLayer *vml, pixbuf = pixbuf_shrink ( pixbuf, xshrinkfactor, yshrinkfactor ); if ( pixbuf ) - a_mapcache_add ( pixbuf, mapcoord->x, mapcoord->y, + a_mapcache_add ( pixbuf, (mapcache_extra_t) {0.0}, mapcoord->x, mapcoord->y, mapcoord->z, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(vml->maptype)), mapcoord->scale, vml->alpha, xshrinkfactor, yshrinkfactor, vml->filename ); @@ -1600,7 +1633,7 @@ static int map_download_thread ( MapDownloadInfo *mdi, gpointer threaddata ) g_mutex_lock(mdi->mutex); if (remove_mem_cache) - a_mapcache_remove_all_shrinkfactors ( x, y, mdi->mapcoord.z, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)), mdi->mapcoord.scale ); + a_mapcache_remove_all_shrinkfactors ( x, y, mdi->mapcoord.z, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)), mdi->mapcoord.scale, mdi->vml->filename ); if (mdi->refresh_display && mdi->map_layer_alive) { /* TODO: check if it's on visible area */ vik_layer_emit_update ( VIK_LAYER(mdi->vml) ); // NB update display from background @@ -1723,7 +1756,8 @@ static void start_download_thread ( VikMapsLayer *vml, VikViewport *vvp, const V g_object_weak_ref(G_OBJECT(mdi->vml), weak_ref_cb, mdi); /* launch the thread */ - a_background_thread ( VIK_GTK_WINDOW_FROM_LAYER(vml), /* parent window */ + a_background_thread ( BACKGROUND_POOL_REMOTE, + VIK_GTK_WINDOW_FROM_LAYER(vml), /* parent window */ tmp, /* description string */ (vik_thr_func) map_download_thread, /* function to call within thread */ mdi, /* pass along data */ @@ -1807,14 +1841,16 @@ static void maps_layer_download_section ( VikMapsLayer *vml, VikViewport *vvp, V tmp = g_strdup_printf ( fmt, mdi->mapstoget, MAPS_LAYER_NTH_LABEL(vml->maptype) ); g_object_weak_ref(G_OBJECT(mdi->vml), weak_ref_cb, mdi); - /* launch the thread */ - a_background_thread ( VIK_GTK_WINDOW_FROM_LAYER(vml), /* parent window */ - tmp, /* description string */ - (vik_thr_func) map_download_thread, /* function to call within thread */ - mdi, /* pass along data */ - (vik_thr_free_func) mdi_free, /* function to free pass along data */ - (vik_thr_free_func) mdi_cancel_cleanup, - mdi->mapstoget ); + + // launch the thread + a_background_thread ( BACKGROUND_POOL_REMOTE, + VIK_GTK_WINDOW_FROM_LAYER(vml), /* parent window */ + tmp, /* description string */ + (vik_thr_func) map_download_thread, /* function to call within thread */ + mdi, /* pass along data */ + (vik_thr_free_func) mdi_free, /* function to free pass along data */ + (vik_thr_free_func) mdi_cancel_cleanup, + mdi->mapstoget ); g_free ( tmp ); } else @@ -1866,7 +1902,6 @@ static void maps_layer_tile_info ( VikMapsLayer *vml ) return; gchar *filename = NULL; - gchar *message = NULL; gchar *source = NULL; if ( vik_map_source_is_direct_file_access ( map ) ) { @@ -1890,10 +1925,10 @@ static void maps_layer_tile_info ( VikMapsLayer *vml ) exists = g_strdup ( _("NO") ); gint flip_y = (gint) pow(2, zoom)-1 - ulm.y; // NB Also handles .jpg automatically due to pixbuf_new_from () support - although just print png for now. - source = g_strdup_printf ( "%s (%d%s%d%s%d.%s %s)", filename, zoom, G_DIR_SEPARATOR_S, ulm.x, G_DIR_SEPARATOR_S, flip_y, "png", exists ); + source = g_strdup_printf ( "Source: %s (%d%s%d%s%d.%s %s)", filename, zoom, G_DIR_SEPARATOR_S, ulm.x, G_DIR_SEPARATOR_S, flip_y, "png", exists ); g_free ( exists ); #else - source = g_strdup ( _("Not available") ); + source = g_strdup ( _("Source: Not available") ); #endif } else if ( vik_map_source_is_osm_meta_tiles ( map ) ) { @@ -1910,7 +1945,7 @@ static void maps_layer_tile_info ( VikMapsLayer *vml ) NULL, ulm.scale, ulm.z, ulm.x, ulm.y, filename, max_path_len, vik_map_source_get_file_extension(map) ); - source = g_strconcat ( "file://", filename, NULL ); + source = g_strconcat ( "Source: file://", filename, NULL ); } } else { @@ -1921,32 +1956,42 @@ static void maps_layer_tile_info ( VikMapsLayer *vml ) vik_map_source_get_name(map), ulm.scale, ulm.z, ulm.x, ulm.y, filename, max_path_len, vik_map_source_get_file_extension(map) ); - source = g_strdup_printf ( "http://%s%s", + source = g_strdup_printf ( "Source: http://%s%s", vik_map_source_default_get_hostname ( VIK_MAP_SOURCE_DEFAULT(map) ), vik_map_source_default_get_uri ( VIK_MAP_SOURCE_DEFAULT(map), &ulm ) ); } - if ( g_file_test ( filename, G_FILE_TEST_EXISTS ) ) { + GArray *array = g_array_new (FALSE, TRUE, sizeof(gchar*)); + g_array_append_val ( array, source ); + gchar *filemsg = NULL; + gchar *timemsg = NULL; + + if ( g_file_test ( filename, G_FILE_TEST_EXISTS ) ) { + filemsg = g_strconcat ( "Tile File: ", filename, NULL ); // Get some timestamp information of the tile struct stat stat_buf; if ( g_stat ( filename, &stat_buf ) == 0 ) { gchar time_buf[64]; strftime ( time_buf, sizeof(time_buf), "%c", gmtime((const time_t *)&stat_buf.st_mtime) ); - message = g_strdup_printf ( _("\nSource: %s\n\nTile File: %s\nTile File Timestamp: %s"), source, filename, time_buf ); + timemsg = g_strdup_printf ( _("Tile File Timestamp: %s"), time_buf ); } else { - message = g_strdup_printf ( _("\nSource: %s\n\nTile File: %s\nTile File Timestamp: Not Available"), source, filename ); + timemsg = g_strdup ( _("Tile File Timestamp: Not Available") ); } - // Show the info - a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), message ); + g_array_append_val ( array, filemsg ); + g_array_append_val ( array, timemsg ); } else { - message = g_strdup_printf ( _("\nSource: %s\n\nTile File: %s [Not Available]"), source, filename ); - a_dialog_warning_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), message ); + filemsg = g_strdup_printf ( "Tile File: %s [Not Available]", filename ); + g_array_append_val ( array, filemsg ); } - g_free ( message ); + a_dialog_list ( VIK_GTK_WINDOW_FROM_LAYER(vml), _("Tile Information"), array, 5 ); + g_array_free ( array, FALSE ); + + g_free ( timemsg ); + g_free ( filemsg ); g_free ( source ); g_free ( filename ); } @@ -2363,6 +2408,15 @@ static void maps_layer_download_all ( menu_array_values values ) } } +/** + * + */ +static void maps_layer_flush ( menu_array_values values ) +{ + VikMapsLayer *vml = VIK_MAPS_LAYER(values[MA_VML]); + a_mapcache_flush_type ( vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(vml->maptype)) ); +} + static void maps_layer_add_menu_items ( VikMapsLayer *vml, GtkMenu *menu, VikLayersPanel *vlp ) { GtkWidget *item; @@ -2405,6 +2459,15 @@ static void maps_layer_add_menu_items ( VikMapsLayer *vml, GtkMenu *menu, VikLay g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_about), values ); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show ( item ); + + // Typical users shouldn't need to use this functionality - so debug only ATM + if ( vik_debug ) { + item = gtk_image_menu_item_new_with_mnemonic ( _("Flush Map Cache") ); + gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU) ); + g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_flush), values ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show ( item ); + } } /**