#include "viking.h"
#include "vikmapsourcedefault.h"
+#include "vikutils.h"
#include "maputils.h"
#include "mapcache.h"
#include "background.h"
VikLayerParam maps_layer_params[] = {
{ VIK_LAYER_MAPS, "mode", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Map Type:"), VIK_LAYER_WIDGET_COMBOBOX, NULL, NULL, NULL, mode_default, NULL, NULL },
{ VIK_LAYER_MAPS, "directory", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Maps Directory:"), VIK_LAYER_WIDGET_FOLDERENTRY, NULL, NULL, NULL, directory_default, NULL, NULL },
- { VIK_LAYER_MAPS, "mapfile", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Map File:"), VIK_LAYER_WIDGET_FILEENTRY, NULL, NULL,
+ { VIK_LAYER_MAPS, "mapfile", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Map File:"), VIK_LAYER_WIDGET_FILEENTRY, GINT_TO_POINTER(VF_FILTER_MBTILES), NULL,
N_("An MBTiles file. Only applies when the map type method is 'MBTiles'"), file_default, NULL, NULL },
{ VIK_LAYER_MAPS, "alpha", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Alpha:"), VIK_LAYER_WIDGET_HSCALE, params_scales, NULL,
N_("Control the Alpha value for transparency effects"), alpha_default, NULL, NULL },
static void maps_layer_set_cache_dir ( VikMapsLayer *vml, const gchar *dir )
{
- guint len;
g_assert ( vml != NULL);
g_free ( vml->cache_dir );
vml->cache_dir = NULL;
mydir = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "maplayer_default_dir")->s;
}
+ gchar *canonical_dir = vu_get_canonical_filename ( VIK_LAYER(vml), mydir );
+
// Ensure cache_dir always ends with a separator
- len = strlen(mydir);
- if ( mydir[len-1] != G_DIR_SEPARATOR )
+ guint len = strlen(canonical_dir);
+ if ( canonical_dir[len-1] != G_DIR_SEPARATOR )
{
- vml->cache_dir = g_malloc ( len+2 );
- strncpy ( vml->cache_dir, mydir, len );
- vml->cache_dir[len] = G_DIR_SEPARATOR;
- vml->cache_dir[len+1] = '\0';
+ vml->cache_dir = g_strconcat ( canonical_dir, G_DIR_SEPARATOR_S, NULL );
+ g_free ( canonical_dir );
+ }
+ else {
+ vml->cache_dir = canonical_dir;
}
- else
- vml->cache_dir = g_strdup ( mydir );
maps_layer_mkdir_if_default_dir ( vml );
}
#endif
}
-static void download_onscreen_maps ( gpointer vml_vvp[2], gint redownload )
+// A slightly better way of defining the menu callback information
+// This should be easier to extend/rework compared to previously
+typedef enum {
+ MA_VML = 0,
+ MA_VVP,
+ MA_LAST
+} menu_array_index;
+
+typedef gpointer menu_array_values[MA_LAST];
+
+static void download_onscreen_maps ( menu_array_values values, gint redownload )
{
- VikMapsLayer *vml = vml_vvp[0];
- VikViewport *vvp = vml_vvp[1];
+ VikMapsLayer *vml = VIK_MAPS_LAYER(values[MA_VML]);
+ VikViewport *vvp = VIK_VIEWPORT(values[MA_VVP]);
VikViewportDrawMode vp_drawmode = vik_viewport_get_drawmode ( vvp );
gdouble xzoom = vml->xmapzoom ? vml->xmapzoom : vik_viewport_get_xmpp ( vvp );
}
-static void maps_layer_download_missing_onscreen_maps ( gpointer vml_vvp[2] )
+static void maps_layer_download_missing_onscreen_maps ( menu_array_values values )
{
- download_onscreen_maps( vml_vvp, REDOWNLOAD_NONE);
+ download_onscreen_maps( values, REDOWNLOAD_NONE);
}
-static void maps_layer_download_new_onscreen_maps ( gpointer vml_vvp[2] )
+static void maps_layer_download_new_onscreen_maps ( menu_array_values values )
{
- download_onscreen_maps( vml_vvp, REDOWNLOAD_NEW);
+ download_onscreen_maps( values, REDOWNLOAD_NEW);
}
-static void maps_layer_redownload_all_onscreen_maps ( gpointer vml_vvp[2] )
+static void maps_layer_redownload_all_onscreen_maps ( menu_array_values values )
{
- download_onscreen_maps( vml_vvp, REDOWNLOAD_ALL);
+ download_onscreen_maps( values, REDOWNLOAD_ALL);
}
static void maps_layers_about ( gpointer vml_vvp[2] )
* Get all maps in the region for zoom levels specified by the user
* Sort of similar to trw_layer_download_map_along_track_cb function
*/
-static void maps_layer_download_all ( gpointer vml_vvp[2] )
+static void maps_layer_download_all ( menu_array_values values )
{
- VikMapsLayer *vml = vml_vvp[0];
- VikViewport *vvp = vml_vvp[1];
+ VikMapsLayer *vml = VIK_MAPS_LAYER(values[MA_VML]);
+ VikViewport *vvp = VIK_VIEWPORT(values[MA_VVP]);
// I don't think we should allow users to hammer the servers too much...
// Delibrately not allowing lowest zoom levels
static void maps_layer_add_menu_items ( VikMapsLayer *vml, GtkMenu *menu, VikLayersPanel *vlp )
{
- static gpointer pass_along[2];
GtkWidget *item;
- pass_along[0] = vml;
- pass_along[1] = vik_layers_panel_get_viewport( VIK_LAYERS_PANEL(vlp) );
+ static menu_array_values values;
+ values[MA_VML] = vml;
+ values[MA_VVP] = vik_layers_panel_get_viewport( VIK_LAYERS_PANEL(vlp) );
item = gtk_menu_item_new();
gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item );
/* Now with icons */
item = gtk_image_menu_item_new_with_mnemonic ( _("Download _Missing Onscreen Maps") );
gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU) );
- g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_download_missing_onscreen_maps), pass_along );
+ g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_download_missing_onscreen_maps), values );
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show ( item );
if ( vik_map_source_supports_download_only_new (MAPS_LAYER_NTH_TYPE(vml->maptype)) ) {
item = gtk_image_menu_item_new_with_mnemonic ( _("Download _New Onscreen Maps") );
gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REDO, GTK_ICON_SIZE_MENU) );
- g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_download_new_onscreen_maps), pass_along );
+ g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_download_new_onscreen_maps), values );
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show ( item );
}
item = gtk_image_menu_item_new_with_mnemonic ( _("Reload _All Onscreen Maps") );
gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU) );
- g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_redownload_all_onscreen_maps), pass_along );
+ g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_redownload_all_onscreen_maps), values );
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show ( item );
item = gtk_image_menu_item_new_with_mnemonic ( _("Download Maps in _Zoom Levels...") );
gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_MENU) );
- g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_download_all), pass_along );
+ g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_download_all), values );
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show ( item );
item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_ABOUT, NULL );
- g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layers_about), pass_along );
+ g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layers_about), values );
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show ( item );
}
if ( !vml ) return;
if ( !vvp ) return;
- static gpointer pass_along[2];
- pass_along[0] = vml;
- pass_along[1] = vvp;
+ static menu_array_values values;
+ values[MA_VML] = vml;
+ values[MA_VVP] = vvp;
if ( only_new )
// Get only new maps
- maps_layer_download_new_onscreen_maps ( pass_along );
+ maps_layer_download_new_onscreen_maps ( values );
else
// Redownload everything
- maps_layer_redownload_all_onscreen_maps ( pass_along );
+ maps_layer_redownload_all_onscreen_maps ( values );
}