Richard Suchenwirth 2007-09-28 - Installing Visual Studio 8, I found a listbox with some buttons to insert, delete, or move up or down items, and as I was waiting for a lengthy build, of course I had to try this in Tcl too :^)
For the "insert" function, a little overrideredirect toplevel with an entry is overlaid. This is however not very robust: pixel geometry needed to be tweaked (and is probably not right for other windowing themes), and it is only destroyed when the user hits <Return>. If he doesn't, multiple of those may be scattered over the screen... Improvement hints are very welcome. AEC Couldn't you bind the entry widget to the <FocusOut> event and destroy the toplevel? Also couldn't you simply use the place geometry manager and place an entry widget rather than using the overrideredirect toplevel? - RS: Oh yes, thanks! Fixed the insert and rewrite methods accordingly.
proc xlb'delete w {
set sel [$w curselection]
$w delete $sel
if {$sel==[$w size]} {incr sel -1}
$w selection set $sel
}
proc xlb'insert w {
set sel [$w curselection]
if {$sel eq ""} {set sel 0}
$w insert $sel ""
$w selection clear 0 end
$w selection set $sel
foreach {x0 y0 x1 y1} [$w bbox $sel] break
destroy $w.e
place [entry $w.e -textvariable $w] -x [expr {$x0-4}] -y [expr {$y0-4}]
focus $w.e
set ::$w ""
bind $w.e <Return> [list xlb'rewrite $w $sel]
}
proc xlb'rewrite {w sel} {
global $w
$w delete $sel
$w insert $sel [set $w]
$w selection set $sel
destroy $w.e
}
proc xlb'move {w offset} {
set sel [$w curselection]
if {$sel ne "" && ($offset==-1 && $sel>0 || $offset==1 && $sel<[$w size]-1)} {
set it [$w get $sel]
$w delete $sel
incr sel $offset
$w insert $sel $it
$w selection set $sel
}
}
#-- Test and demo:
pack [frame .f] -anchor e
button .f.+ -width 2 -text + -command {xlb'insert .l}
button .f.x -width 2 -text x -command {xlb'delete .l}
button .f.up -width 2 -text \u2191 -command {xlb'move .l -1}
button .f.dn -width 2 -text \u2193 -command {xlb'move .l 1}
eval pack [winfo children .f] -side left
pack [listbox .l]
.l insert end foo bar grill baz wibbleAMG: I think that's the first time I've ever seen [place] used for good, not evil. :^)
MG spots a few minor bugs while playing around with this: