static void layers_item_toggled (VikLayersPanel *vlp, GtkTreeIter *iter) { gboolean visible; gpointer p; gint type; /* get type and data */ type = vik_treeview_item_get_type ( vlp->vt, iter ); p = vik_treeview_item_get_pointer ( vlp->vt, iter ); switch ( type ) { case VIK_TREEVIEW_TYPE_LAYER: visible = (VIK_LAYER(p)->visible ^= 1); vik_layer_emit_update_although_invisible ( VIK_LAYER(p) ); /* set trigger for half-drawn */ break; case VIK_TREEVIEW_TYPE_SUBLAYER: visible = vik_layer_sublayer_toggle_visible ( VIK_LAYER(vik_treeview_item_get_parent(vlp->vt, iter)), vik_treeview_item_get_data(vlp->vt, iter), p); vik_layer_emit_update_although_invisible ( VIK_LAYER(vik_treeview_item_get_parent(vlp->vt, iter)) ); break; default: return; } vik_treeview_item_set_visible ( vlp->vt, iter, visible ); }
gboolean vik_layers_panel_properties ( VikLayersPanel *vlp ) { GtkTreeIter iter; g_assert ( vlp->vvp ); if ( vik_treeview_get_selected_iter ( vlp->vt, &iter ) && vik_treeview_item_get_type ( vlp->vt, &iter ) == VIK_TREEVIEW_TYPE_LAYER ) { if ( vik_treeview_item_get_data ( vlp->vt, &iter ) == VIK_LAYER_AGGREGATE ) a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("Aggregate Layers have no settable properties.") ); VikLayer *layer = VIK_LAYER( vik_treeview_item_get_pointer ( vlp->vt, &iter ) ); if (vik_layer_properties ( layer, vlp->vvp )) vik_layer_emit_update ( layer, FALSE ); return TRUE; } else return FALSE; }
void vik_layers_panel_delete_selected ( VikLayersPanel *vlp ) { gint type; GtkTreeIter iter; if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) /* Nothing to do */ return; type = vik_treeview_item_get_type ( vlp->vt, &iter ); if ( type == VIK_TREEVIEW_TYPE_LAYER ) { // Get confirmation from the user if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("Are you sure you want to delete %s?"), vik_layer_get_name ( VIK_LAYER(vik_treeview_item_get_pointer ( vlp->vt, &iter )) ) ) ) return; VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter ); if ( parent ) { /* reset trigger if trigger deleted */ if ( vik_layers_panel_get_selected ( vlp ) == vik_viewport_get_trigger ( vlp->vvp ) ) vik_viewport_set_trigger ( vlp->vvp, NULL ); 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) ); } } }
/** * a_clipboard_copy_selected: * * Make a copy of selected object and associate ourselves with the clipboard. */ void a_clipboard_copy_selected ( VikLayersPanel *vlp ) { VikLayer *sel = vik_layers_panel_get_selected ( vlp ); GtkTreeIter iter; VikClipboardDataType type; guint16 layer_type = 0; gint subtype = 0; guint8 *data = NULL; guint len; const gchar *name = NULL; if ( ! sel ) return; vik_treeview_get_selected_iter ( sel->vt, &iter ); layer_type = sel->type; if ( vik_treeview_item_get_type ( sel->vt, &iter ) == VIK_TREEVIEW_TYPE_SUBLAYER ) { type = VIK_CLIPBOARD_DATA_SUBLAYER; if ( vik_layer_get_interface(layer_type)->copy_item) { subtype = vik_treeview_item_get_data(sel->vt, &iter); vik_layer_get_interface(layer_type)->copy_item(sel, subtype, vik_treeview_item_get_pointer(sel->vt, &iter), &data, &len ); // This name is used in setting the text representation of the item on the clipboard. name = vik_treeview_item_get_name(sel->vt, &iter); } } else { gint ilen; type = VIK_CLIPBOARD_DATA_LAYER; vik_layer_marshall ( sel, &data, &ilen ); len = ilen; name = vik_layer_get_name ( vik_treeview_item_get_pointer(sel->vt, &iter) ); } if (data) { a_clipboard_copy( type, layer_type, subtype, len, name, data); } }
void vik_layers_panel_cut_selected ( VikLayersPanel *vlp ) { gint type; GtkTreeIter iter; if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) /* Nothing to do */ return; 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 ) { /* reset trigger if trigger deleted */ if ( vik_layers_panel_get_selected ( vlp ) == vik_viewport_get_trigger ( vlp->vvp ) ) vik_viewport_set_trigger ( vlp->vvp, NULL ); a_clipboard_copy_selected ( 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 cut 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)->cut_item ) { gint subtype = vik_treeview_item_get_data( vlp->vt, &iter); vik_layer_get_interface(sel->type)->cut_item ( sel, subtype, vik_treeview_item_get_pointer(sel->vt, &iter) ); } } }
static void layers_popup ( VikLayersPanel *vlp, GtkTreeIter *iter, gint mouse_button ) { GtkMenu *menu = NULL; if ( iter ) { if ( vik_treeview_item_get_type ( vlp->vt, iter ) == VIK_TREEVIEW_TYPE_LAYER ) { VikLayer *layer = VIK_LAYER(vik_treeview_item_get_pointer ( vlp->vt, iter )); if ( layer->type == VIK_LAYER_AGGREGATE ) menu = GTK_MENU(gtk_item_factory_get_widget ( vlp->popup_factory, "<main>" )); else { GtkWidget *del, *prop; VikStdLayerMenuItem menu_selection = vik_layer_get_menu_items_selection(layer); menu = GTK_MENU ( gtk_menu_new () ); 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 ); } } else { menu = GTK_MENU ( gtk_menu_new () ); if ( ! vik_layer_sublayer_add_menu_items ( vik_treeview_item_get_parent ( vlp->vt, iter ), menu, vlp, vik_treeview_item_get_data ( vlp->vt, iter ), vik_treeview_item_get_pointer ( vlp->vt, iter ), iter, vlp->vvp ) ) { gtk_widget_destroy ( GTK_WIDGET(menu) ); return; } /* TODO: specific things for different types */ } } else menu = GTK_MENU(gtk_item_factory_get_widget ( vlp->popup_factory, base_entries[NUM_BASE_ENTRIES-1].path )); gtk_menu_popup ( menu, NULL, NULL, NULL, NULL, mouse_button, gtk_get_current_event_time() ); }
static void layers_item_edited (VikLayersPanel *vlp, GtkTreeIter *iter, const gchar *new_text) { if ( vik_treeview_item_get_type ( vlp->vt, iter ) == VIK_TREEVIEW_TYPE_LAYER ) { VikLayer *l; /* get iter and layer */ l = VIK_LAYER ( vik_treeview_item_get_pointer ( vlp->vt, iter ) ); if ( strcmp ( l->name, new_text ) != 0 ) { vik_layer_rename ( l, new_text ); vik_treeview_item_set_name ( vlp->vt, iter, l->name ); } } else { const gchar *name = vik_layer_sublayer_rename_request ( vik_treeview_item_get_parent ( vlp->vt, iter ), new_text, vlp, vik_treeview_item_get_data ( vlp->vt, iter ), vik_treeview_item_get_pointer ( vlp->vt, iter ), iter ); if ( name ) vik_treeview_item_set_name ( vlp->vt, iter, name); } }