dgw::combobox
DDG 2018-10-11: A snidget widget which behaves like a normal ttk::combobox but it is able to popup the internal listbox and filters the list items by the input given in the entry. The user just must supply the option -hidehits true.
Installation as Tcl-module
Put the file with the source code somewhere in a directory like /home/username/tcl/dgw/combobox-0.1.tm In your code you would now have to write:
tcl::tm::path add /home/username/tcl package require dgw::combobox
See below for the code and an example usage.
SOURCE
package require Tk 8.5
package require tile
package require snit
namespace eval ::dgw { }
snit::widget ::dgw::combobox {
option -values [list]
# without -hidenohits true
# we have a normal
# ttk combobox
option -hidenohits false
variable Values
delegate option * to combo except [list -values -postcommand]
delegate method * to combo
component combo
constructor {args} {
$self configurelist $args
install combo using ttk::combobox $win.combo -values $options(-values) \
-postcommand [mymethod UpdateValues]
bind $combo <KeyRelease> [mymethod Post %K]
bind $combo <Control-space> [mymethod Post %K]
pack $combo -side top -fill x -expand false
set Values $options(-values)
}
onconfigure -values {vals} {
set Values $vals
set options(-values) $vals
if {[winfo exists $combo]} {
$combo configure -values $Values
}
}
method UpdateValues {} {
set text [string map [list {[} {\[} {]} {\]}] [$combo get]]
$combo configure -values [lsearch -all -inline $Values $text*]
}
method Post {key} {
#puts $key
if {$options(-hidenohits)} {
$self UpdateValues
# save acces to internal function
if {[string equal [info commands ::ttk::combobox::Post] ::ttk::combobox::Post]} {
if {$key eq "Return"} { return }
::ttk::combobox::Post $combo
if {$key ne "Down" && [llength [$combo cget -values]] > 1} {
after 100 [list focus $combo]
} elseif {$key eq "Down"} {
set lb $combo.popdown.f.l
if {[winfo exists $lb]} {
after 100 [list focus $lb]
}
}
}
}
}
}
package provide dgw::combobox 0.1
if {$argv0 eq [info script]} {
wm title . "DGApp"
pack [label .l0 -text "standard combobox"]
ttk::combobox .c1 -values [list done1 done2 dtwo dthree four five six seven]
pack .c1 -side top
pack [label .l1 -text "combobox with filtering"]
dgw::combobox .c2 -values [list done1 done2 dtwo dthree four five six seven] \
-hidenohits true
pack .c2 -side top
}