Index: trunk/src/change.c =================================================================== --- trunk/src/change.c (revision 10759) +++ trunk/src/change.c (revision 10760) @@ -408,7 +408,7 @@ static pcb_opfunc_t InvalLabelFunctions = { pcb_lineop_invalidate_label, - /*pcb_textop_invalidate_label*/ NULL, + pcb_textop_invalidate_label, pcb_polyop_invalidate_label, pcb_pinop_invalidate_label, NULL, Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 10759) +++ trunk/src/draw.c (revision 10760) @@ -473,6 +473,9 @@ /* draw the layer arcs on screen */ pcb_r_search(Layer->arc_tree, screen, NULL, pcb_arc_draw_term_callback, Layer, NULL); + + /* draw the layer text on screen */ + pcb_r_search(Layer->text_tree, screen, NULL, pcb_text_draw_term_callback, Layer, NULL); } else { /* draw all visible lines this layer */ @@ -480,13 +483,11 @@ /* draw the layer arcs on screen */ pcb_r_search(Layer->arc_tree, screen, NULL, pcb_arc_draw_callback, Layer, NULL); + + /* draw the layer text on screen */ + pcb_r_search(Layer->text_tree, screen, NULL, pcb_text_draw_callback, Layer, NULL); } - - /* draw the layer text on screen */ - pcb_r_search(Layer->text_tree, screen, NULL, pcb_text_draw_callback, Layer, NULL); - - /* The implicit outline rectangle (or automatic outline rectanlge). We should check for pcb_gui->gui here, but it's kinda cool seeing the auto-outline magically disappear when you first add something to @@ -617,6 +618,7 @@ case PCB_OBJ_LINE: pcb_line_draw_label((pcb_line_t *)obj); return; case PCB_OBJ_ARC: pcb_arc_draw_label((pcb_arc_t *)obj); return; case PCB_OBJ_POLYGON: pcb_poly_draw_label((pcb_polygon_t *)obj); return; + case PCB_OBJ_TEXT: pcb_text_draw_label((pcb_text_t *)obj); return; default: break; } } Index: trunk/src/gui_act.c =================================================================== --- trunk/src/gui_act.c (revision 10759) +++ trunk/src/gui_act.c (revision 10760) @@ -522,7 +522,7 @@ } /* toggle terminal ID print for subcircuit parts */ - type = pcb_search_screen(x, y, PCB_TYPE_SUBC | PCB_TYPE_SUBC_PART | PCB_TYPE_VIA | PCB_TYPE_LINE | PCB_TYPE_ARC | PCB_TYPE_POLYGON, (void **)&ptr1, (void **)&ptr2, (void **)&ptr3); + type = pcb_search_screen(x, y, PCB_TYPE_SUBC | PCB_TYPE_SUBC_PART | PCB_TYPE_VIA | PCB_TYPE_LINE | PCB_TYPE_ARC | PCB_TYPE_POLYGON | PCB_TYPE_TEXT, (void **)&ptr1, (void **)&ptr2, (void **)&ptr3); if (type) { pcb_any_obj_t *obj = ptr2; @@ -535,11 +535,9 @@ case PCB_TYPE_LINE: case PCB_TYPE_ARC: case PCB_TYPE_POLYGON: + case PCB_TYPE_TEXT: pcb_obj_invalidate_label(type, ptr1, ptr2, ptr3); break; -#warning term TODO: these; also convert this into an op so we don't need the switch here - case PCB_TYPE_TEXT: - default: return 0; /* nothing else can have a displayed name */ } Index: trunk/src/obj_text.c =================================================================== --- trunk/src/obj_text.c (revision 10759) +++ trunk/src/obj_text.c (revision 10760) @@ -565,6 +565,11 @@ return Text; } +void *pcb_textop_invalidate_label(pcb_opctx_t *ctx, pcb_text_t *text) +{ + pcb_text_name_invalidate_draw(text); + return text; +} /*** draw ***/ @@ -716,11 +721,50 @@ } } -void pcb_text_draw_(pcb_text_t *Text, pcb_coord_t min_line_width, int allow_term_gfx) +static pcb_bool is_text_term_vert(const pcb_text_t *text) { - DrawTextLowLevel_(Text, min_line_width, 0, 0, 0); + pcb_coord_t dx, dy; + + dx = text->BoundingBox.X2 - text->BoundingBox.X1; + if (dx < 0) + dx = -dx; + + dy = text->BoundingBox.Y2 - text->BoundingBox.Y1; + if (dy < 0) + dy = -dy; + + return dx < dy; } + +void pcb_text_name_invalidate_draw(pcb_text_t *txt) +{ + if (txt->term != NULL) { + pcb_text_t text; + pcb_term_label_setup(&text, (txt->BoundingBox.X1 + txt->BoundingBox.X2)/2, (txt->BoundingBox.Y1 + txt->BoundingBox.Y2)/2, + 100.0, is_text_term_vert(txt), pcb_true, txt->term); + pcb_draw_invalidate(&text); + } +} + +void pcb_text_draw_label(pcb_polygon_t *text) +{ + if (text->term != NULL) + pcb_term_label_draw((text->BoundingBox.X1 + text->BoundingBox.X2)/2, (text->BoundingBox.Y1 + text->BoundingBox.Y2)/2, + 100.0, is_text_term_vert(text), pcb_true, text->term); +} + + +void pcb_text_draw_(pcb_text_t *text, pcb_coord_t min_line_width, int allow_term_gfx) +{ + DrawTextLowLevel_(text, min_line_width, 0, 0, 0); + + if (text->term != NULL) { + if ((pcb_draw_doing_pinout) || PCB_FLAG_TEST(PCB_FLAG_TERMNAME, text)) + pcb_draw_delay_label_add((pcb_any_obj_t *)text); + } +} + static void pcb_text_draw(pcb_layer_t *layer, pcb_text_t *text, int allow_term_gfx) { int min_silk_line; @@ -754,6 +798,18 @@ return PCB_R_DIR_FOUND_CONTINUE; } +pcb_r_dir_t pcb_text_draw_term_callback(const pcb_box_t * b, void *cl) +{ + pcb_layer_t *layer = cl; + pcb_text_t *text = (pcb_text_t *) b; + + if (!PCB->SubcPartsOn && pcb_lobj_parent_subc(text->parent_type, &text->parent)) + return PCB_R_DIR_FOUND_CONTINUE; + + pcb_text_draw(layer, text, 1); + return PCB_R_DIR_FOUND_CONTINUE; +} + /* erases a text on a layer */ void pcb_text_invalidate_erase(pcb_layer_t *Layer, pcb_text_t *Text) { Index: trunk/src/obj_text_draw.h =================================================================== --- trunk/src/obj_text_draw.h (revision 10759) +++ trunk/src/obj_text_draw.h (revision 10760) @@ -30,6 +30,7 @@ /* Include rtree.h for these */ #ifdef PCB_RTREE_H pcb_r_dir_t pcb_text_draw_callback(const pcb_box_t * b, void *cl); +pcb_r_dir_t pcb_text_draw_term_callback(const pcb_box_t * b, void *cl); #endif void pcb_text_draw_(pcb_text_t *Text, pcb_coord_t min_line_width, int allow_term_gfx); @@ -36,4 +37,5 @@ void pcb_text_invalidate_erase(pcb_layer_t *Layer, pcb_text_t *Text); void pcb_text_invalidate_draw(pcb_layer_t *Layer, pcb_text_t *Text); void pcb_text_draw_xor(pcb_text_t *text, pcb_coord_t x, pcb_coord_t y); +void pcb_text_name_invalidate_draw(pcb_text_t *txt); Index: trunk/src/obj_text_op.h =================================================================== --- trunk/src/obj_text_op.h (revision 10759) +++ trunk/src/obj_text_op.h (revision 10760) @@ -43,4 +43,5 @@ void *pcb_textop_remove(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_text_t *Text); void *pcb_textop_rotate90(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_text_t *Text); void *pcb_textop_change_flag(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_text_t *Text); +void *pcb_textop_invalidate_label(pcb_opctx_t *ctx, pcb_text_t *text);