diff --git a/src/actions.c b/src/actions.c index 72374a1c..3b97d640 100644 --- a/src/actions.c +++ b/src/actions.c @@ -2197,18 +2197,18 @@ void place_text(int draw_text, double mx, double my) #endif tclsetvar("props",""); - tclsetvar("txt",""); + tclsetvar("retval",""); if(tclgetvar("hsize")==NULL) tclsetvar("hsize","0.4"); if(tclgetvar("vsize")==NULL) tclsetvar("vsize","0.4"); - tcleval("enter_text {text:}"); + tcleval("enter_text {text:} normal"); dbg(1, "place_text(): hsize=%s vsize=%s\n",tclgetvar("hsize"), tclgetvar("vsize") ); - txt = (char *)tclgetvar("txt"); + txt = (char *)tclgetvar("retval"); if(!strcmp(txt,"")) return; /* 01112004 dont allocate text object if empty string given */ push_undo(); /* 20150327 */ check_text_storage(); diff --git a/src/editprop.c b/src/editprop.c index 4861d4ec..9f886365 100644 --- a/src/editprop.c +++ b/src/editprop.c @@ -638,49 +638,41 @@ void edit_text_property(int x) int customfont; #endif int sel, k, text_changed; - int c,l; + int c,l, preserve; double xx1,yy1,xx2,yy2; double pcx,pcy; /* pin center 20070317 */ char property[1024];/* used for float 2 string conv (xscale and yscale) overflow safe */ const char *strlayer; + char *oldprop = NULL; dbg(1, "edit_text_property(): entering\n"); sel = selectedgroup[0].n; + my_strdup(656, &oldprop, textelement[sel].prop_ptr); if(textelement[sel].prop_ptr !=NULL) tclsetvar("props",textelement[sel].prop_ptr); else tclsetvar("props",""); /* 20171112 */ - tclsetvar("txt",textelement[sel].txt_ptr); - tclsetvar("retval",textelement[sel].txt_ptr); /* for viewdata */ + tclsetvar("retval",textelement[sel].txt_ptr); my_snprintf(property, S(property), "%.16g",textelement[sel].yscale); tclsetvar("vsize",property); my_snprintf(property, S(property), "%.16g",textelement[sel].xscale); tclsetvar("hsize",property); - if(x==0) tcleval("enter_text {text:}"); + if(x==0) tcleval("enter_text {text:} normal"); else if(x==2) tcleval("viewdata $::retval"); else if(x==1) tcleval("edit_vi_prop {Text:}"); else { fprintf(errfp, "edit_text_property() : unknown parameter x=%d\n",x); exit(EXIT_FAILURE); } - + preserve = atoi(tclgetvar("preserve_unchanged_attrs")); + text_changed=0; - if(x==0) { - if( strcmp(textelement[sel].txt_ptr, tclgetvar("txt") ) ) { - dbg(1, "edit_text_property(): x=0, text_changed=1\n"); - text_changed=1; - } else { - dbg(1, "edit_text_property(): x=0, text_changed=0\n"); - text_changed=0; - } - } else if(x==1) { - - /* 20080804 */ + if(x == 0 || x == 1) { if( strcmp(textelement[sel].txt_ptr, tclgetvar("retval") ) ) { - dbg(1, "edit_text_property(): x=1, text_changed=1\n"); + dbg(1, "edit_text_property(): x=%d, text_changed=1\n", x); text_changed=1; } else { - dbg(1, "edit_text_property(): x=1, text_changed=0\n"); + dbg(1, "edit_text_property(): x=%d, text_changed=0\n", x); text_changed=0; } } @@ -711,7 +703,7 @@ void edit_text_property(int x) dbg(1, "edit_property(): text props: props=%s text=%s\n", tclgetvar("props"), - tclgetvar("txt") ); + tclgetvar("retval") ); if(text_changed) { if(current_type==SYMBOL) { c = lastrect[PINLAYER]; @@ -743,7 +735,7 @@ void edit_text_property(int x) if(x==0) /* 20080804 */ my_strdup(71, &rect[PINLAYER][l].prop_ptr, subst_token(rect[PINLAYER][l].prop_ptr, "name", - (char *) tclgetvar("txt")) ); + (char *) tclgetvar("retval")) ); else my_strdup(72, &rect[PINLAYER][l].prop_ptr, subst_token(rect[PINLAYER][l].prop_ptr, "name", @@ -752,26 +744,26 @@ void edit_text_property(int x) } } } - if(x==0) /* 20080804 */ - my_strdup(73, &textelement[sel].txt_ptr, (char *) tclgetvar("txt")); - else /* 20080804 */ - my_strdup(74, &textelement[sel].txt_ptr, (char *) tclgetvar("retval")); + my_strdup(74, &textelement[sel].txt_ptr, (char *) tclgetvar("retval")); } if(x==0) { - my_strdup(75, &textelement[sel].prop_ptr,(char *) tclgetvar("props")); - my_strdup(76, &textelement[sel].font, get_tok_value(textelement[sel].prop_ptr, "font", 0));/*20171206 */ + if(preserve) + set_different_token(&textelement[sel].prop_ptr, (char *) tclgetvar("props"), oldprop, 0, 0); + else + my_strdup(75, &textelement[sel].prop_ptr,(char *) tclgetvar("props")); + my_strdup(76, &textelement[sel].font, get_tok_value(textelement[sel].prop_ptr, "font", 0));/*20171206 */ - strlayer = get_tok_value(textelement[sel].prop_ptr, "hcenter", 0); - textelement[sel].hcenter = strcmp(strlayer, "true") ? 0 : 1; - strlayer = get_tok_value(textelement[sel].prop_ptr, "vcenter", 0); - textelement[sel].vcenter = strcmp(strlayer, "true") ? 0 : 1; + strlayer = get_tok_value(textelement[sel].prop_ptr, "hcenter", 0); + textelement[sel].hcenter = strcmp(strlayer, "true") ? 0 : 1; + strlayer = get_tok_value(textelement[sel].prop_ptr, "vcenter", 0); + textelement[sel].vcenter = strcmp(strlayer, "true") ? 0 : 1; - strlayer = get_tok_value(textelement[sel].prop_ptr, "layer", 0); /* 20171206 */ - if(strlayer[0]) textelement[sel].layer = atoi(strlayer); - else textelement[sel].layer=-1; - textelement[sel].xscale=atof(tclgetvar("hsize")); - textelement[sel].yscale=atof(tclgetvar("vsize")); + strlayer = get_tok_value(textelement[sel].prop_ptr, "layer", 0); /* 20171206 */ + if(strlayer[0]) textelement[sel].layer = atoi(strlayer); + else textelement[sel].layer=-1; + textelement[sel].xscale=atof(tclgetvar("hsize")); + textelement[sel].yscale=atof(tclgetvar("vsize")); } /* calculate bbox, some cleanup needed here */ @@ -793,6 +785,7 @@ void edit_text_property(int x) draw(); bbox(END,0.0,0.0,0.0,0.0); } + my_free(890, &oldprop); } static char *old_prop=NULL; diff --git a/src/xschem.tcl b/src/xschem.tcl index 6f806535..ff951694 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -1485,8 +1485,8 @@ proc select_netlist_dir { force {dir {} }} { return $netlist_dir } -proc enter_text {textlabel} { - global txt rcode has_cairo +proc enter_text {textlabel {preserve_disabled disabled}} { + global retval rcode has_cairo preserve_unchanged_attrs set rcode {} toplevel .t -class Dialog wm title .t {Enter text} @@ -1497,11 +1497,16 @@ proc enter_text {textlabel} { # 20100203 if { $::wm_fix } { tkwait visibility .t } wm geometry .t "+$X+$Y" - label .t.txtlab -text $textlabel + frame .t.f1 + label .t.f1.txtlab -text $textlabel text .t.txt -width 100 -height 12 .t.txt delete 1.0 end - .t.txt insert 1.0 $txt - pack .t.txtlab .t.txt -side top -fill x + .t.txt insert 1.0 $retval + checkbutton .t.f1.l1 -text "preserve unchanged props" -variable preserve_unchanged_attrs -state $preserve_disabled + pack .t.f1 -side top -fill x -expand yes + pack .t.f1.l1 -side left + pack .t.f1.txtlab -side left -expand yes -fill x + pack .t.txt -side top -fill both -expand yes frame .t.edit frame .t.edit.lab @@ -1526,7 +1531,7 @@ proc enter_text {textlabel} { frame .t.buttons button .t.buttons.ok -text "OK" -command \ { - set txt [.t.txt get 1.0 {end - 1 chars}] + set retval [.t.txt get 1.0 {end - 1 chars}] if {$has_cairo} { set hsize $vsize } @@ -1535,7 +1540,7 @@ proc enter_text {textlabel} { } button .t.buttons.cancel -text "Cancel" -command \ { - set txt {} + set retval {} set rcode {} destroy .t } @@ -1559,14 +1564,14 @@ proc enter_text {textlabel} { pack .t.buttons.b4 -side left -fill x -expand yes pack .t.buttons -side bottom -fill x bind .t { - if ![string compare $txt [.t.txt get 1.0 {end - 1 chars}]] { + if ![string compare $retval [.t.txt get 1.0 {end - 1 chars}]] { .t.buttons.cancel invoke } } bind .t {.t.buttons.ok invoke} #grab set .t tkwait window .t - return $txt + return $retval } # evaluate a tcl command from GUI diff --git a/xschem_library/examples/greycnt.sym b/xschem_library/examples/greycnt.sym index e324a5fd..791ff7cb 100644 --- a/xschem_library/examples/greycnt.sym +++ b/xschem_library/examples/greycnt.sym @@ -1,4 +1,4 @@ -v {xschem version=2.9.5_RC5 file_version=1.1} +v {xschem version=2.9.7 file_version=1.2} G {type=subcircuit format="@name @pinlist @symname" verilog_stop=true