📄 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 + -