X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/33534cd89a6eb1529e8adda0619e34e6326fcaa8..020b155be89ee1825309eb6d8d1958f3b46c310d:/src/viklayerspanel.c diff --git a/src/viklayerspanel.c b/src/viklayerspanel.c index 23de5c5e..e359b162 100644 --- a/src/viklayerspanel.c +++ b/src/viklayerspanel.c @@ -272,33 +272,44 @@ static void layers_popup ( VikLayersPanel *vlp, GtkTreeIter *iter, gint mouse_bu else { GtkWidget *del, *prop; + VikStdLayerMenuItem menu_selection = vik_layer_get_menu_items_selection(layer); menu = GTK_MENU ( gtk_menu_new () ); - prop = gtk_image_menu_item_new_from_stock ( GTK_STOCK_PROPERTIES, NULL ); - g_signal_connect_swapped ( G_OBJECT(prop), "activate", G_CALLBACK(vik_layers_panel_properties), vlp ); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), prop); - gtk_widget_show ( prop ); - - del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_CUT, NULL ); - g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_cut_selected), vlp ); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); - gtk_widget_show ( del ); - - del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_COPY, NULL ); - g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_copy_selected), vlp ); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); - gtk_widget_show ( del ); - - del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_PASTE, NULL ); - g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_paste_selected), vlp ); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); - gtk_widget_show ( del ); - - del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_DELETE, NULL ); - g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_delete_selected), vlp ); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); - gtk_widget_show ( del ); + if (menu_selection & VIK_MENU_ITEM_PROPERTY) { + prop = gtk_image_menu_item_new_from_stock ( GTK_STOCK_PROPERTIES, NULL ); + g_signal_connect_swapped ( G_OBJECT(prop), "activate", G_CALLBACK(vik_layers_panel_properties), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), prop); + gtk_widget_show ( prop ); + } + + if (menu_selection & VIK_MENU_ITEM_CUT) { + del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_CUT, NULL ); + g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_cut_selected), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); + gtk_widget_show ( del ); + } + + if (menu_selection & VIK_MENU_ITEM_COPY) { + del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_COPY, NULL ); + g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_copy_selected), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); + gtk_widget_show ( del ); + } + + if (menu_selection & VIK_MENU_ITEM_PASTE) { + del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_PASTE, NULL ); + g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_paste_selected), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); + gtk_widget_show ( del ); + } + + if (menu_selection & VIK_MENU_ITEM_DELETE) { + del = gtk_image_menu_item_new_from_stock ( GTK_STOCK_DELETE, NULL ); + g_signal_connect_swapped ( G_OBJECT(del), "activate", G_CALLBACK(vik_layers_panel_delete_selected), vlp ); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), del); + gtk_widget_show ( del ); + } vik_layer_add_menu_items ( layer, menu, vlp ); } @@ -354,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 { @@ -440,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 ); } @@ -459,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 ); @@ -485,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." ); @@ -494,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) ); } } } @@ -558,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;