From e19dbd7ff3a2137b4753b1ad57550377434c753b Mon Sep 17 00:00:00 2001 From: Igor2 Date: Sat, 21 Nov 2015 17:18:14 +0100 Subject: [PATCH 1/5] New select box API: can list IDs. Signed-off-by: bert --- src/select.c | 104 +++++++++++++++++++++++++++++++++------------------------ 1 files changed, 60 insertions(+), 44 deletions(-) diff --git a/src/select.c b/src/select.c index c2cb130..de468ab 100644 --- a/src/select.c +++ b/src/select.c @@ -208,14 +208,38 @@ SelectObject (void) } /* ---------------------------------------------------------------------- - * selects/unselects all visible objects within the passed box - * "select" determines if the block is to be selected or unselected - * returns true if the state of any object has changed + * selects/unselects or lists visible objects within the passed box + * If len is NULL: + * Flag determines if the block is to be selected or unselected + * returns non-NULL if the state of any object has changed + * if len is non-NULLL + * returns a list of object IDs matched the search and loads len with the + * length of the list. Returns NULL on no match. */ -bool -SelectBlock (BoxType *Box, bool select) +static long int * +ListBlock_ (BoxType *Box, bool Flag, int *len) { - bool changed = false; + int changed = 0; + int used = 0, alloced = 0; + long int *list = NULL; + + /* append an object to the return list OR set the flag if there's no list */ +#define append(undo_type, p1, obj) \ + do { \ + if (len == NULL) { \ + AddObjectToFlagUndoList (undo_type, p1, obj, obj); \ + ASSIGN_FLAG (SELECTEDFLAG, Flag, obj); \ + } \ + else { \ + if (used >= alloced) { \ + alloced += 64; \ + list = realloc(list, sizeof(*list) * alloced); \ + } \ + list[used] = obj->ID; \ + used++; \ + } \ + changed = 1; \ +} while(0) if (PCB->RatOn || !select) RAT_LOOP (PCB->Data); @@ -223,11 +247,9 @@ SelectBlock (BoxType *Box, bool select) if (LINE_IN_BOX ((LineType *) line, Box) && !TEST_FLAG (LOCKFLAG, line) && TEST_FLAG (SELECTEDFLAG, line) != select) { - AddObjectToFlagUndoList (RATLINE_TYPE, line, line, line); - ASSIGN_FLAG (SELECTEDFLAG, select, line); + append(RATLINE_TYPE, line, line); if (PCB->RatOn) DrawRat (line); - changed = true; } } END_LOOP; @@ -255,11 +277,9 @@ SelectBlock (BoxType *Box, bool select) && !TEST_FLAG (LOCKFLAG, line) && TEST_FLAG (SELECTEDFLAG, line) != select) { - AddObjectToFlagUndoList (LINE_TYPE, layer, line, line); - ASSIGN_FLAG (SELECTEDFLAG, select, line); + append(LINE_TYPE, layer, line); if (layer->On) DrawLine (layer, line); - changed = true; } } END_LOOP; @@ -269,11 +289,9 @@ SelectBlock (BoxType *Box, bool select) && !TEST_FLAG (LOCKFLAG, arc) && TEST_FLAG (SELECTEDFLAG, arc) != select) { - AddObjectToFlagUndoList (ARC_TYPE, layer, arc, arc); - ASSIGN_FLAG (SELECTEDFLAG, select, arc); + append(ARC_TYPE, layer, arc); if (layer->On) DrawArc (layer, arc); - changed = true; } } END_LOOP; @@ -285,11 +303,9 @@ SelectBlock (BoxType *Box, bool select) && !TEST_FLAG (LOCKFLAG, text) && TEST_FLAG (SELECTEDFLAG, text) != select) { - AddObjectToFlagUndoList (TEXT_TYPE, layer, text, text); - ASSIGN_FLAG (SELECTEDFLAG, select, text); + append(TEXT_TYPE, layer, text); if (TEXT_IS_VISIBLE(PCB, layer, text)) DrawText (layer, text); - changed = true; } } } @@ -300,11 +316,9 @@ SelectBlock (BoxType *Box, bool select) && !TEST_FLAG (LOCKFLAG, polygon) && TEST_FLAG (SELECTEDFLAG, polygon) != select) { - AddObjectToFlagUndoList (POLYGON_TYPE, layer, polygon, polygon); - ASSIGN_FLAG (SELECTEDFLAG, select, polygon); + append(POLYGON_TYPE, layer, polygon); if (layer->On) DrawPolygon (layer, polygon); - changed = true; } } END_LOOP; @@ -330,30 +344,23 @@ SelectBlock (BoxType *Box, bool select) /* select all names of element */ ELEMENTTEXT_LOOP (element); { - AddObjectToFlagUndoList (ELEMENTNAME_TYPE, - element, text, text); - ASSIGN_FLAG (SELECTEDFLAG, select, text); + append(ELEMENTNAME_TYPE, element, text); } END_LOOP; if (PCB->ElementOn) DrawElementName (element); - changed = true; } if ((PCB->PinOn || !select) && ELEMENT_IN_BOX (element, Box)) if (TEST_FLAG (SELECTEDFLAG, element) != select) { - AddObjectToFlagUndoList (ELEMENT_TYPE, - element, element, element); - ASSIGN_FLAG (SELECTEDFLAG, select, element); + append(ELEMENT_TYPE, element, element); PIN_LOOP (element); { if (TEST_FLAG (SELECTEDFLAG, pin) != select) { - AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); - ASSIGN_FLAG (SELECTEDFLAG, select, pin); + append(PIN_TYPE, element, pin); if (PCB->PinOn) DrawPin (pin); - changed = true; } } END_LOOP; @@ -361,11 +368,9 @@ SelectBlock (BoxType *Box, bool select) { if (TEST_FLAG (SELECTEDFLAG, pad) != select) { - AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); - ASSIGN_FLAG (SELECTEDFLAG, select, pad); + append(PAD_TYPE, element, pad); if (PCB->PinOn) DrawPad (pad); - changed = true; } } END_LOOP; @@ -382,11 +387,9 @@ SelectBlock (BoxType *Box, bool select) if ((VIA_OR_PIN_IN_BOX (pin, Box) && TEST_FLAG (SELECTEDFLAG, pin) != select)) { - AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); - ASSIGN_FLAG (SELECTEDFLAG, select, pin); + append(PIN_TYPE, element, pin); if (PCB->PinOn) DrawPin (pin); - changed = true; } } END_LOOP; @@ -398,11 +401,9 @@ SelectBlock (BoxType *Box, bool select) || PCB->InvisibleObjectsOn || !select)) { - AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); - ASSIGN_FLAG (SELECTEDFLAG, select, pad); + append(PAD_TYPE, element, pad); if (PCB->PinOn) DrawPad (pad); - changed = true; } } END_LOOP; @@ -418,11 +419,9 @@ SelectBlock (BoxType *Box, bool select) && !TEST_FLAG (LOCKFLAG, via) && TEST_FLAG (SELECTEDFLAG, via) != select) { - AddObjectToFlagUndoList (VIA_TYPE, via, via, via); - ASSIGN_FLAG (SELECTEDFLAG, select, via); + append(VIA_TYPE, via, via); if (PCB->ViaOn) DrawVia (via); - changed = true; } } END_LOOP; @@ -431,7 +430,24 @@ SelectBlock (BoxType *Box, bool select) Draw (); IncrementUndoSerialNumber (); } - return (changed); + + if (len == NULL) { + static long int non_zero; + return (changed ? &non_zero : NULL); + } +} +#undef append + +/* ---------------------------------------------------------------------- + * selects/unselects all visible objects within the passed box + * Flag determines if the block is to be selected or unselected + * returns true if the state of any object has changed + */ +bool +SelectBlock (BoxType *Box, bool Flag) +{ + /* do not list, set flag */ + return (ListBlock_ (Box, Flag, NULL) == NULL) ? false : true; } /* ---------------------------------------------------------------------- -- 1.7.3.4