load_file_dialog: separate search/file entries, better keyboard navigation

This commit is contained in:
stefan schippers 2024-02-21 14:02:58 +01:00
parent 69dec6c677
commit e347a251b0
1 changed files with 68 additions and 31 deletions

View File

@ -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 <Expose> {}
bind .load.l.paneright.draw <Configure> {}
@ -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 <KeyRelease> {
bind .load.buttons_bot.src <KeyRelease> {
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 <Return> "
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 <Expose> {}
bind .load.l.paneright.draw <Configure> {}
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 <KeyRelease-Return> {
file_dialog_right_listboxselect 1
}
bind .load.l.paneright.f.list <ButtonRelease-1> {
file_dialog_right_listboxselect 1
}