combobox is editable so new attributes can be directly typed in

This commit is contained in:
schippes 2020-08-16 15:08:17 +02:00
parent 2aed232e04
commit 574900e1df
4 changed files with 121 additions and 17 deletions

View File

@ -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, "<ALL>")) {
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, "<ALL>")) {
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 */

View File

@ -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) {

View File

@ -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;

View File

@ -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 "<ALL> [xschem list_tokens $retval 0]"
set selected_tok {<ALL>}
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 <<ComboboxSelected>> {
if {$selected_tok eq {<ALL>} } {
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 <KeyRelease> {
set selected_tok [.dialog.f2.r5 get]
if {$selected_tok eq {<ALL>} } {
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 "<ALL> [xschem list_tokens $retval 0]"
set selected_tok {<ALL>}
# 20160325 change and remember widget size
bind .dialog <Configure> {
# 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 {<ALL>}
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 <<ComboboxSelected>> {
if {$selected_tok eq {<ALL>} } {
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 <KeyRelease> {
set selected_tok [.dialog.f1.r5 get]
if {$selected_tok eq {<ALL>} } {
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 <Control-Return> {.dialog.f1.b1 invoke}
#tkwait visibility .dialog
#grab set .dialog