|
tixDirTreeの使い方に特に変わったところはありませんが、
キー入力でディレクトリを移動できると便利だなあとGNOMEのgmcファイルマネージャを見ながら思ったので、
その機能だけ付け足しました。ディレクトリ名を編集してENTERキーを押すと、
tixDirTreeのchdirサブコマンドでそのディレクトリにフォーカスを移動させています。
また、tixDirTreeがクリックされてフォーカスが変わるたびに、
-browsecmdオプションで指定したコマンドでエントリ内のディレクトリ文字列を変えています。
なお将来の版ではTix自身がドラッグ/ドロップ機能を持つことになるようです。
ソースプログラムです。
package require Tix
package require tkdnd
package require pife
option add *Font kanji16
wm title . "Sample Directory Viewer"
set m [menu .m]
. configure -menu $m
set mf [menu $m.mf]
$mf add command -label "終了" -command exit
$m add cascade -label "ファイル" -menu $mf
set fa [frame .fa -rel groove -bd 2]
set g [tixDirTree $fa.g -width 200 -height 320 \
-showhidden 1 -command "dirTreeClickCmd $fa.g" \
-browsecmd "dirTreeClickCmd $fa.g" ]
pack $g
set fb [frame .fb -rel groove -bd 2]
set g [tixHList $fb.g -xsc "$fb.scrh set" -ysc "$fb.scrv set" \
-separator / -width 40 -height 20 -columns 3 -header 1 \
-command "hlistActivateCmd $fb.g" -fg "#0000c0" ]
scrollbar $fb.scrv -ori v -command "$g yview"
scrollbar $fb.scrh -ori h -command "$g xview"
grid $g -row 1 -col 1
grid $fb.scrv -row 1 -col 2 -sti ns
grid $fb.scrh -row 2 -col 1 -sti ew
$g header create 0 -text 名前
$g header create 1 -text サイズ
$g header create 2 -text 更新時刻
dnd bindsource $g text/uri-list "return \[getSelectedFileName $g\]"
bind $g <Button-1> {
if {[llength [%W info selection]] > 0} {
dnd drag %W -actions {copy move link}
}
}
bind $g <Button1-Leave> { break }
set fm [frame .fm -rel groove -bd 2]
set ea [entry $fm.ea -width 60 -textvariable xvCwd]
set xvCwd [.fa.g cget -value]
pack $ea
bind $ea <Key-Return> {.fa.g chdir $xvCwd; dirTreeClickCmd .fb.g $xvCwd}
proc dirTreeClickCmd {g dirs} {
global xvCwd
set dir [lindex $dirs 0]
set xvCwd $dir
set ha ".fb.g"
$ha delete all
set i 0
foreach e [glob -nocomplain [file join $dir *]] {
set a [file tail $e]
$ha add $i -text $a -itemtype text
$ha item create $i 1 -text [file size $e]
$ha item create $i 2 -text [clock format [file mtime $e] \
-format {%Y/%m/%d %H:%M:%S}]
incr i
}
}
proc getSelectedFileName g {
set dir [.fa.g cget -value]
set r {}
foreach e [$g info selection] {
lappend r [file join $dir [$g entrycget $e -text]] }
return $r
}
set ICount 0
proc hlistActivateCmd {g index} {
global ICount
set e [$g entrycget $index -text]
set dir [.fa.g cget -value]
set path [file join $dir $e]
if [file isdirectory $path] return
set w [toplevel .g$ICount]
wm title $w $path
set im [image create photo Image$ICount -file $path]
pack [set la [label $w.la -image $im]]
bind $la <Button-3> "destroy $w"
incr ICount
}
pack $fm -side top -anc w
pack $fa $fb -side left
# end.
|
(first uploaded 2001/09/22 last updated (not ever), MISUMI URANO)
|