#include "viking.h"
#include <string.h>
+#include <stdlib.h>
+#include "viklayer_defaults.h"
/* functions common to all layers. */
/* TODO longone: rename interface free -> finalize */
static void vik_layer_finalize ( VikLayer *vl );
static gboolean vik_layer_properties_factory ( VikLayer *vl, VikViewport *vp );
+static gboolean layer_defaults_register ( VikLayerTypeEnum type );
G_DEFINE_TYPE (VikLayer, vik_layer, G_TYPE_OBJECT)
layer_signals[VL_UPDATE_SIGNAL] = g_signal_new ( "update", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikLayerClass, update), NULL, NULL,
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ // Register all parameter defaults, early in the start up sequence
+ VikLayerTypeEnum layer;
+ for ( layer = 0; layer < VIK_LAYER_NUM_TYPES; layer++ )
+ // ATM ignore the returned value
+ layer_defaults_register ( layer );
}
/**
return vik_layer_interfaces[type];
}
+/**
+ * Store default values for this layer
+ *
+ * Returns whether any parameters where registered
+ */
+static gboolean layer_defaults_register ( VikLayerTypeEnum type )
+{
+ // See if any parameters
+ VikLayerParam *params = vik_layer_interfaces[type]->params;
+ if ( ! params )
+ return FALSE;
+
+ gboolean answer = FALSE; // Incase all parameters are 'not in properties'
+ guint16 params_count = vik_layer_interfaces[type]->params_count;
+ guint16 i;
+ // Process each parameter
+ for ( i = 0; i < params_count; i++ ) {
+ if ( params[i].group != VIK_LAYER_NOT_IN_PROPERTIES ) {
+ if ( params[i].default_value ) {
+ VikLayerParamData paramd = params[i].default_value();
+ a_layer_defaults_register ( ¶ms[i], paramd, vik_layer_interfaces[type]->fixed_layer_name );
+ answer = TRUE;
+ }
+ }
+ }
+
+ return answer;
+}
+
static void vik_layer_init ( VikLayer *vl )
{
vl->visible = TRUE;
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 )
return i;
return VIK_LAYER_NUM_TYPES;
}
+
+void vik_layer_typed_param_data_free ( gpointer gp )
+{
+ VikLayerTypedParamData *val = (VikLayerTypedParamData *)gp;
+ switch ( val->type ) {
+ case VIK_LAYER_PARAM_STRING:
+ if ( val->data.s )
+ g_free ( (gpointer)val->data.s );
+ break;
+ /* TODO: APPLICABLE TO US? NOTE: string layer works auniquely: data.sl should NOT be free'd when
+ * the internals call get_param -- i.e. it should be managed w/in the layer.
+ * The value passed by the internals into set_param should also be managed
+ * by the layer -- i.e. free'd by the layer.
+ */
+ case VIK_LAYER_PARAM_STRING_LIST:
+ g_warning ("Param strings not implemented"); //fake it
+ break;
+ default:
+ break;
+ }
+ g_free ( val );
+}
+
+VikLayerTypedParamData *vik_layer_typed_param_data_copy_from_data (VikLayerParamType type, VikLayerParamData val) {
+ VikLayerTypedParamData *newval = g_new(VikLayerTypedParamData,1);
+ newval->data = val;
+ newval->type = type;
+ switch ( newval->type ) {
+ case VIK_LAYER_PARAM_STRING: {
+ gchar *s = g_strdup(newval->data.s);
+ newval->data.s = s;
+ break;
+ }
+ /* TODO: APPLICABLE TO US? NOTE: string layer works auniquely: data.sl should NOT be free'd when
+ * the internals call get_param -- i.e. it should be managed w/in the layer.
+ * The value passed by the internals into set_param should also be managed
+ * by the layer -- i.e. free'd by the layer.
+ */
+ case VIK_LAYER_PARAM_STRING_LIST:
+ g_critical ( "Param strings not implemented"); //fake it
+ break;
+ default:
+ break;
+ }
+ return newval;
+}
+
+#define TEST_BOOLEAN(str) (! ((str)[0] == '\0' || (str)[0] == '0' || (str)[0] == 'n' || (str)[0] == 'N' || (str)[0] == 'f' || (str)[0] == 'F') )
+
+VikLayerTypedParamData *vik_layer_data_typed_param_copy_from_string ( VikLayerParamType type, const gchar *str )
+{
+ VikLayerTypedParamData *rv = g_new(VikLayerTypedParamData,1);
+ rv->type = type;
+ switch ( type )
+ {
+ case VIK_LAYER_PARAM_DOUBLE: rv->data.d = strtod(str, NULL); break;
+ case VIK_LAYER_PARAM_UINT: rv->data.u = strtoul(str, NULL, 10); break;
+ case VIK_LAYER_PARAM_INT: rv->data.i = strtol(str, NULL, 10); break;
+ case VIK_LAYER_PARAM_BOOLEAN: rv->data.b = TEST_BOOLEAN(str); break;
+ case VIK_LAYER_PARAM_COLOR: memset(&(rv->data.c), 0, sizeof(rv->data.c)); /* default: black */
+ gdk_color_parse ( str, &(rv->data.c) ); break;
+ /* STRING or STRING_LIST -- if STRING_LIST, just set param to add a STRING */
+ default: {
+ gchar *s = g_strdup(str);
+ rv->data.s = s;
+ }
+ }
+ return rv;
+}
+
+
+/**
+ * vik_layer_set_defaults:
+ *
+ * Loop around all parameters for the specified layer to call the function to get the
+ * default value for that parameter
+ */
+void vik_layer_set_defaults ( VikLayer *vl, VikViewport *vvp )
+{
+ VikLayerInterface *vli = vik_layer_get_interface ( vl->type );
+ const gchar *layer_name = vli->fixed_layer_name;
+ VikLayerParamData data;
+
+ int i;
+ for ( i = 0; i < vli->params_count; 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 );
+ }
+ }
+ }
+}