/** * vik_aggregate_layer_add_layer: * @allow_reordering: should be set for GUI interactions, * whereas loading from a file needs strict ordering and so should be FALSE */ void vik_aggregate_layer_add_layer ( VikAggregateLayer *val, VikLayer *l, gboolean allow_reordering ) { GtkTreeIter iter; VikLayer *vl = VIK_LAYER(val); // By default layers go to the top gboolean put_above = TRUE; if ( allow_reordering ) { // These types are 'base' types in that you what other information on top if ( l->type == VIK_LAYER_MAPS || l->type == VIK_LAYER_DEM || l->type == VIK_LAYER_GEOREF ) put_above = FALSE; } if ( vl->realized ) { vik_treeview_add_layer ( vl->vt, &(vl->iter), &iter, l->name, val, put_above, l, l->type, l->type); if ( ! l->visible ) vik_treeview_item_set_visible ( vl->vt, &iter, FALSE ); vik_layer_realize ( l, vl->vt, &iter ); if ( val->children == NULL ) vik_treeview_expand ( vl->vt, &(vl->iter) ); } if ( put_above ) val->children = g_list_append ( val->children, l ); else val->children = g_list_prepend ( val->children, l ); g_signal_connect_swapped ( G_OBJECT(l), "update", G_CALLBACK(vik_layer_emit_update_secondary), val ); }
void vik_aggregate_layer_insert_layer ( VikAggregateLayer *val, VikLayer *l, GtkTreeIter *replace_iter ) { GtkTreeIter iter; VikLayer *vl = VIK_LAYER(val); if ( vl->realized ) { vik_treeview_insert_layer ( vl->vt, &(vl->iter), &iter, l->name, val, l, l->type, l->type, replace_iter ); if ( ! l->visible ) vik_treeview_item_set_visible ( vl->vt, &iter, FALSE ); vik_layer_realize ( l, vl->vt, &iter ); if ( val->children == NULL ) vik_treeview_expand ( vl->vt, &(vl->iter) ); } if (replace_iter) { GList *theone = g_list_find ( val->children, vik_treeview_item_get_pointer ( vl->vt, replace_iter ) ); val->children = g_list_insert ( val->children, l, g_list_position(val->children,theone)+1 ); } else { // Effectively insert at 'end' of the list to match how displayed in the treeview // - but since it is drawn from 'bottom first' it is actually the first in the child list // This ordering is especially important if it is a map or similar type, // which needs be drawn first for the layering draw method to work properly. // ATM this only happens when a layer is drag/dropped to the end of an aggregate layer val->children = g_list_prepend ( val->children, l ); } g_signal_connect_swapped ( G_OBJECT(l), "update", G_CALLBACK(vik_layer_emit_update_secondary), val ); }
void vik_aggregate_layer_realize ( VikAggregateLayer *val, VikTreeview *vt, GtkTreeIter *layer_iter ) { GList *i = val->children; GtkTreeIter iter; VikLayer *vl = VIK_LAYER(val); VikLayer *vli; while ( i ) { vli = VIK_LAYER(i->data); vik_treeview_add_layer ( vl->vt, layer_iter, &iter, vli->name, val, TRUE, vli, vli->type, vli->type ); if ( ! vli->visible ) vik_treeview_item_set_visible ( vl->vt, &iter, FALSE ); vik_layer_realize ( vli, vl->vt, &iter ); i = i->next; } }
void vik_aggregate_layer_add_layer ( VikAggregateLayer *val, VikLayer *l ) { GtkTreeIter iter; VikLayer *vl = VIK_LAYER(val); if ( vl->realized ) { vik_treeview_add_layer ( vl->vt, &(vl->iter), &iter, l->name, val, l, l->type, l->type); if ( ! l->visible ) vik_treeview_item_set_visible ( vl->vt, &iter, FALSE ); vik_layer_realize ( l, vl->vt, &iter ); if ( val->children == NULL ) vik_treeview_expand ( vl->vt, &(vl->iter) ); } val->children = g_list_append ( val->children, l ); g_signal_connect_swapped ( G_OBJECT(l), "update", G_CALLBACK(vik_layer_emit_update_secondary), val ); }
void vik_aggregate_layer_insert_layer ( VikAggregateLayer *val, VikLayer *l, GtkTreeIter *replace_iter ) { GtkTreeIter iter; VikLayer *vl = VIK_LAYER(val); // By default layers are inserted above the selected layer gboolean put_above = TRUE; // These types are 'base' types in that you what other information on top if ( l->type == VIK_LAYER_MAPS || l->type == VIK_LAYER_DEM || l->type == VIK_LAYER_GEOREF ) put_above = FALSE; if ( vl->realized ) { vik_treeview_insert_layer ( vl->vt, &(vl->iter), &iter, l->name, val, put_above, l, l->type, l->type, replace_iter ); if ( ! l->visible ) vik_treeview_item_set_visible ( vl->vt, &iter, FALSE ); vik_layer_realize ( l, vl->vt, &iter ); if ( val->children == NULL ) vik_treeview_expand ( vl->vt, &(vl->iter) ); } if (replace_iter) { GList *theone = g_list_find ( val->children, vik_treeview_item_get_pointer ( vl->vt, replace_iter ) ); if ( put_above ) val->children = g_list_insert ( val->children, l, g_list_position(val->children,theone)+1 ); else // Thus insert 'here' (so don't add 1) val->children = g_list_insert ( val->children, l, g_list_position(val->children,theone) ); } else { // Effectively insert at 'end' of the list to match how displayed in the treeview // - but since it is drawn from 'bottom first' it is actually the first in the child list // This ordering is especially important if it is a map or similar type, // which needs be drawn first for the layering draw method to work properly. // ATM this only happens when a layer is drag/dropped to the end of an aggregate layer val->children = g_list_prepend ( val->children, l ); } g_signal_connect_swapped ( G_OBJECT(l), "update", G_CALLBACK(vik_layer_emit_update_secondary), val ); }
static void layers_panel_init ( VikLayersPanel *vlp ) { GtkWidget *hbox; GtkWidget *addbutton, *addimage; GtkWidget *removebutton, *removeimage; GtkWidget *upbutton, *upimage; GtkWidget *downbutton, *downimage; GtkWidget *cutbutton, *cutimage; GtkWidget *copybutton, *copyimage; GtkWidget *pastebutton, *pasteimage; GtkWidget *scrolledwindow; GtkItemFactoryEntry entry; guint i, tmp; vlp->vvp = NULL; hbox = gtk_hbox_new ( TRUE, 2 ); vlp->vt = vik_treeview_new ( ); vlp->toplayer = vik_aggregate_layer_new (); vik_layer_rename ( VIK_LAYER(vlp->toplayer), _("Top Layer")); g_signal_connect_swapped ( G_OBJECT(vlp->toplayer), "update", G_CALLBACK(vik_layers_panel_emit_update), vlp ); vik_treeview_add_layer ( vlp->vt, NULL, &(vlp->toplayer_iter), VIK_LAYER(vlp->toplayer)->name, NULL, vlp->toplayer, VIK_LAYER_AGGREGATE, VIK_LAYER_AGGREGATE ); vik_layer_realize ( VIK_LAYER(vlp->toplayer), vlp->vt, &(vlp->toplayer_iter) ); g_signal_connect_swapped ( vlp->vt, "popup_menu", G_CALLBACK(menu_popup_cb), vlp); g_signal_connect_swapped ( vlp->vt, "button_press_event", G_CALLBACK(layers_button_press_cb), vlp); g_signal_connect_swapped ( vlp->vt, "item_toggled", G_CALLBACK(layers_item_toggled), vlp); g_signal_connect_swapped ( vlp->vt, "item_edited", G_CALLBACK(layers_item_edited), vlp); g_signal_connect_swapped ( vlp->vt, "key_press_event", G_CALLBACK(layers_key_press_cb), vlp); /* Add button */ addimage = gtk_image_new_from_stock ( GTK_STOCK_ADD, GTK_ICON_SIZE_SMALL_TOOLBAR ); addbutton = gtk_button_new ( ); gtk_container_add ( GTK_CONTAINER(addbutton), addimage ); gtk_widget_set_tooltip_text ( GTK_WIDGET(addbutton), _("Add new layer")); gtk_box_pack_start ( GTK_BOX(hbox), addbutton, TRUE, TRUE, 0 ); g_signal_connect_swapped ( G_OBJECT(addbutton), "clicked", G_CALLBACK(layers_popup_cb), vlp ); /* Remove button */ removeimage = gtk_image_new_from_stock ( GTK_STOCK_REMOVE, GTK_ICON_SIZE_SMALL_TOOLBAR ); removebutton = gtk_button_new ( ); gtk_container_add ( GTK_CONTAINER(removebutton), removeimage ); gtk_widget_set_tooltip_text ( GTK_WIDGET(removebutton), _("Remove selected layer")); gtk_box_pack_start ( GTK_BOX(hbox), removebutton, TRUE, TRUE, 0 ); g_signal_connect_swapped ( G_OBJECT(removebutton), "clicked", G_CALLBACK(vik_layers_panel_delete_selected), vlp ); /* Up button */ upimage = gtk_image_new_from_stock ( GTK_STOCK_GO_UP, GTK_ICON_SIZE_SMALL_TOOLBAR ); upbutton = gtk_button_new ( ); gtk_container_add ( GTK_CONTAINER(upbutton), upimage ); gtk_widget_set_tooltip_text ( GTK_WIDGET(upbutton), _("Move selected layer up")); gtk_box_pack_start ( GTK_BOX(hbox), upbutton, TRUE, TRUE, 0 ); g_signal_connect_swapped ( G_OBJECT(upbutton), "clicked", G_CALLBACK(layers_move_item_up), vlp ); /* Down button */ downimage = gtk_image_new_from_stock ( GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_SMALL_TOOLBAR ); downbutton = gtk_button_new ( ); gtk_container_add ( GTK_CONTAINER(downbutton), downimage ); gtk_widget_set_tooltip_text ( GTK_WIDGET(downbutton), _("Move selected layer down")); gtk_box_pack_start ( GTK_BOX(hbox), downbutton, TRUE, TRUE, 0 ); g_signal_connect_swapped ( G_OBJECT(downbutton), "clicked", G_CALLBACK(layers_move_item_down), vlp ); /* Cut button */ cutimage = gtk_image_new_from_stock ( GTK_STOCK_CUT, GTK_ICON_SIZE_SMALL_TOOLBAR ); cutbutton = gtk_button_new ( ); gtk_container_add ( GTK_CONTAINER(cutbutton), cutimage ); gtk_widget_set_tooltip_text ( GTK_WIDGET(cutbutton), _("Cut selected layer")); gtk_box_pack_start ( GTK_BOX(hbox), cutbutton, TRUE, TRUE, 0 ); g_signal_connect_swapped ( G_OBJECT(cutbutton), "clicked", G_CALLBACK(vik_layers_panel_cut_selected), vlp ); /* Copy button */ copyimage = gtk_image_new_from_stock ( GTK_STOCK_COPY, GTK_ICON_SIZE_SMALL_TOOLBAR ); copybutton = gtk_button_new ( ); gtk_container_add ( GTK_CONTAINER(copybutton), copyimage ); gtk_widget_set_tooltip_text ( GTK_WIDGET(copybutton), _("Copy selected layer")); gtk_box_pack_start ( GTK_BOX(hbox), copybutton, TRUE, TRUE, 0 ); g_signal_connect_swapped ( G_OBJECT(copybutton), "clicked", G_CALLBACK(vik_layers_panel_copy_selected), vlp ); /* Paste button */ pasteimage = gtk_image_new_from_stock ( GTK_STOCK_PASTE, GTK_ICON_SIZE_SMALL_TOOLBAR ); pastebutton = gtk_button_new ( ); gtk_container_add ( GTK_CONTAINER(pastebutton),pasteimage ); gtk_widget_set_tooltip_text ( GTK_WIDGET(pastebutton), _("Paste layer below selected layer")); gtk_box_pack_start ( GTK_BOX(hbox), pastebutton, TRUE, TRUE, 0 ); g_signal_connect_swapped ( G_OBJECT(pastebutton), "clicked", G_CALLBACK(vik_layers_panel_paste_selected), vlp ); scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); gtk_container_add ( GTK_CONTAINER(scrolledwindow), GTK_WIDGET(vlp->vt) ); gtk_box_pack_start ( GTK_BOX(vlp), scrolledwindow, TRUE, TRUE, 0 ); gtk_box_pack_start ( GTK_BOX(vlp), hbox, FALSE, FALSE, 0 ); vlp->popup_factory = gtk_item_factory_new ( GTK_TYPE_MENU, "<main>", NULL ); gtk_item_factory_create_items ( vlp->popup_factory, NUM_BASE_ENTRIES, base_entries, vlp ); for ( i = 0; i < VIK_LAYER_NUM_TYPES; i++ ) { /* TODO: FIXME: if name has a '/' in it it will get all messed up. why not have an itemfactory field with name, icon, shortcut, etc.? */ /* Note: we use a temporary label in order to share translation with other codde */ gchar *label = g_strdup_printf(_("New %s Layer"), vik_layer_get_interface(i)->name ); entry.path = g_strdup_printf("%s/%s", base_entries[NUM_BASE_ENTRIES-1].path, label ); g_free ( label ); entry.accelerator = NULL; entry.callback = (GtkItemFactoryCallback) vik_layers_panel_new_layer; entry.callback_action = i; if ( vik_layer_get_interface(i)->icon ) { entry.item_type = "<ImageItem>"; entry.extra_data = gdk_pixdata_serialize ( vik_layer_get_interface(i)->icon, &tmp ); } else entry.item_type = "<Item>"; gtk_item_factory_create_item ( vlp->popup_factory, &entry, vlp, 1 ); g_free ( (gpointer) entry.extra_data ); g_free ( entry.path ); } }