X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/50a14534a51f892500ee82f867e8ab2f85b936ae..5dab4f3fa3c22facc679ba558dd6987d3d8f34e0:/src/viklayerspanel.c?ds=sidebyside diff --git a/src/viklayerspanel.c b/src/viklayerspanel.c index 1b2cdd32..e359b162 100644 --- a/src/viklayerspanel.c +++ b/src/viklayerspanel.c @@ -50,11 +50,14 @@ struct _VikLayersPanel { }; static GtkItemFactoryEntry base_entries[] = { + { "/C_ut", NULL, (GtkItemFactoryCallback) vik_layers_panel_cut_selected, -1, "", GTK_STOCK_CUT }, + { "/_Copy", NULL, (GtkItemFactoryCallback) vik_layers_panel_copy_selected, -1, "", GTK_STOCK_COPY }, + { "/_Paste", NULL, (GtkItemFactoryCallback) vik_layers_panel_paste_selected, -1, "", GTK_STOCK_PASTE }, { "/_Delete", NULL, (GtkItemFactoryCallback) vik_layers_panel_delete_selected, -1, "", GTK_STOCK_DELETE }, { "/New Layer", NULL, NULL, -1, "" }, }; -#define NUM_BASE_ENTRIES 2 +#define NUM_BASE_ENTRIES 5 static void layers_item_toggled (VikLayersPanel *vlp, GtkTreeIter *iter); static void layers_item_edited (VikLayersPanel *vlp, GtkTreeIter *iter, const gchar *new_text); @@ -269,18 +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_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 ); } @@ -293,7 +322,7 @@ static void layers_popup ( VikLayersPanel *vlp, GtkTreeIter *iter, gint mouse_bu gtk_widget_destroy ( GTK_WIDGET(menu) ); return; } - /* TODO: copy, paste, specific things for different types */ + /* TODO: specific things for different types */ } } else @@ -336,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 { @@ -408,7 +443,7 @@ void vik_layers_panel_draw_all_using_viewport ( VikLayersPanel *vlp, VikViewport vik_aggregate_layer_draw ( vlp->toplayer, vvp ); } -void vik_layers_panel_delete_selected ( VikLayersPanel *vlp ) +void vik_layers_panel_cut_selected ( VikLayersPanel *vlp ) { gint type; GtkTreeIter iter; @@ -422,12 +457,65 @@ void vik_layers_panel_delete_selected ( VikLayersPanel *vlp ) VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter ); if ( parent ) { + a_clipboard_copy_selected ( vlp ); 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 cut the Top Layer." ); + } +} + +void vik_layers_panel_copy_selected ( VikLayersPanel *vlp ) +{ + gint type; + GtkTreeIter iter; + + g_return_if_fail ( vik_treeview_get_selected_iter ( vlp->vt, &iter ) ); + + type = vik_treeview_item_get_type ( vlp->vt, &iter ); + + if ( type == VIK_TREEVIEW_TYPE_LAYER ) { + a_clipboard_copy_selected ( vlp ); + } +} + +void vik_layers_panel_paste_selected ( VikLayersPanel *vlp ) +{ + GtkTreeIter iter; + g_return_if_fail ( vik_treeview_get_selected_iter ( vlp->vt, &iter ) ); + a_clipboard_paste ( vlp ); +} + +void vik_layers_panel_delete_selected ( VikLayersPanel *vlp ) +{ + gint type; + GtkTreeIter iter; + + g_return_if_fail ( vik_treeview_get_selected_iter ( vlp->vt, &iter ) ); + + type = vik_treeview_item_get_type ( vlp->vt, &iter ); + + if ( type == VIK_TREEVIEW_TYPE_LAYER ) + { + VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter ); + if ( parent ) + { + 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." ); } + else if (type == VIK_TREEVIEW_TYPE_SUBLAYER) { + VikLayer *sel = vik_layers_panel_get_selected ( vlp ); + if ( vik_layer_get_interface(sel->type)->delete_item ) { + 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) ); + } + } } VikLayer *vik_layers_panel_get_selected ( VikLayersPanel *vlp ) @@ -461,6 +549,7 @@ static void layers_move_item_down ( VikLayersPanel *vlp ) layers_move_item ( vlp, FALSE ); } +#if 0 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 ); @@ -474,6 +563,7 @@ gboolean vik_layers_panel_tool ( VikLayersPanel *vlp, guint16 layer_type, VikToo return TRUE; return FALSE; } +#endif VikLayer *vik_layers_panel_get_layer_of_type ( VikLayersPanel *vlp, gint type ) { @@ -487,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;