/******** MAPZOOMS *********/
-static gchar *params_mapzooms[] = { N_("Use Viking Zoom Level"), "0.25", "1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", "USGS 10k", "USGS 24k", "USGS 25k", "USGS 50k", "USGS 100k", "USGS 200k", "USGS 250k", NULL };
-static gdouble __mapzooms_x[] = { 0.0, 0.25, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 1.016, 2.4384, 2.54, 5.08, 10.16, 20.32, 25.4 };
-static gdouble __mapzooms_y[] = { 0.0, 0.25, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 1.016, 2.4384, 2.54, 5.08, 10.16, 20.32, 25.4 };
+static gchar *params_mapzooms[] = { N_("Use Viking Zoom Level"), "0.25", "0.5", "1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", "USGS 10k", "USGS 24k", "USGS 25k", "USGS 50k", "USGS 100k", "USGS 200k", "USGS 250k", NULL };
+static gdouble __mapzooms_x[] = { 0.0, 0.25, 0.5, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 1.016, 2.4384, 2.54, 5.08, 10.16, 20.32, 25.4 };
+static gdouble __mapzooms_y[] = { 0.0, 0.25, 0.5, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 1.016, 2.4384, 2.54, 5.08, 10.16, 20.32, 25.4 };
#define NUM_MAPZOOMS (sizeof(params_mapzooms)/sizeof(params_mapzooms[0]) - 1)
enum { PARAM_MAPTYPE=0, PARAM_CACHE_DIR, PARAM_ALPHA, PARAM_AUTODOWNLOAD, PARAM_MAPZOOM, NUM_PARAMS };
static VikToolInterface maps_tools[] = {
- { N_("Maps Download"), (VikToolConstructorFunc) maps_layer_download_create, NULL, NULL, NULL,
- (VikToolMouseFunc) maps_layer_download_click, NULL, (VikToolMouseFunc) maps_layer_download_release,
- (VikToolKeyFunc) NULL, GDK_CURSOR_IS_PIXMAP, &cursor_mapdl_pixbuf },
+ { { "MapsDownload", "vik-icon-Maps Download", N_("_Maps Download"), NULL, N_("Maps Download"), 0 },
+ (VikToolConstructorFunc) maps_layer_download_create,
+ NULL,
+ NULL,
+ NULL,
+ (VikToolMouseFunc) maps_layer_download_click,
+ NULL,
+ (VikToolMouseFunc) maps_layer_download_release,
+ NULL,
+ FALSE,
+ GDK_CURSOR_IS_PIXMAP, &cursor_mapdl_pixbuf },
};
VikLayerInterface vik_maps_layer_interface = {
+ "Map",
N_("Map"),
+ "<control><shift>M",
&vikmapslayer_pixbuf,
maps_tools,
(VikLayerFuncSublayerToggleVisible) NULL,
(VikLayerFuncSublayerTooltip) NULL,
(VikLayerFuncLayerTooltip) maps_layer_tooltip,
+ (VikLayerFuncLayerSelected) NULL,
(VikLayerFuncMarshall) maps_layer_marshall,
(VikLayerFuncUnmarshall) maps_layer_unmarshall,
(VikLayerFuncPasteItem) NULL,
(VikLayerFuncFreeCopiedItem) NULL,
(VikLayerFuncDragDropRequest) NULL,
+
+ (VikLayerFuncSelectClick) NULL,
+ (VikLayerFuncSelectMove) NULL,
+ (VikLayerFuncSelectRelease) NULL,
+ (VikLayerFuncSelectedViewportMenu) NULL,
};
struct _VikMapsLayer {
params_maptypes[index] = g_strdup (label);
}
+/**
+ * maps_layer_register_map_source:
+ * @map: the new VikMapSource
+ *
+ * Register a new VikMapSource.
+ * Override existing one (equality of id).
+ */
void maps_layer_register_map_source ( VikMapSource *map )
{
g_assert(map != NULL);
/******** CACHE DIR STUFF ***************/
/****************************************/
+#define DIRECTDIRACCESS "%s%d" G_DIR_SEPARATOR_S "%d" G_DIR_SEPARATOR_S "%d%s"
#define DIRSTRUCTURE "%st%ds%dz%d" G_DIR_SEPARATOR_S "%d" G_DIR_SEPARATOR_S "%d"
#define MAPS_CACHE_DIR maps_layer_default_dir()
#include <io.h>
#define GLOBAL_MAPS_DIR "C:\\VIKING-MAPS\\"
#define LOCAL_MAPS_DIR "VIKING-MAPS"
+#elif defined __APPLE__
+#include <stdlib.h>
+#define GLOBAL_MAPS_DIR "/Library/cache/Viking/maps/"
+#define LOCAL_MAPS_DIR "/Library/Application Support/Viking/viking-maps"
#else /* POSIX */
#include <stdlib.h>
#define GLOBAL_MAPS_DIR "/var/cache/maps/"
int idx;
VikMapsLayer *vml = VIK_MAPS_LAYER ( g_object_new ( VIK_MAPS_LAYER_TYPE, NULL ) );
vik_layer_init ( VIK_LAYER(vml), VIK_LAYER_MAPS );
- idx = map_uniq_id_to_index(13); /* 13 is id for OSM Mapnik maps */
+ idx = map_uniq_id_to_index(19); /* 19 is id for OSM MapQuest maps */
vml->maptype = (idx < NUM_MAP_TYPES) ? idx : 0;
+ vml->maptype = (idx < NUM_MAP_TYPES) ? idx : 0;
vml->alpha = 255;
vml->mapzoom_id = 0;
vml->dl_tool_x = vml->dl_tool_y = -1;
g_free ( vml->cache_dir );
vml->cache_dir = NULL;
if ( vml->dl_right_click_menu )
- gtk_object_sink ( GTK_OBJECT(vml->dl_right_click_menu) );
+ g_object_ref_sink ( G_OBJECT(vml->dl_right_click_menu) );
g_free(vml->last_center);
vml->last_center = NULL;
}
mode, mapcoord->scale, vml->alpha, xshrinkfactor, yshrinkfactor );
if ( ! pixbuf ) {
- g_snprintf ( filename_buf, buf_len, DIRSTRUCTURE,
- vml->cache_dir, mode,
- mapcoord->scale, mapcoord->z, mapcoord->x, mapcoord->y );
+ if ( vik_map_source_is_direct_file_access (MAPS_LAYER_NTH_TYPE(vml->maptype)) )
+ g_snprintf ( filename_buf, buf_len, DIRECTDIRACCESS,
+ vml->cache_dir, (17 - mapcoord->scale), mapcoord->x, mapcoord->y, ".png" );
+ else
+ g_snprintf ( filename_buf, buf_len, DIRSTRUCTURE,
+ vml->cache_dir, mode,
+ mapcoord->scale, mapcoord->z, mapcoord->x, mapcoord->y );
+
if ( g_file_test ( filename_buf, G_FILE_TEST_EXISTS ) == TRUE)
{
GError *gx = NULL;
gdouble xzoom = vik_viewport_get_xmpp ( vvp );
gdouble yzoom = vik_viewport_get_ympp ( vvp );
gdouble xshrinkfactor = 1.0, yshrinkfactor = 1.0;
- gdouble existence_only = FALSE;
+ gboolean existence_only = FALSE;
if ( vml->xmapzoom && (vml->xmapzoom != xzoom || vml->ymapzoom != yzoom) ) {
xshrinkfactor = vml->xmapzoom / xzoom;
gdouble xx, yy; gint xx_tmp, yy_tmp;
gint base_yy, xend, yend;
- GdkGC *black_gc = GTK_WIDGET(vvp)->style->black_gc;
-
xend = (xinc == 1) ? (xmax+1) : (xmin-1);
yend = (yinc == 1) ? (ymax+1) : (ymin-1);
ulm.y = y;
if ( existence_only ) {
- g_snprintf ( path_buf, max_path_len, DIRSTRUCTURE,
- vml->cache_dir, mode,
- ulm.scale, ulm.z, ulm.x, ulm.y );
+ if ( vik_map_source_is_direct_file_access (MAPS_LAYER_NTH_TYPE(vml->maptype)) )
+ g_snprintf ( path_buf, max_path_len, DIRECTDIRACCESS,
+ vml->cache_dir, (17 - ulm.scale), ulm.x, ulm.y, ".png" );
+ else
+ g_snprintf ( path_buf, max_path_len, DIRSTRUCTURE,
+ vml->cache_dir, mode,
+ ulm.scale, ulm.z, ulm.x, ulm.y );
if ( g_file_test ( path_buf, G_FILE_TEST_EXISTS ) == TRUE ) {
+ GdkGC *black_gc = GTK_WIDGET(vvp)->style->black_gc;
vik_viewport_draw_line ( vvp, black_gc, xx+tilesize_x_ceil, yy, xx, yy+tilesize_y_ceil );
}
} else {
VikCoord ul, br;
/* Copyright */
- const gchar *copyright = vik_map_source_get_copyright ( MAPS_LAYER_NTH_TYPE(vml->maptype) );
- vik_viewport_add_copyright ( vvp, copyright );
+ gdouble level = vik_viewport_get_zoom ( vvp );
+ LatLonBBox bbox;
+ vik_viewport_get_min_max_lat_lon ( vvp, &bbox.south, &bbox.north, &bbox.west, &bbox.east );
+ vik_map_source_get_copyright ( MAPS_LAYER_NTH_TYPE(vml->maptype), bbox, level, vik_viewport_add_copyright, vvp );
/* Logo */
const GdkPixbuf *logo = vik_map_source_get_logo ( MAPS_LAYER_NTH_TYPE(vml->maptype) );
continue;
}
- gdk_threads_enter();
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 );
if (mdi->refresh_display && mdi->map_layer_alive) {
/* TODO: check if it's on visible area */
- vik_layer_emit_update ( VIK_LAYER(mdi->vml) );
+ vik_layer_emit_update ( VIK_LAYER(mdi->vml), TRUE ); // Yes update display from background
}
g_mutex_unlock(mdi->mutex);
- gdk_threads_leave();
mdi->mapcoord.x = mdi->mapcoord.y = 0; /* we're temporarily between downloads */
}
gdouble yzoom = vml->ymapzoom ? vml->ymapzoom : vik_viewport_get_ympp ( vvp );
MapCoord ulm, brm;
VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+
+ // Don't ever attempt download on direct access
+ if ( vik_map_source_is_direct_file_access ( map ) )
+ return;
+
if ( vik_map_source_coord_to_mapcoord ( map, ul, xzoom, yzoom, &ulm )
&& vik_map_source_coord_to_mapcoord ( map, br, xzoom, yzoom, &brm ) )
{
}
}
-void maps_layer_download_section_without_redraw( VikMapsLayer *vml, VikViewport *vvp, VikCoord *ul, VikCoord *br, gdouble zoom)
+void maps_layer_download_section ( VikMapsLayer *vml, VikViewport *vvp, VikCoord *ul, VikCoord *br, gdouble zoom)
{
MapCoord ulm, brm;
VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+ // Don't ever attempt download on direct access
+ if ( vik_map_source_is_direct_file_access ( map ) )
+ return;
+
if (!vik_map_source_coord_to_mapcoord(map, ul, zoom, zoom, &ulm)
|| !vik_map_source_coord_to_mapcoord(map, br, zoom, zoom, &brm)) {
g_warning("%s() coord_to_mapcoord() failed", __PRETTY_FUNCTION__);
mdi->vvp = vvp;
mdi->map_layer_alive = TRUE;
mdi->mutex = g_mutex_new();
- mdi->refresh_display = FALSE;
+ mdi->refresh_display = TRUE;
mdi->cache_dir = g_strdup ( vml->cache_dir );
mdi->maxlen = strlen ( vml->cache_dir ) + 40;
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show ( item );
}
+
+/**
+ * Enable downloading maps of the current screen area either 'new' or 'everything'
+ */
+void vik_maps_layer_download ( VikMapsLayer *vml, VikViewport *vvp, gboolean only_new )
+{
+ if ( !vml ) return;
+ if ( !vvp ) return;
+
+ static gpointer pass_along[2];
+ pass_along[0] = vml;
+ pass_along[1] = vvp;
+
+ if ( only_new )
+ // Get only new maps
+ maps_layer_download_new_onscreen_maps ( pass_along );
+ else
+ // Redownload everything
+ maps_layer_redownload_all_onscreen_maps ( pass_along );
+}