📄 listbox.tcl
字号:
# Command ListBox::itemcget# ----------------------------------------------------------------------------proc ListBox::itemcget { path item option } { return [Widget::cget $path.$item $option]}# ----------------------------------------------------------------------------# Command ListBox::bindText# ----------------------------------------------------------------------------proc ListBox::bindText { path event script } { if { $script != "" } { set map [list %W $path] set script [string map $map $script] $path.c bind "click" $event "$script \[ListBox::_get_current $path]" } else { $path.c bind "click" $event {} }}# ----------------------------------------------------------------------------# Command ListBox::bindImage# ----------------------------------------------------------------------------proc ListBox::bindImage { path event script } { if { $script != "" } { set map [list %W $path] set script [string map $map $script] $path.c bind "img" $event "$script \[ListBox::_get_current $path]" } else { $path.c bind "img" $event {} }}# ----------------------------------------------------------------------------# Command ListBox::delete# ----------------------------------------------------------------------------proc ListBox::delete { path args } { variable $path upvar 0 $path data foreach litems $args { foreach item $litems { set idx [lsearch -exact $data(items) $item] if { $idx != -1 } { set data(items) [lreplace $data(items) $idx $idx] Widget::destroy $path.$item if { [info exists data(upd,create,$item)] } { unset data(upd,create,$item) } else { lappend data(upd,delete) $item } } } } set sel $data(selitems) set data(selitems) {} eval [list selection $path set] $sel _redraw_idle $path 2}# ----------------------------------------------------------------------------# Command ListBox::move# ----------------------------------------------------------------------------proc ListBox::move { path item index } { variable $path upvar 0 $path data if { [set idx [lsearch -exact $data(items) $item]] == -1 } { return -code error "item \"$item\" does not exist" } set data(items) [linsert [lreplace $data(items) $idx $idx] $index $item] _redraw_idle $path 2}# ----------------------------------------------------------------------------# Command ListBox::reorder# ----------------------------------------------------------------------------proc ListBox::reorder { path neworder } { variable $path upvar 0 $path data set data(items) [BWidget::lreorder $data(items) $neworder] _redraw_idle $path 2}# ----------------------------------------------------------------------------# Command ListBox::selection# ----------------------------------------------------------------------------proc ListBox::selection { path cmd args } { variable $path upvar 0 $path data switch -- $cmd { set { set data(selitems) {} foreach item $args { if { [lsearch -exact $data(selitems) $item] == -1 } { if { [lsearch -exact $data(items) $item] != -1 } { lappend data(selitems) $item } } } } add { foreach item $args { if { [lsearch -exact $data(selitems) $item] == -1 } { if { [lsearch -exact $data(items) $item] != -1 } { lappend data(selitems) $item } } } } remove { foreach item $args { if { [set idx [lsearch -exact $data(selitems) $item]] != -1 } { set data(selitems) [lreplace $data(selitems) $idx $idx] } } } clear { set data(selitems) {} } get { return $data(selitems) } includes { return [expr {[lsearch -exact $data(selitems) $args] != -1}] } default { return } } _redraw_idle $path 1}# ----------------------------------------------------------------------------# Command ListBox::exists# ----------------------------------------------------------------------------proc ListBox::exists { path item } { variable $path upvar 0 $path data return [expr {[lsearch -exact $data(items) $item] != -1}]}# ----------------------------------------------------------------------------# Command ListBox::index# ----------------------------------------------------------------------------proc ListBox::index { path item } { variable $path upvar 0 $path data if {[string equal $item "active"]} { return [$path selection get] } return [lsearch -exact $data(items) $item]}# ----------------------------------------------------------------------------# ListBox::find# Returns the item given a position.# findInfo @x,y ?confine?# lineNumber# ----------------------------------------------------------------------------proc ListBox::find {path findInfo {confine ""}} { variable $path upvar 0 $path widgetData if {[regexp -- {^@([0-9]+),([0-9]+)$} $findInfo match x y]} { set x [$path.c canvasx $x] set y [$path.c canvasy $y] } elseif {[regexp -- {^[0-9]+$} $findInfo lineNumber]} { set dy [Widget::getoption $path -deltay] set y [expr {$dy*($lineNumber+0.5)}] set confine "" } else { return -code error "invalid find spec \"$findInfo\"" } set found 0 set xi 0 foreach xs $widgetData(xlist) { if {$x <= $xs} { foreach id [$path.c find overlapping $xi $y $xs $y] { set ltags [$path.c gettags $id] set item [lindex $ltags 0] if { [string equal $item "item"] || [string equal $item "img"] || [string equal $item "win"] } { # item is the label or image/window of the node set item [string range [lindex $ltags 1] 2 end] set found 1 break } } break } set xi $xs } if {$found} { if {[string equal $confine "confine"]} { # test if x stand inside node bbox set xi [expr {[lindex [$path.c coords n:$item] 0]-[Widget::getoption $path -padx]}] set xs [lindex [$path.c bbox n:$item] 2] if {$x >= $xi && $x <= $xs} { return $item } } else { return $item } } return ""}# ----------------------------------------------------------------------------# Command ListBox::item - deprecated# ----------------------------------------------------------------------------proc ListBox::item { path first {last ""} } { variable $path upvar 0 $path data if { ![string length $last] } { return [lindex $data(items) $first] } else { return [lrange $data(items) $first $last] }}# ----------------------------------------------------------------------------# Command ListBox::items# ----------------------------------------------------------------------------proc ListBox::items { path {first ""} {last ""}} { variable $path upvar 0 $path data if { ![string length $first] } { return $data(items) } if { ![string length $last] } { return [lindex $data(items) $first] } else { return [lrange $data(items) $first $last] }}# ----------------------------------------------------------------------------# Command ListBox::see# ----------------------------------------------------------------------------proc ListBox::see { path item } { variable $path upvar 0 $path data if { [Widget::getoption $path -redraw] && $data(upd,afterid) != "" } { after cancel $data(upd,afterid) _redraw_listbox $path } set idn [$path.c find withtag n:$item] if { $idn != "" } { ListBox::_see $path $idn right ListBox::_see $path $idn left }}# ----------------------------------------------------------------------------# Command ListBox::edit# ----------------------------------------------------------------------------proc ListBox::edit { path item text {verifycmd ""} {clickres 0} {select 1}} { variable _edit variable $path upvar 0 $path data if { [Widget::getoption $path -redraw] && $data(upd,afterid) != "" } { after cancel $data(upd,afterid) _redraw_listbox $path } set idn [$path.c find withtag n:$item] if { $idn != "" } { ListBox::_see $path $idn right ListBox::_see $path $idn left set oldfg [$path.c itemcget $idn -fill] set sbg [Widget::getoption $path -selectbackground] set coords [$path.c coords $idn] set x [lindex $coords 0] set y [lindex $coords 1] set bd [expr {[$path.c cget -borderwidth]+[$path.c cget -highlightthickness]}] set w [expr {[winfo width $path] - 2*$bd}] set wmax [expr {[$path.c canvasx $w]-$x}] $path.c itemconfigure $idn -fill [Widget::getoption $path -background] $path.c itemconfigure s:$item -fill {} -outline {} set _edit(text) $text set _edit(wait) 0 set frame [frame $path.edit \ -relief flat -borderwidth 0 -highlightthickness 0 \ -background [Widget::getoption $path -background]] set ent [entry $frame.edit \ -width 0 \ -relief solid \ -borderwidth 1 \ -highlightthickness 0 \ -foreground [_getoption $path $item -foreground] \ -background [Widget::getoption $path -background] \ -selectforeground [Widget::getoption $path -selectforeground] \ -selectbackground $sbg \ -font [_getoption $path $item -font] \ -textvariable ListBox::_edit(text)] pack $ent -ipadx 8 -anchor w set idw [$path.c create window $x $y -window $frame -anchor w] trace variable ListBox::_edit(text) w [list ListBox::_update_edit_size $path $ent $idw $wmax] tkwait visibility $ent grab $frame BWidget::focus set $ent _update_edit_size $path $ent $idw $wmax update if { $select } { $ent selection range 0 end $ent icursor end $ent xview end } bindtags $ent [list $ent Entry] bind $ent <Escape> {set ListBox::_edit(wait) 0} bind $ent <Return> {set ListBox::_edit(wait) 1} if { $clickres == 0 || $clickres == 1 } { bind $frame <Button> [list set ListBox::_edit(wait) $clickres] } set ok 0 while { !$ok } { tkwait variable ListBox::_edit(wait) if { !$_edit(wait) || $verifycmd == "" || [uplevel \#0 $verifycmd [list $_edit(text)]] } { set ok 1 } } trace vdelete ListBox::_edit(text) w [list ListBox::_update_edit_size $path $ent $idw $wmax] grab release $frame BWidget::focus release $ent destroy $frame $path.c delete $idw $path.c itemconfigure $idn -fill $oldfg $path.c itemconfigure s:$item -fill $sbg -outline $sbg if { $_edit(wait) } { return $_edit(text) } } return ""}# ----------------------------------------------------------------------------# Command ListBox::xview# ----------------------------------------------------------------------------proc ListBox::xview { path args } { return [eval [list $path.c xview] $args]}# ----------------------------------------------------------------------------# Command ListBox::yview# ----------------------------------------------------------------------------proc ListBox::yview { path args } { return [eval [list $path.c yview] $args]}proc ListBox::getcanvas { path } { return $path.c}proc ListBox::curselection { path } { return [$path selection get]}# ----------------------------------------------------------------------------# Command ListBox::_update_edit_size# ----------------------------------------------------------------------------proc ListBox::_update_edit_size { path entry idw wmax args } { set entw [winfo reqwidth $entry] if { $entw >= $wmax } { $path.c itemconfigure $idw -width $wmax } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -