From e347a251b0e712c3898d7ed880da5d0e6345b1fe Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Wed, 21 Feb 2024 14:02:58 +0100 Subject: [PATCH] load_file_dialog: separate search/file entries, better keyboard navigation --- src/xschem.tcl | 99 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 68 insertions(+), 31 deletions(-) diff --git a/src/xschem.tcl b/src/xschem.tcl index 838981a6..8e6db6cd 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -3327,6 +3327,7 @@ proc file_dialog_set_home {dir} { proc setglob {dir} { global file_dialog_globfilter file_dialog_files2 OS + # puts "setglob: $dir, filter=$file_dialog_globfilter" set file_dialog_files2 [lsort [glob -nocomplain -directory $dir -tails -type d .* *]] if { $file_dialog_globfilter eq {*}} { set file_dialog_files2 ${file_dialog_files2}\ [lsort [ @@ -3464,36 +3465,41 @@ proc file_dialog_display_preview {f} { proc file_dialog_right_listboxselect {dirselect} { global file_dialog_yview file_dialog_dir1 file_dialog_dir2 file_dialog_retval - global OS file_dialog_loadfile file_dialog_index1 file_dialog_files1 + global OS file_dialog_loadfile file_dialog_index1 file_dialog_files1 file_dialog_globfilter set file_dialog_yview [.load.l.paneright.f.list yview] set file_dialog_sel [.load.l.paneright.f.list curselection] if { $file_dialog_sel ne {} } { + set curr_dir [abs_sym_path [lindex $file_dialog_files1 $file_dialog_index1]] set curr_item [.load.l.paneright.f.list get $file_dialog_sel] - if { !$dirselect && ($curr_item eq {..} || $curr_item eq {.}) } { - set file_dialog_retval { } - return - } - set file_dialog_dir1 [abs_sym_path [lindex $file_dialog_files1 $file_dialog_index1]] - set file_dialog_dir2 $curr_item - if {$file_dialog_dir2 eq {..}} { - set file_dialog_d [file dirname $file_dialog_dir1] - } elseif {$file_dialog_dir2 eq {.} } { - set file_dialog_d $file_dialog_dir1 + + if {$curr_item eq {..}} { + set file_dialog_d [file dirname $curr_dir] + } elseif {$curr_item eq {.} } { + set file_dialog_d $curr_dir } else { if {$OS == "Windows"} { - if {[regexp {^[A-Za-z]\:/$} $file_dialog_dir1]} { - set file_dialog_d "$file_dialog_dir1$file_dialog_dir2" + if {[regexp {^[A-Za-z]\:/$} $curr_dir]} { + set file_dialog_d "$curr_dir$curr_item" } else { - set file_dialog_d "$file_dialog_dir1/$file_dialog_dir2" + set file_dialog_d "$curr_dir/$curr_item" } } else { - if {$file_dialog_dir1 eq "/"} { - set file_dialog_d "$file_dialog_dir1$file_dialog_dir2" + if {$curr_dir eq "/"} { + set file_dialog_d "$curr_dir$curr_item" } else { - set file_dialog_d "$file_dialog_dir1/$file_dialog_dir2" + set file_dialog_d "$curr_dir/$curr_item" } } } + + if { !$dirselect && [file isdirectory $file_dialog_d] } { + .load.buttons_bot.entry delete 0 end + set file_dialog_retval { } + return + } + + set file_dialog_dir1 $curr_dir + set file_dialog_dir2 $curr_item if { [file isdirectory $file_dialog_d]} { bind .load.l.paneright.draw {} bind .load.l.paneright.draw {} @@ -3502,15 +3508,16 @@ proc file_dialog_right_listboxselect {dirselect} { setglob $file_dialog_d file_dialog_set_colors2 set file_dialog_dir1 $file_dialog_d - # .load.buttons_bot.entry delete 0 end } else { .load.buttons_bot.entry delete 0 end .load.buttons_bot.entry insert 0 $file_dialog_dir2 - file_dialog_display_preview $file_dialog_dir1/$file_dialog_dir2 + + file_dialog_display_preview $file_dialog_d # puts "xschem preview_window draw .load.l.paneright.draw \"$file_dialog_dir1/$file_dialog_dir2\"" } } if {$file_dialog_loadfile == 2} { + # set to something different to any file to force a new placement in file_dialog_place_symbol set file_dialog_retval { } } } @@ -3534,6 +3541,7 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} set file_dialog_loadfile $loadfile if {$ext ne {}} {set file_dialog_ext $ext} set file_dialog_globfilter $file_dialog_ext + set file_dialog_save_initialfile $initialf set file_dialog_retval {} upvar #0 $global_initdir initdir @@ -3553,6 +3561,7 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} if { $loadfile == 2} {frame .load.l.recent -takefocus 0} frame .load.l.paneleft -takefocus 0 eval [subst {listbox .load.l.paneleft.list -listvariable file_dialog_names1 -width 40 -height 12 \ + -highlightcolor red -highlightthickness 2 \ -yscrollcommand ".load.l.paneleft.yscroll set" -selectmode browse \ -xscrollcommand ".load.l.paneleft.xscroll set" -exportselection 0}] if { ![catch {.load.l.paneleft.list cget -justify}]} { @@ -3569,10 +3578,10 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} if { $file_dialog_sel ne {} } { set file_dialog_dir1 [abs_sym_path [lindex $file_dialog_files1 $file_dialog_sel]] set file_dialog_index1 $file_dialog_sel - #### avoid clearing search entry and resetting glob filter - #### when changing directory in left listbox - # set file_dialog_globfilter $file_dialog_ext - # if {$file_dialog_save_initialfile eq {}} {.load.buttons_bot.entry delete 0 end} + + set file_dialog_globfilter *[.load.buttons_bot.src get]* + if { $file_dialog_globfilter eq {**} } { set file_dialog_globfilter * } + setglob $file_dialog_dir1 file_dialog_set_colors2 } @@ -3588,6 +3597,7 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} listbox .load.l.paneright.f.list -listvariable file_dialog_files2 -width 20 -height 12\ + -highlightcolor red -highlightthickness 2 \ -yscrollcommand ".load.l.paneright.f.yscroll set" -selectmode browse \ -xscrollcommand ".load.l.paneright.f.xscroll set" -exportselection 0 scrollbar .load.l.paneright.f.yscroll -command ".load.l.paneright.f.list yview" -takefocus 0 @@ -3637,14 +3647,18 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} .load.l.paneright.f.list selection clear 0 end .load.l.paneleft.list selection set $file_dialog_index1 } - label .load.buttons_bot.label -text { File/Search:} - entry .load.buttons_bot.entry + label .load.buttons_bot.srclab -text { Search:} + entry .load.buttons_bot.src -takefocus 0 -width 5 + .load.buttons_bot.src delete 0 end + .load.buttons_bot.src insert 0 $file_dialog_globfilter + label .load.buttons_bot.label -text { File:} + entry .load.buttons_bot.entry -highlightcolor red -highlightthickness 2 if { $file_dialog_save_initialfile ne {} } { .load.buttons_bot.entry insert 0 $file_dialog_save_initialfile } - bind .load.buttons_bot.entry { + bind .load.buttons_bot.src { if {$file_dialog_save_initialfile eq {} } { - set file_dialog_globfilter *[.load.buttons_bot.entry get]* + set file_dialog_globfilter *[.load.buttons_bot.src get]* if { $file_dialog_globfilter eq {**} } { set file_dialog_globfilter * } setglob $file_dialog_dir1 if {[.load.buttons_bot.entry get] ne {}} { @@ -3671,11 +3685,26 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} # } radiobutton .load.buttons_bot.all -text All -variable file_dialog_globfilter -value {*} -takefocus 0 \ - -command { set file_dialog_ext $file_dialog_globfilter; setglob $file_dialog_dir1 } + -command { + set file_dialog_ext $file_dialog_globfilter + setglob $file_dialog_dir1 + .load.buttons_bot.src delete 0 end + .load.buttons_bot.src insert 0 $file_dialog_globfilter + } radiobutton .load.buttons_bot.sym -text .sym -variable file_dialog_globfilter -value {*.sym} -takefocus 0 \ - -command { set file_dialog_ext $file_dialog_globfilter; setglob $file_dialog_dir1 } + -command { + set file_dialog_ext $file_dialog_globfilter + setglob $file_dialog_dir1 + .load.buttons_bot.src delete 0 end + .load.buttons_bot.src insert 0 $file_dialog_globfilter + } radiobutton .load.buttons_bot.sch -text .sch -variable file_dialog_globfilter -value {*.sch} -takefocus 0 \ - -command { set file_dialog_ext $file_dialog_globfilter; setglob $file_dialog_dir1 } + -command { + set file_dialog_ext $file_dialog_globfilter + setglob $file_dialog_dir1 + .load.buttons_bot.src delete 0 end + .load.buttons_bot.src insert 0 $file_dialog_globfilter + } button .load.buttons.up -width 5 -text Up -command {load_file_dialog_up $file_dialog_dir1} -takefocus 0 label .load.buttons.mkdirlab -text { New dir: } -fg blue entry .load.buttons.newdir -width 16 -takefocus 0 @@ -3702,6 +3731,8 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} pack .load.buttons.newdir -expand true -fill x -side left pack .load.buttons.rmdir .load.buttons.mkdir -side right pack .load.buttons_bot.all .load.buttons_bot.sym .load.buttons_bot.sch -side left + pack .load.buttons_bot.srclab -side left + pack .load.buttons_bot.src -side left pack .load.buttons_bot.label -side left pack .load.buttons_bot.entry -side left -fill x -expand true pack .load.buttons_bot.cancel .load.buttons_bot.ok -side left @@ -3715,7 +3746,9 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} if { $loadfile != 2} { bind .load " set file_dialog_retval \[.load.buttons_bot.entry get\] - if {\$file_dialog_retval ne {} } { + if {\$file_dialog_retval ne {} && !\[file isdirectory \$file_dialog_retval\]} { + bind .load.l.paneright.draw {} + bind .load.l.paneright.draw {} destroy .load xschem preview_window destroy {} {} set $global_initdir \"\$file_dialog_dir1\" @@ -3773,6 +3806,10 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} } } + bind .load.l.paneright.f.list { + file_dialog_right_listboxselect 1 + } + bind .load.l.paneright.f.list { file_dialog_right_listboxselect 1 }