*
* 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 );
}
typedef struct {
- gint layer_type;
+ VikLayerTypeEnum layer_type;
gint len;
guint8 data[0];
} header_t;
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;
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;
#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;
+ vlsp.dirpath = NULL;
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) ) {
+ 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;
+ VikLayerSetParam vlsp;
+ vlsp.is_file_operation = TRUE; // Possibly come from a file
+ vlsp.dirpath = NULL;
+ 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, FALSE );
+ vlsp.data = a_layer_defaults_get ( layer_name, vli->params[i].name, vli->params[i].type );
+ vik_layer_set_param ( vl, &vlsp );
}
}
}
}
+
+/**
+ * Make the layer more accessible within the treeview
+ */
+void vik_layer_expand_tree ( VikLayer *vl )
+{
+ vik_treeview_expand ( vl->vt, &vl->iter );
+}