X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/20c7a3a095bc527ba1f97ff85fe193ce11177773..020b155be89ee1825309eb6d8d1958f3b46c310d:/src/viklayerspanel.c diff --git a/src/viklayerspanel.c b/src/viklayerspanel.c index a97cb429..e359b162 100644 --- a/src/viklayerspanel.c +++ b/src/viklayerspanel.c @@ -365,12 +365,18 @@ void vik_layers_panel_add_layer ( VikLayersPanel *vlp, VikLayer *l ) VikAggregateLayer *addtoagg; if (vik_treeview_item_get_type ( vlp->vt, &iter ) == VIK_TREEVIEW_TYPE_LAYER ) { - if ( ! IS_VIK_AGGREGATE_LAYER(vik_treeview_item_get_pointer ( vlp->vt, &iter )) ) { - addtoagg = VIK_AGGREGATE_LAYER(vik_treeview_item_get_parent ( vlp->vt, &iter )); - replace_iter = &iter; + if ( IS_VIK_AGGREGATE_LAYER(vik_treeview_item_get_pointer ( vlp->vt, &iter )) ) + addtoagg = VIK_AGGREGATE_LAYER(vik_treeview_item_get_pointer ( vlp->vt, &iter )); + else { + VikLayer *vl = VIK_LAYER(vik_treeview_item_get_parent ( vlp->vt, &iter )); + while ( ! IS_VIK_AGGREGATE_LAYER(vl) ) { + iter = vl->iter; + vl = VIK_LAYER(vik_treeview_item_get_parent ( vlp->vt, &vl->iter )); + g_assert ( vl->realized ); + } + addtoagg = VIK_AGGREGATE_LAYER(vl); + replace_iter = &iter; } - else - addtoagg = VIK_AGGREGATE_LAYER(vik_treeview_item_get_pointer ( vlp->vt, &iter )); } else { @@ -451,7 +457,7 @@ void vik_layers_panel_cut_selected ( VikLayersPanel *vlp ) VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter ); if ( parent ) { - a_clipboard_copy ( vlp ); + a_clipboard_copy_selected ( vlp ); if ( vik_aggregate_layer_delete ( parent, &iter ) ) vik_layers_panel_emit_update ( vlp ); } @@ -470,13 +476,12 @@ void vik_layers_panel_copy_selected ( VikLayersPanel *vlp ) type = vik_treeview_item_get_type ( vlp->vt, &iter ); if ( type == VIK_TREEVIEW_TYPE_LAYER ) { - a_clipboard_copy ( vlp ); + a_clipboard_copy_selected ( vlp ); } } void vik_layers_panel_paste_selected ( VikLayersPanel *vlp ) { - gint type; GtkTreeIter iter; g_return_if_fail ( vik_treeview_get_selected_iter ( vlp->vt, &iter ) ); a_clipboard_paste ( vlp ); @@ -496,8 +501,10 @@ void vik_layers_panel_delete_selected ( VikLayersPanel *vlp ) VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter ); if ( parent ) { - if ( vik_aggregate_layer_delete ( parent, &iter ) ) - vik_layers_panel_emit_update ( vlp ); + if (IS_VIK_AGGREGATE_LAYER(parent)) { + if ( vik_aggregate_layer_delete ( parent, &iter ) ) + vik_layers_panel_emit_update ( vlp ); + } } else a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), "You cannot delete the Top Layer." ); @@ -505,7 +512,8 @@ void vik_layers_panel_delete_selected ( VikLayersPanel *vlp ) else if (type == VIK_TREEVIEW_TYPE_SUBLAYER) { VikLayer *sel = vik_layers_panel_get_selected ( vlp ); if ( vik_layer_get_interface(sel->type)->delete_item ) { - vik_layer_get_interface(sel->type)->delete_item ( sel, type, vik_treeview_item_get_pointer(sel->vt, &iter) ); + gint subtype = vik_treeview_item_get_data( vlp->vt, &iter); + vik_layer_get_interface(sel->type)->delete_item ( sel, subtype, vik_treeview_item_get_pointer(sel->vt, &iter) ); } } } @@ -569,6 +577,13 @@ VikLayer *vik_layers_panel_get_layer_of_type ( VikLayersPanel *vlp, gint type ) return rv; } +GList *vik_layers_panel_get_all_layers_of_type(VikLayersPanel *vlp, gint type) +{ + GList *layers = NULL; + + return (vik_aggregate_layer_get_all_layers_of_type ( vlp->toplayer, layers, type )); +} + VikAggregateLayer *vik_layers_panel_get_top_layer ( VikLayersPanel *vlp ) { return vlp->toplayer;