Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 28884) +++ trunk/src/buffer.c (revision 28885) @@ -95,16 +95,29 @@ static int move_buffer_pre(pcb_opctx_t *ctx, pcb_any_obj_t *obj, void *ptr3) { - TODO("extobj floater: move the whole subc instead"); + pcb_subc_t *subc = pcb_extobj_get_floater_subc(obj); + +pcb_trace("move buff %p\n", subc); /* when an edit-object is moved to buffer, the corresponding subc obj needs to be moved too */ -/* pcb_subcop_move_buffer(ctx, subc);*/ + if (subc != NULL) { + pcb_subcop_move_buffer(ctx, subc); + return 1; + } return 0; } static int add_buffer_pre(pcb_opctx_t *ctx, pcb_any_obj_t *obj, void *ptr3) { - TODO("extobj floater: move the whole subc instead"); + pcb_subc_t *subc = pcb_extobj_get_floater_subc(obj); + +pcb_trace("add buff %p\n", subc); + /* when an edit-object is moved to buffer, the corresponding subc obj needs to be moved too */ + if (subc != NULL) { + pcb_subcop_add_to_buffer(ctx, subc); + return 1; + } return 0; + } int pcb_set_buffer_bbox(pcb_buffer_t *Buffer) Index: trunk/src/extobj.h =================================================================== --- trunk/src/extobj.h (revision 28884) +++ trunk/src/extobj.h (revision 28885) @@ -122,6 +122,25 @@ eo->chg_attr(subc, key, value); } +PCB_INLINE pcb_subc_t *pcb_extobj_get_floater_subc(pcb_any_obj_t *flt) +{ + pcb_subc_t *subc; + pcb_extobj_t *eo; + + if (!PCB_FLAG_TEST(PCB_FLAG_FLOATER, flt)) + return NULL; + + subc = pcb_obj_parent_subc(flt); + if (subc == NULL) + return NULL; + + eo = pcb_extobj_get(subc); + if (eo == NULL) + return NULL; + + return subc; +} + PCB_INLINE int pcb_extobj_del_floater(pcb_any_obj_t *flt) { pcb_subc_t *subc; Index: trunk/src/operation.c =================================================================== --- trunk/src/operation.c (revision 28884) +++ trunk/src/operation.c (revision 28885) @@ -222,7 +222,7 @@ if ((type & (PCB_OBJ_SUBC | PCB_OBJ_SUBC_PART)) && F->subc) { PCB_SUBC_LOOP(data); { - if (!on_locked_too && PCB_FLAG_TEST(PCB_FLAG_LOCK, subc)) + if (!on_locked_too && PCB_FLAG_TEST(PCB_FLAG_LOCK, subc) && (subc->extobj == NULL)) /* extobj: even locked means floaters can be operated on */ continue; if (PCB_FLAG_TEST(PCB_FLAG_SELECTED, subc)) { if (Reset) { @@ -237,7 +237,7 @@ if (exto != NULL) pcb_extobj_float_geo(exto); changed = pcb_true; } - else if ((pcb->loose_subc) || (type & PCB_OBJ_SUBC_PART)) { + else if ((pcb->loose_subc) || (type & PCB_OBJ_SUBC_PART) || (subc->extobj != NULL)) { if (pcb_selected_operation(pcb, subc->data, F, ctx, Reset, type, on_locked_too)) changed = pcb_true; }