*
* Copyright (C) 2005, Alex Foobarian <foobarian@gmail.com>
* Copyright (C) 2003-2007, Evan Battaglia <gtoevan@gmx.net>
+ * Copyright (C) 2013, Rob Norris <rw_norris@hotmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
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, gpointer 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 );
}
/* returns TRUE if OK was pressed */
-gboolean vik_layer_properties ( VikLayer *layer, gpointer vp )
+gboolean vik_layer_properties ( VikLayer *layer, VikViewport *vp )
{
if ( vik_layer_interfaces[layer->type]->properties )
return vik_layer_interfaces[layer->type]->properties ( layer, vp );
return vik_layer_properties_factory ( layer, vp );
}
-void vik_layer_draw ( VikLayer *l, gpointer data )
+void vik_layer_draw ( VikLayer *l, VikViewport *vp )
{
if ( l->visible )
if ( vik_layer_interfaces[l->type]->draw )
- vik_layer_interfaces[l->type]->draw ( l, data );
+ vik_layer_interfaces[l->type]->draw ( l, vp );
}
void vik_layer_change_coord_mode ( VikLayer *l, VikCoordMode mode )
}
typedef struct {
- gint layer_type;
+ VikLayerTypeEnum layer_type;
gint len;
guint8 data[0];
} header_t;
d = get_param(vl, i, FALSE);
switch ( params[i].type )
{
- case VIK_LAYER_PARAM_STRING:
- vlm_append(d.s, strlen(d.s));
- break;
-
+ case VIK_LAYER_PARAM_STRING:
+ // Remember need braces as these are macro calls, not single statement functions!
+ if ( d.s ) {
+ vlm_append(d.s, strlen(d.s));
+ }
+ else {
+ // Need to insert empty string otherwise the unmarshall will get confused
+ vlm_append("", 0);
+ }
+ break;
/* print out the string list in the array */
case VIK_LAYER_PARAM_STRING_LIST: {
GList *list = d.sl;
vl,
vp,
(gpointer) vik_layer_interfaces[vl->type]->get_param,
- vl) ) {
+ vl,
+ (gpointer) vik_layer_interfaces[vl->type]->change_param ) ) {
case 0:
case 3:
return FALSE;
*/
void vik_layer_set_defaults ( VikLayer *vl, VikViewport *vvp )
{
+ // Sneaky initialize of the viewport value here
+ vl->vvp = vvp;
VikLayerInterface *vli = vik_layer_get_interface ( vl->type );
const gchar *layer_name = vli->fixed_layer_name;
VikLayerParamData data;
// 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, FALSE );
+ vik_layer_set_param ( vl, i, data, vvp, TRUE ); // Possibly come from a file
}
}
}