Index: trunk/src/libcschem/cnc_line.c =================================================================== --- trunk/src/libcschem/cnc_line.c (revision 1292) +++ trunk/src/libcschem/cnc_line.c (revision 1293) @@ -120,7 +120,7 @@ static void line_remove_undo(csch_undo_remove_t *slot) { - + csch_cnc_common_remove_undo(slot, CSCH_REM_FROM_RTREE | CSCH_REM_FROM_PARENT | CSCH_REM_DEL_EMPTY_PARENT); } static int line_isc_with_box(csch_chdr_t *obj, csch_rtree_box_t *box) Index: trunk/src/libcschem/op_common.c =================================================================== --- trunk/src/libcschem/op_common.c (revision 1292) +++ trunk/src/libcschem/op_common.c (revision 1293) @@ -42,6 +42,10 @@ static int undo_remove_undo(void *udata) { csch_undo_remove_t *u = udata; + csch_chdr_t *obj = u->obj; + const csch_ops_t *ops = csch_op_get(obj->type); + assert(ops->remove_undo != NULL); + ops->remove_undo(u); return 0; } @@ -48,7 +52,13 @@ static int undo_remove_redo(void *udata) { csch_undo_remove_t *u = udata; + csch_chdr_t *obj = u->obj; + const csch_ops_t *ops = csch_op_get(obj->type); + assert(ops->remove_redo != NULL); + + ops->remove_redo(u); return 0; + } static void undo_remove_print(void *udata, char *dst, size_t dst_len) @@ -84,13 +94,12 @@ { csch_chdr_t *obj = u->obj; -TODO("remember parent in u; handle when parent gets empty"); - if (how & CSCH_REM_FROM_RTREE) csch_cobj_rtree_del(obj->sheet, obj); if (how & CSCH_REM_FROM_PARENT) { assert(obj->parent != NULL); + u->parent = obj->parent; htip_pop(&obj->parent->id2obj, obj->oid); gdl_remove(&u->sheet->active, obj, link); gdl_append(&u->sheet->deleted, obj, link); @@ -104,6 +113,24 @@ return obj; } +csch_chdr_t *csch_cnc_common_remove_undo(csch_undo_remove_t *u, csch_cnc_common_remove_t how) +{ + csch_chdr_t *obj = u->obj; + + if (how & CSCH_REM_FROM_PARENT) { + obj->parent = u->parent; + assert(obj->parent != NULL); + htip_insert(&obj->parent->id2obj, obj->oid, obj); + gdl_remove(&u->sheet->deleted, obj, link); + gdl_append(&u->sheet->active, obj, link); + } + + if (how & CSCH_REM_FROM_RTREE) + csch_cobj_rtree_add(obj->sheet, obj); + + return obj; +} + /*** MISC ***/ csch_chdr_t *csch_op_inserted(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_chdr_t *obj) Index: trunk/src/libcschem/op_common.h =================================================================== --- trunk/src/libcschem/op_common.h (revision 1292) +++ trunk/src/libcschem/op_common.h (revision 1293) @@ -39,7 +39,9 @@ /* Modular redo implementation for any object */ csch_chdr_t *csch_cnc_common_remove_redo(csch_undo_remove_t *u, csch_cnc_common_remove_t how); +csch_chdr_t *csch_cnc_common_remove_undo(csch_undo_remove_t *u, csch_cnc_common_remove_t how); + /* Allocate an undo slot for removing an object */ csch_undo_remove_t *csch_op_remove_alloc_undo(csch_sheet_t *sheet); Index: trunk/src/libcschem/operation.c =================================================================== --- trunk/src/libcschem/operation.c (revision 1292) +++ trunk/src/libcschem/operation.c (revision 1293) @@ -54,7 +54,7 @@ }; -static const csch_ops_t *op_get(csch_ctype_t type) +const csch_ops_t *csch_op_get(csch_ctype_t type) { if ((type < 0) || (type >= CSCH_CTYPE_max)) return NULL; @@ -63,7 +63,7 @@ csch_inline csch_chdr_t *csch_cnc_remove_(csch_sheet_t *sheet, csch_chdr_t *obj, csch_cnc_common_remove_t how) { - const csch_ops_t *ops = op_get(obj->type); + const csch_ops_t *ops = csch_op_get(obj->type); csch_undo_remove_t *u, utmp; assert(ops != NULL); @@ -95,7 +95,7 @@ csch_chdr_t *csch_op_create(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_ctype_t type) { - const csch_ops_t *op = op_get(type); + const csch_ops_t *op = csch_op_get(type); csch_chdr_t *obj; if ((op == NULL) || (op->create == NULL)) @@ -126,7 +126,7 @@ int csch_isc_with_box(csch_chdr_t *obj, csch_rtree_box_t *box) { - const csch_ops_t *op = op_get(obj->type); + const csch_ops_t *op = csch_op_get(obj->type); if ((op == NULL) || (op->isc_with_box == NULL)) return 0; return op->isc_with_box(obj, box); Index: trunk/src/libcschem/operation.h =================================================================== --- trunk/src/libcschem/operation.h (revision 1292) +++ trunk/src/libcschem/operation.h (revision 1293) @@ -32,6 +32,7 @@ typedef struct { csch_chdr_t *obj; + csch_cgrp_t *parent; csch_sheet_t *sheet; } csch_undo_remove_t; @@ -53,4 +54,6 @@ int csch_isc_with_box(csch_chdr_t *obj, csch_rtree_box_t *box); +const csch_ops_t *csch_op_get(csch_ctype_t type); + #endif