diff --git a/doc/xschem_man/developer_info.html b/doc/xschem_man/developer_info.html index 06d9e035..e5676ad7 100644 --- a/doc/xschem_man/developer_info.html +++ b/doc/xschem_man/developer_info.html @@ -813,6 +813,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
  • textlayer layer number for texts
  • top_path get top hier path of current window (always "" for tabbed if)
  • topwindow same as top_path but main window returned as "."
  • +
  • ui_state return UI state
  • version return xschem version
  • wirelayer layer used for wires
  • wires number of wires
  • diff --git a/src/scheduler.c b/src/scheduler.c index c1e66f13..f25ead3d 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1725,6 +1725,12 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg Tcl_SetResult(interp, top_path,TCL_VOLATILE); } break; + case 'u': + if(!strcmp(argv[2], "ui_state")) { /* return UI state */ + if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} + Tcl_SetResult(interp, my_itoa(xctx->ui_state), TCL_VOLATILE); + } + break; case 'v': if(!strcmp(argv[2], "version")) { /* return xschem version */ Tcl_SetResult(interp, XSCHEM_VERSION, TCL_VOLATILE); diff --git a/src/xschem.tcl b/src/xschem.tcl index ba2cbee2..10b4df34 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -4791,16 +4791,17 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} #### Display preview of selected symbol proc insert_symbol_focusin {} { - puts insert_symbol_focusin + # puts insert_symbol_focusin set sel [.ins.center.left.l curselection] if {$sel eq {}} { set sel [.ins.center.left.l index active] .ins.center.left.l selection set active + insert_symbol_preview } } proc insert_symbol_preview {} { - puts insert_symbol_preview + # puts insert_symbol_preview global insert_symbol xschem preview_window close .ins.center.right {} .ins.center.right configure -bg white @@ -4816,35 +4817,48 @@ proc insert_symbol_preview {} { if {$f ne {}} { set type [is_xschem_file $f] if {$type ne {0}} { + .ins.top.dir_e configure -state normal + .ins.top.dir_e delete 0 end + .ins.top.dir_e insert 0 [file dirname [rel_sym_path $f]] + .ins.top.dir_e configure -state readonly .ins.center.right configure -bg {} xschem preview_window create .ins.center.right {} xschem preview_window draw .ins.center.right [list $f] bind .ins.center.right "xschem preview_window draw .ins.center.right [list $f]" bind .ins.center.right "xschem preview_window draw .ins.center.right [list $f]" } + insert_symbol_place } } } # new alternate insert_symbol browser #### fill list of files matching pattern -proc insert_symbol_filelist {paths {maxdepth 1}} { - puts insert_symbol_filelist +proc insert_symbol_filelist {paths {maxdepth -1}} { + # puts insert_symbol_filelist global insert_symbol set insert_symbol(regex) [.ins.top.pat_e get] + + #check if regex is valid + set err [catch {regexp $insert_symbol(regex) {12345}} res] + if {$err} {return} + set f [match_file $insert_symbol(regex) $paths $maxdepth] set insert_symbol(list) {} set insert_symbol(fullpathlist) {} .ins.center.left.l activate 0 foreach i $f { - set fname [rel_sym_path $i] - lappend insert_symbol(list) $fname - lappend insert_symbol(fullpathlist) $i + set type [regexp $insert_symbol(ext) $i] + if {$type} { + set fname [rel_sym_path $i] + lappend insert_symbol(list) $fname + lappend insert_symbol(fullpathlist) $i + } } } proc insert_symbol_place {} { - puts insert_symbol_place + # puts insert_symbol_place global insert_symbol set sel [.ins.center.left.l curselection] if {$sel eq {}} { @@ -4856,6 +4870,7 @@ proc insert_symbol_place {} { if {$f ne {}} { set type [is_xschem_file $f] if {$type ne {0}} { + xschem abort_operation xschem place_symbol $f } } @@ -4864,9 +4879,10 @@ proc insert_symbol_place {} { #### paths: list of paths to use for listing symbols #### maxdepth: how many levels to descend for each $paths directory (-1: no limit) -proc insert_symbol {{paths {}} {maxdepth 1}} { +proc insert_symbol {{paths {}} {maxdepth -1} {ext {.*}}} { global insert_symbol # xschem set semaphore [expr {[xschem get semaphore] +1}] + set insert_symbol(ext) $ext toplevel .ins frame .ins.top -takefocus 0 panedwindow .ins.center -orient horizontal -height 8c @@ -4888,26 +4904,34 @@ proc insert_symbol {{paths {}} {maxdepth 1}} { label .ins.top.pat_l -text Pattern: entry .ins.top.pat_e -width 20 -highlightcolor red -highlightthickness 2 \ -highlightbackground [option get . background {}] + label .ins.top.dir_l -text Dir: + entry .ins.top.dir_e -width 50 -takefocus 0 -state readonly if {[info exists insert_symbol(regex)]} { .ins.top.pat_e insert 0 $insert_symbol(regex) } + + bind .ins {.ins.bottom.dismiss invoke} bind .ins.top.pat_e " if {{%K} ne {Tab}} { insert_symbol_filelist [list $paths] [list $maxdepth] + } else { } " bind .ins.center.left.l <> { insert_symbol_preview } - bind .ins.center.left.l { insert_symbol_focusin } + bind .ins.center.left.l { insert_symbol_focusin } button .ins.bottom.dismiss -takefocus 0 -text Dismiss -command { - xschem preview_window close .ins.center.right {} - destroy .ins + if { [xschem get ui_state] & 8192 } { + xschem abort_operation + } else { + xschem preview_window close .ins.center.right {} + destroy .ins + } } - button .ins.bottom.insert -takefocus 0 -text Insert -command { - insert_symbol_place - } - pack .ins.bottom.insert .ins.bottom.dismiss -side left + pack .ins.bottom.dismiss -side left pack .ins.top.pat_l -side left pack .ins.top.pat_e -side left + pack .ins.top.dir_l -side left + pack .ins.top.dir_e -side left insert_symbol_filelist $paths $maxdepth # tkwait window .ins # xschem set semaphore [expr {[xschem get semaphore] -1}] @@ -6717,15 +6741,25 @@ proc viewdata {data {ro {}} {win .view}} { } proc sub_match_file { f {paths {}} {maxdepth -1} } { - global pathlist match_file_dir_arr match_file_level + global pathlist match_file_dir_arr match_file_level nolist_libs set res {} if {$paths eq {}} {set paths $pathlist} foreach i $paths { foreach j [glob -nocomplain -directory $i *] { + set skip 0 + foreach k $nolist_libs { + if {[regexp $k $j]} { + set skip 1 + break + } + } + if {$skip} { continue } + if {[file isdirectory $j] && [file readable $j]} { if { $maxdepth == -1 || $match_file_level < $maxdepth} { set jj [regsub {/ $} [file normalize ${j}/\ ] {}] - if {[array names match_file_dir_arr -exact $jj] == {}} { + # if {[array names match_file_dir_arr -exact $jj] == {}} { ... } + if {![info exists match_file_dir_arr($jj)]} { set match_file_dir_arr($jj) 1 incr match_file_level set sub_res [sub_match_file $f $j $maxdepth] ;# recursive call @@ -6734,9 +6768,11 @@ proc sub_match_file { f {paths {}} {maxdepth -1} } { } } } else { - set fname $j - if {[regexp $f $fname]} { - lappend res $j + if {![info exists match_file_dir_arr($j)]} { + set match_file_dir_arr($j) 1 + if {[regexp $f $j]} { + lappend res $j + } } } } @@ -6757,15 +6793,26 @@ proc match_file { f {paths {}} {maxdepth -1} } { } proc sub_find_file { f {paths {}} {first 0} {maxdepth -1}} { - global pathlist match_file_dir_arr match_file_level + global pathlist match_file_dir_arr match_file_level nolist_libs set res {} if {$paths eq {}} {set paths $pathlist} foreach i $paths { foreach j [glob -nocomplain -directory $i *] { + + set skip 0 + foreach k $nolist_libs { + if {[regexp $k $j]} { + set skip 1 + break + } + } + if {$skip} { continue } + if {[file isdirectory $j] && [file readable $j]} { if { $maxdepth == -1 || $match_file_level < $maxdepth} { set jj [regsub {/ $} [file normalize ${j}/\ ] {}] - if {[array names match_file_dir_arr -exact $jj] == {}} { + # if {[array names match_file_dir_arr -exact $jj] == {}} { ... } + if {![info exists match_file_dir_arr($jj)]} { set match_file_dir_arr($jj) 1 incr match_file_level set sub_res [sub_find_file $f $j $first $maxdepth] ;# recursive call @@ -6778,9 +6825,12 @@ proc sub_find_file { f {paths {}} {first 0} {maxdepth -1}} { } } else { set fname [file tail $j] - if {$fname == $f} { - lappend res $j - if {$first} {return $res} + if {![info exists match_file_dir_arr($j)]} { + set match_file_dir_arr($j) 1 + if {$fname == $f} { + lappend res $j + if {$first} {return $res} + } } } }