extern VikLayerInterface vik_georef_layer_interface;
extern VikLayerInterface vik_gps_layer_interface;
extern VikLayerInterface vik_dem_layer_interface;
+#ifdef HAVE_LIBMAPNIK
+extern VikLayerInterface vik_mapnik_layer_interface;
+#endif
enum {
VL_UPDATE_SIGNAL,
void vik_layer_emit_update ( VikLayer *vl )
{
if ( vl->visible && vl->realized ) {
+ GThread *thread = vik_window_get_thread ( VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vl)) );
+ if ( !thread )
+ // Do nothing
+ return;
+
vik_window_set_redraw_trigger(vl);
// Only ever draw when there is time to do so
- if ( g_thread_self() != vik_window_get_thread (VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vl))) )
+ if ( g_thread_self() != thread )
// Drawing requested from another (background) thread, so handle via the gdk thread method
gdk_threads_add_idle ( (GSourceFunc) idle_draw, vl );
else
&vik_gps_layer_interface,
&vik_maps_layer_interface,
&vik_dem_layer_interface,
+#ifdef HAVE_LIBMAPNIK
+ &vik_mapnik_layer_interface,
+#endif
};
VikLayerInterface *vik_layer_get_interface ( VikLayerTypeEnum type )
return l->name;
}
-VikLayer *vik_layer_create ( VikLayerTypeEnum type, VikViewport *vp, GtkWindow *w, gboolean interactive )
+time_t vik_layer_get_timestamp ( VikLayer *vl )
+{
+ if ( vik_layer_interfaces[vl->type]->get_timestamp )
+ return vik_layer_interfaces[vl->type]->get_timestamp ( vl );
+ return 0;
+}
+
+VikLayer *vik_layer_create ( VikLayerTypeEnum type, VikViewport *vp, gboolean interactive )
{
VikLayer *new_layer = NULL;
g_assert ( type < VIK_LAYER_NUM_TYPES );
g_byte_array_append ( b, (guint8 *)&len, sizeof(len) ); \
g_byte_array_append ( b, (guint8 *)(obj), len );
+ // Store the internal properties first
+ vlm_append(&vl->visible, sizeof(vl->visible));
vlm_append(vl->name, strlen(vl->name));
+ // Now the actual parameters
if ( params && get_param )
{
VikLayerParamData d;
#define vlm_read(obj) \
memcpy((obj), b+sizeof(gint), vlm_size); \
b += sizeof(gint) + vlm_size;
-
+
+ vlm_read(&vl->visible);
+
s = g_malloc(vlm_size + 1);
s[vlm_size]=0;
vlm_read(s);
-
vik_layer_rename(vl, s);
-
g_free(s);
if ( params && set_param )
{
- VikLayerParamData d;
+ VikLayerSetParam vlsp;
+ vlsp.vp = vvp;
+ vlsp.is_file_operation = FALSE;
guint16 i, params_count = vik_layer_get_interface(vl->type)->params_count;
for ( i = 0; i < params_count; i++ )
{
+ vlsp.id = i;
g_debug("%s: %s", __FUNCTION__, params[i].name);
switch ( params[i].type )
{
s = g_malloc(vlm_size + 1);
s[vlm_size]=0;
vlm_read(s);
- d.s = s;
- set_param(vl, i, d, vvp, FALSE);
+ vlsp.data.s = s;
+ set_param(vl, &vlsp);
g_free(s);
break;
case VIK_LAYER_PARAM_STRING_LIST: {
vlm_read(s);
list = g_list_append ( list, s );
}
- d.sl = list;
- set_param(vl, i, d, vvp, FALSE);
+ vlsp.data.sl = list;
+ set_param(vl, &vlsp);
/* don't free -- string list is responsibility of the layer */
break;
}
default:
- vlm_read(&d);
- set_param(vl, i, d, vvp, FALSE);
- break;
+ vlm_read(&vlsp.data);
+ set_param(vl, &vlsp);
+ break;
}
}
}
return NULL;
}
-gboolean vik_layer_set_param ( VikLayer *layer, guint16 id, VikLayerParamData data, gpointer vp, gboolean is_file_operation )
+gboolean vik_layer_set_param ( VikLayer *vl, VikLayerSetParam *vlsp )
{
- if ( vik_layer_interfaces[layer->type]->set_param )
- return vik_layer_interfaces[layer->type]->set_param ( layer, id, data, vp, is_file_operation );
+ if ( vik_layer_interfaces[vl->type]->set_param )
+ return vik_layer_interfaces[vl->type]->set_param ( vl, vlsp );
return FALSE;
}
vik_layer_interfaces[vl->type]->params_count,
vik_layer_interfaces[vl->type]->params_groups,
vik_layer_interfaces[vl->type]->params_groups_count,
- (gpointer) vik_layer_interfaces[vl->type]->set_param,
+ (gpointer) vik_layer_interfaces[vl->type]->set_param,
+ NULL,
vl,
vp,
(gpointer) vik_layer_interfaces[vl->type]->get_param,
vl->vvp = vvp;
VikLayerInterface *vli = vik_layer_get_interface ( vl->type );
const gchar *layer_name = vli->fixed_layer_name;
- VikLayerParamData data;
+ VikLayerSetParam vlsp;
+ vlsp.is_file_operation = TRUE; // Possibly come from a file
+ vlsp.vp = vvp;
int i;
for ( i = 0; i < vli->params_count; i++ ) {
+ vlsp.id = i;
// Ensure parameter is for use
if ( vli->params[i].group > VIK_LAYER_NOT_IN_PROPERTIES ) {
// ATM can't handle string lists
// only DEM files uses this currently
if ( vli->params[i].type != VIK_LAYER_PARAM_STRING_LIST ) {
- data = a_layer_defaults_get ( layer_name, vli->params[i].name, vli->params[i].type );
- vik_layer_set_param ( vl, i, data, vvp, TRUE ); // Possibly come from a file
+ vlsp.data = a_layer_defaults_get ( layer_name, vli->params[i].name, vli->params[i].type );
+ vik_layer_set_param ( vl, &vlsp );
}
}
}