/* returns 0 == we're good, 1 == didn't find any layers, 2 == got rejected */ guint vik_aggregate_layer_tool ( VikAggregateLayer *val, VikLayerTypeEnum layer_type, VikToolInterfaceFunc tool_func, GdkEventButton *event, VikViewport *vvp ) { GList *iter = val->children; gboolean found_rej = FALSE; if (!iter) return FALSE; while (iter->next) iter = iter->next; while ( iter ) { /* if this layer "accepts" the tool call */ if ( VIK_LAYER(iter->data)->visible && VIK_LAYER(iter->data)->type == layer_type ) { if ( tool_func ( VIK_LAYER(iter->data), event, vvp ) ) return 0; else found_rej = TRUE; } /* recursive -- try the same for the child aggregate layer. */ else if ( VIK_LAYER(iter->data)->visible && VIK_LAYER(iter->data)->type == VIK_LAYER_AGGREGATE ) { gint rv = vik_aggregate_layer_tool(VIK_AGGREGATE_LAYER(iter->data), layer_type, tool_func, event, vvp); if ( rv == 0 ) return 0; else if ( rv == 2 ) found_rej = TRUE; } iter = iter->prev; } return found_rej ? 2 : 1; /* no one wanted to accept the tool call in this layer */ }
gboolean vik_layers_panel_tool ( VikLayersPanel *vlp, guint16 layer_type, VikToolInterfaceFunc tool_func, GdkEventButton *event, VikViewport *vvp ) { VikLayer *vl = vik_layers_panel_get_selected ( vlp ); if ( vl && vl->type == layer_type ) { tool_func ( vl, event, vvp ); return TRUE; } else if ( VIK_LAYER(vlp->toplayer)->visible && vik_aggregate_layer_tool ( vlp->toplayer, layer_type, tool_func, event, vvp ) != 1 ) /* either accepted or rejected, but a layer was found */ return TRUE; return FALSE; }