Index: trunk/src/gui_act.c =================================================================== --- trunk/src/gui_act.c (revision 29691) +++ trunk/src/gui_act.c (revision 29692) @@ -999,7 +999,7 @@ } pcb_layergrp_inhibit_inc(); - ng = pcb_layergrp_dup(PCB, gid, 1); + ng = pcb_layergrp_dup(PCB, gid, 1, 1); if (ng >= 0) { pcb_layer_id_t lid = pcb_layer_create(PCB, ng, g->name); if (lid >= 0) { Index: trunk/src/layer_grp.c =================================================================== --- trunk/src/layer_grp.c (revision 29691) +++ trunk/src/layer_grp.c (revision 29692) @@ -154,7 +154,7 @@ pcb_layergrp_setup(g, pcb); } -pcb_layergrp_id_t pcb_layergrp_dup(pcb_board_t *pcb, pcb_layergrp_id_t gid, int auto_substrate) +pcb_layergrp_id_t pcb_layergrp_dup(pcb_board_t *pcb, pcb_layergrp_id_t gid, int auto_substrate, pcb_bool undoable) { pcb_layergrp_t *ng, *og = pcb_get_layergrp(pcb, gid); pcb_layergrp_id_t after; @@ -167,6 +167,7 @@ ng = pcb_layergrp_insert_after(pcb, gid); make_substrate(pcb, ng); after = ng - pcb->LayerGroups.grp; + if (undoable) pcb_layergrp_undoable_create(ng); } else after = gid; @@ -180,6 +181,7 @@ ng->purpi = og->purpi; ng->valid = ng->open = ng->vis = 1; pcb_layergrp_setup(ng, pcb); + if (undoable) pcb_layergrp_undoable_create(ng); inhibit_notify--; NOTIFY(pcb); @@ -579,7 +581,7 @@ pcb_layergrp_ins(r->pcb, r->gid, &r->save); } else { /* redo delete */ - pcb_layergrp_del_1(r->pcb, r->gid, 1, 1); + pcb_layergrp_del_1(r->pcb, r->gid, 1, 0); grp_move_struct(&r->save, &stk->grp[r->gid]); pcb_layergrp_del_2(r->pcb, r->gid); } @@ -638,6 +640,20 @@ return 0; } +void pcb_layergrp_undoable_create(pcb_layergrp_t *grp) +{ + pcb_board_t *pcb = grp->parent.board; + undo_layergrp_del_t *r; + + assert(grp->parent_type == PCB_PARENT_BOARD); + r = pcb_undo_alloc(pcb, &undo_layergrp_del, sizeof(undo_layergrp_del_t)); + memset(r, 0, sizeof(undo_layergrp_del_t)); + r->pcb = pcb; + r->gid = grp - pcb->LayerGroups.grp; + r->del = 0; + pcb_undo_inc_serial(); +} + int pcb_layergrp_move(pcb_board_t *pcb, pcb_layergrp_id_t from, pcb_layergrp_id_t to_before) { pcb_layer_stack_t *stk = &pcb->LayerGroups; Index: trunk/src/layer_grp.h =================================================================== --- trunk/src/layer_grp.h (revision 29691) +++ trunk/src/layer_grp.h (revision 29692) @@ -121,7 +121,7 @@ /* Duplicate a layer group (with no layers); if auto_substrate is set, insert a substrate layer automatically if needed */ -pcb_layergrp_id_t pcb_layergrp_dup(pcb_board_t *pcb, pcb_layergrp_id_t gid, int auto_substrate); +pcb_layergrp_id_t pcb_layergrp_dup(pcb_board_t *pcb, pcb_layergrp_id_t gid, int auto_substrate, pcb_bool undoable); /* Move gfrom to to_before and shift the stack as necessary. Return -1 on range error */ int pcb_layergrp_move(pcb_board_t *pcb, pcb_layergrp_id_t gfrom, pcb_layergrp_id_t to_before); @@ -197,7 +197,10 @@ copper groups. */ void pcb_layergrp_create_missing_substrate(pcb_board_t *pcb); +/* Call this after creating grp to add the creation to the undo list */ +void pcb_layergrp_undoable_create(pcb_layergrp_t *grp); + /********* OBSOLETE functions, do not use in new code *********/ /* parses the group definition string which is a colon separated list of comma separated layer numbers (1,2,b:4,6,8,t); oldfmt is 0 or 1