Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 8691) +++ trunk/src/layer.c (revision 8692) @@ -457,9 +457,6 @@ return 1; } - if (old_index == new_index) - return 0; - if (new_index == -1 && is_last_top_copper_layer(old_index)) { pcb_gui->confirm_dialog("You can't delete the last top-side layer\n", "Ok", NULL); return 1; @@ -481,13 +478,27 @@ lp = &PCB->Data->Layer[new_lid]; layer_init(lp, new_lid); - lp->grp = PCB->Data->Layer[new_index].grp; + if (new_in_grp >= 0) + lp->grp = new_in_grp; + else + lp->grp = PCB->Data->Layer[new_index].grp; + g = pcb_get_layergrp(PCB, lp->grp); - grp_idx = pcb_layergrp_index_in_grp(g, new_index); + if (new_in_grp >= 0) { + if (new_index == 0) + grp_idx = 0; + else + grp_idx = g->len; + } + else + grp_idx = pcb_layergrp_index_in_grp(g, new_index); + /* shift group members up and insert the new group */ - fprintf(stderr, "move: len=%d new_index=%d %d\n", g->len, grp_idx, (g->len - grp_idx)); - memmove(g->lid+grp_idx+1, g->lid+grp_idx, (g->len - grp_idx) * sizeof(pcb_layer_id_t)); + if ((g->len > grp_idx) && (grp_idx >= 0)) + memmove(g->lid+grp_idx+1, g->lid+grp_idx, (g->len - grp_idx) * sizeof(pcb_layer_id_t)); + if (grp_idx < 0) + grp_idx = 0; g->lid[grp_idx] = new_lid; g->len++; pcb_event(PCB_EVENT_LAYERS_CHANGED, NULL); Index: trunk/src/object_act.c =================================================================== --- trunk/src/object_act.c (revision 8691) +++ trunk/src/object_act.c (revision 8692) @@ -1052,6 +1052,7 @@ @end table %end-doc */ +extern pcb_layergrp_id_t pcb_actd_EditGroup_gid; int pcb_act_MoveLayer(int argc, const char **argv, pcb_coord_t x, pcb_coord_t y) { int old_index, new_index; @@ -1072,6 +1073,12 @@ if (new_index < 0) new_index = 0; } + else if (strcmp(argv[1], "gi") == 0) { + return pcb_layer_move(-1, 0, pcb_actd_EditGroup_gid); + } + else if (strcmp(argv[1], "ga") == 0) { + return pcb_layer_move(-1, 1, pcb_actd_EditGroup_gid); + } else if (strcmp(argv[1], "up") == 0) { new_index = INDEXOFCURRENT - 1; if (new_index < 0) Index: trunk/src/pcb-menu-gtk.lht =================================================================== --- trunk/src/pcb-menu-gtk.lht (revision 8691) +++ trunk/src/pcb-menu-gtk.lht (revision 8692) @@ -644,6 +644,9 @@ li:submenu { ha:Group properties... = { action=EditGroup(@) } ha:Grouping... (layer preferences) = { action=DoWindows(Preferences, 1, "User PoV/Layers") } + - + ha:Insert new layer = { action={ MoveLayer(-1, gi); EditLayer() } } + ha:Append new layer = { action={ MoveLayer(-1, ga); EditLayer() } } } } # group