From 574900e1df4d11a8b8069c053812ec6c101f98d6 Mon Sep 17 00:00:00 2001 From: schippes Date: Sun, 16 Aug 2020 15:08:17 +0200 Subject: [PATCH] combobox is editable so new attributes can be directly typed in --- src/editprop.c | 41 ++++++++++++++++++++++++++- src/scheduler.c | 14 ++++++---- src/token.c | 10 +++---- src/xschem.tcl | 73 +++++++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 121 insertions(+), 17 deletions(-) diff --git a/src/editprop.c b/src/editprop.c index b6564e7b..f8125a18 100644 --- a/src/editprop.c +++ b/src/editprop.c @@ -867,7 +867,21 @@ void update_symbol(const char *result, int x) dbg(1, "update_symbol(): tcl retval==%s\n", tclgetvar("retval")); } else { - my_strdup(80, &new_prop, (char *) tclgetvar("retval")); + + const char *tok; + tok = tclgetvar("selected_tok"); + + if(x == 0 && strcmp(tok, "")) { + + tcleval("regsub -all {\\\\?\"} $retval {\\\\\"} retval"); + tcleval("set retval \\\"${retval}\\\""); + + my_strdup(656, &new_prop, + subst_token(old_prop, tok, (char *) tclgetvar("retval") ) + ); + } else { + my_strdup(80, &new_prop, (char *) tclgetvar("retval")); + } dbg(1, "update_symbol(): new_prop=%s\n", new_prop); } @@ -1082,10 +1096,15 @@ void change_elem_order(void) void edit_property(int x) { int j; + if(!has_x) return; rebuild_selected_array(); /* from the .sel field in objects build */ if(lastselected==0 ) /* the array of selected objs */ { + const char *tok; + char *old_prop = NULL; + char *new_prop = NULL; + if(netlist_type==CAD_SYMBOL_ATTRS && current_type==SCHEMATIC) { if(schsymbolprop!=NULL) /*09112003 */ tclsetvar("retval",schsymbolprop); @@ -1117,6 +1136,8 @@ void edit_property(int x) tclsetvar("retval",""); } + my_strdup(660, &old_prop, tclgetvar("retval")); + if(x==0) tcleval("text_line {Global schematic property:} 0"); else if(x==1) { dbg(1, "edit_property(): executing edit_vi_prop\n"); @@ -1125,6 +1146,24 @@ void edit_property(int x) else if(x==2) tcleval("viewdata $::retval"); dbg(1, "edit_property(): done executing edit_vi_prop, result=%s\n",tclresult()); dbg(1, "edit_property(): rcode=%s\n",tclgetvar("rcode") ); + + tok = tclgetvar("selected_tok"); + if(x == 0 && strcmp(tok, "")) { + + tcleval("regsub -all {\\\\?\"} $retval {\\\\\"} retval"); + tcleval("set retval \\\"${retval}\\\""); + + my_strdup(890, &new_prop, + subst_token(old_prop, tok, (char *) tclgetvar("retval") ) + ); + } else { + my_strdup(650, &new_prop, (char *) tclgetvar("retval")); + } + tclsetvar("retval", new_prop); + my_free(892, &old_prop); + my_free(893, &new_prop); + + if(strcmp(tclgetvar("rcode"),"") ) { if(current_type==SYMBOL && /* 20120404 added case for symbol editing, use schvhdlprop regardless of netlisting mode */ diff --git a/src/scheduler.c b/src/scheduler.c index a86cb4a6..456d8a51 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1109,11 +1109,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg } } - else if(!strcmp(argv[1],"update_symbol") ) { - if(argc >= 3) update_symbol(argv[2],0); - else update_symbol(NULL, 0); - } - else if(!strcmp(argv[1], "print_hilight_net") && argc == 3) { print_hilight_net(atoi(argv[2])); } @@ -1137,6 +1132,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg } } + else if(!strcmp(argv[1],"print") ) { /* 20171022 added png, svg */ if(argc==2 || (argc==3 && !strcmp(argv[2],"pdf")) ) { ps_draw(); @@ -1149,6 +1145,14 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg } } + else if(!strcmp(argv[1],"gettok") ) + { + char *s=NULL; + Tcl_ResetResult(interp); + my_strdup(648, &s, get_tok_value(argv[2], argv[3], 0)); + Tcl_AppendResult(interp, s, NULL); + my_free(649, &s); + } else if(!strcmp(argv[1],"load_symbol") ) { if(argc==3) { diff --git a/src/token.c b/src/token.c index 9b964ddc..f6a4f147 100644 --- a/src/token.c +++ b/src/token.c @@ -372,9 +372,6 @@ int set_different_token(char **s,char *new, char *old, int object, int n) token[token_pos]='\0'; token_pos=0; } - } else if(state==XEND) { - value[value_pos]='\0'; - value_pos=0; get_tok_value(new,token,1); if(get_tok_size == 0 ) { @@ -390,6 +387,9 @@ int set_different_token(char **s,char *new, char *old, int object, int n) mod=1; my_strdup(443, s, subst_token(*s, token, NULL) ); } + } else if(state==XEND) { + value[value_pos]='\0'; + value_pos=0; state=XBEGIN; } if(c=='\0') break; @@ -2531,7 +2531,7 @@ char *translate(int inst, char* s) tmp=strlen(tmp_sym_name); if(result_pos + tmp>=size) { size=(1+(result_pos + tmp) / CADCHUNKALLOC) * CADCHUNKALLOC; - my_realloc(531, &result,size); + my_realloc(453, &result,size); } memcpy(result+result_pos,tmp_sym_name, tmp+1); /* 20180923 */ result_pos+=tmp; @@ -2809,7 +2809,7 @@ char* translate2(struct Lcc *lcc, int level, char* s) tmp = strlen(tmp_sym_name); if (result_pos + tmp >= size) { size = (1 + (result_pos + tmp) / CADCHUNKALLOC) * CADCHUNKALLOC; - my_realloc(665, &result, size); + my_realloc(655, &result, size); } memcpy(result + result_pos, tmp_sym_name, tmp + 1); result_pos += tmp; diff --git a/src/xschem.tcl b/src/xschem.tcl index ff8bc20f..d1725430 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -1929,7 +1929,7 @@ proc edit_vi_netlist_prop {txtlabel} { if [string compare $tmp $retval] { set retval $tmp regsub -all {\\?"} $retval {\\"} retval - set retval "\"${retval}\"" + set retval \"${retval}\" if $tcl_debug<=-1 then {puts "modified"} set rcode ok return $rcode @@ -1971,9 +1971,10 @@ proc change_color {} { proc edit_prop {txtlabel} { global edit_prop_size infowindow_text selected_tok edit_symbol_prop_new_sel edit_prop_pos global prev_symbol retval symbol rcode no_change_attrs preserve_unchanged_attrs copy_cell tcl_debug - global user_wants_copy_cell editprop_sympath + global user_wants_copy_cell editprop_sympath retval_orig set user_wants_copy_cell 0 set rcode {} + set retval_orig $retval if $tcl_debug<=-1 then {puts " edit_prop{}: retval=$retval"} if { [winfo exists .dialog] } return toplevel .dialog -class Dialog @@ -2079,7 +2080,7 @@ proc edit_prop {txtlabel} { set tok_list " [xschem list_tokens $retval 0]" set selected_tok {} label .dialog.f2.r4 -text { Edit Attr:} - ttk::combobox .dialog.f2.r5 -values $tok_list -textvariable selected_tok -state readonly -width 10 + ttk::combobox .dialog.f2.r5 -values $tok_list -textvariable selected_tok -width 14 pack .dialog.f1.l2 .dialog.f1.e2 .dialog.f1.b1 .dialog.f1.b2 .dialog.f1.b3 .dialog.f1.b4 .dialog.f1.b5 -side left -expand 1 pack .dialog.f4 -side top -anchor nw @@ -2090,8 +2091,8 @@ proc edit_prop {txtlabel} { pack .dialog.f2.r1 -side left pack .dialog.f2.r2 -side left pack .dialog.f2.r3 -side left - # pack .dialog.f2.r4 -side left - # pack .dialog.f2.r5 -side left + pack .dialog.f2.r4 -side left + pack .dialog.f2.r5 -side left pack .dialog.yscroll -side right -fill y pack .dialog.xscroll -side bottom -fill x pack .dialog.e1 -fill both -expand yes @@ -2103,6 +2104,30 @@ proc edit_prop {txtlabel} { } } + bind .dialog.f2.r5 <> { + if {$selected_tok eq {} } { + set retval $retval_orig + } else { + set retval [xschem gettok $retval_orig $selected_tok] + regsub -all {\\?"} $retval {"} retval + } + .dialog.e1 delete 1.0 end + .dialog.e1 insert 1.0 $retval + } + + bind .dialog.f2.r5 { + set selected_tok [.dialog.f2.r5 get] + if {$selected_tok eq {} } { + set retval $retval_orig + } else { + set retval [xschem gettok $retval_orig $selected_tok] + regsub -all {\\?"} $retval {"} retval + } + .dialog.e1 delete 1.0 end + .dialog.e1 insert 1.0 $retval + } + + if {$edit_symbol_prop_new_sel == 1} { wm geometry .dialog $edit_prop_pos } @@ -2143,7 +2168,8 @@ proc write_data {data f} { proc text_line {txtlabel clear {preserve_disabled disabled} } { global text_line_default_geometry preserve_unchanged_attrs - global retval rcode tcl_debug + global retval rcode tcl_debug tok_list selected_tok retval_orig + set retval_orig $retval if $clear==1 then {set retval ""} if $tcl_debug<=-1 then {puts " text_line{}: clear=$clear"} if $tcl_debug<=-1 then {puts " text_line{}: retval=$retval"} @@ -2154,6 +2180,8 @@ proc text_line {txtlabel clear {preserve_disabled disabled} } { set X [expr [winfo pointerx .dialog] - 60] set Y [expr [winfo pointery .dialog] - 35] + set tok_list " [xschem list_tokens $retval 0]" + set selected_tok {} # 20160325 change and remember widget size bind .dialog { # puts [wm geometry .dialog] @@ -2201,6 +2229,10 @@ proc text_line {txtlabel clear {preserve_disabled disabled} } { { .dialog.e1 delete 1.0 end } + set selected_tok {} + label .dialog.f1.r4 -text { Edit Attr:} + ttk::combobox .dialog.f1.r5 -values $tok_list -textvariable selected_tok -width 14 + checkbutton .dialog.f0.l2 -text "preserve unchanged props" -variable preserve_unchanged_attrs -state $preserve_disabled pack .dialog.f0 -fill x pack .dialog.f0.l2 -side left @@ -2210,6 +2242,8 @@ proc text_line {txtlabel clear {preserve_disabled disabled} } { pack .dialog.f1.b2 -side left -fill x -expand yes pack .dialog.f1.b3 -side left -fill x -expand yes pack .dialog.f1.b4 -side left -fill x -expand yes + pack .dialog.f1.r4 -side left + pack .dialog.f1.r5 -side left pack .dialog.yscroll -side right -fill y @@ -2220,6 +2254,33 @@ proc text_line {txtlabel clear {preserve_disabled disabled} } { .dialog.f1.b2 invoke } } + + bind .dialog.f1.r5 <> { + if {$selected_tok eq {} } { + set retval $retval_orig + } else { + set retval [xschem gettok $retval_orig $selected_tok] + regsub -all {\\?"} $retval {"} retval + } + .dialog.e1 delete 1.0 end + .dialog.e1 insert 1.0 $retval + } + + + + bind .dialog.f1.r5 { + set selected_tok [.dialog.f1.r5 get] + if {$selected_tok eq {} } { + set retval $retval_orig + } else { + set retval [xschem gettok $retval_orig $selected_tok] + regsub -all {\\?"} $retval {"} retval + } + .dialog.e1 delete 1.0 end + .dialog.e1 insert 1.0 $retval + } + + bind .dialog {.dialog.f1.b1 invoke} #tkwait visibility .dialog #grab set .dialog