|
|
|
|
|
|
|
|
|
|
|
if {![info exists widgetDemo]} { |
|
error "This script should be run from the \"widget\" demo." |
|
} |
|
|
|
package require Tk |
|
|
|
set w .mclist |
|
catch {destroy $w} |
|
toplevel $w |
|
wm title $w "Multi-Column List" |
|
wm iconname $w "mclist" |
|
positionWindow $w |
|
|
|
|
|
ttk::label $w.msg -font $font -wraplength 4i -justify left -anchor n -padding {10 2 10 6} -text "Ttk is the new Tk themed widget set. One of the widgets it includes is a tree widget, which can be configured to display multiple columns of informational data without displaying the tree itself. This is a simple way to build a listbox that has multiple columns. Clicking on the heading for a column will sort the data by that column. You can also change the width of the columns by dragging the boundary between them." |
|
pack $w.msg -fill x |
|
|
|
|
|
pack [addSeeDismiss $w.seeDismiss $w] -side bottom -fill x |
|
|
|
ttk::frame $w.container |
|
ttk::treeview $w.tree -columns {country capital currency} -show headings \ |
|
-yscroll "$w.vsb set" -xscroll "$w.hsb set" |
|
ttk::scrollbar $w.vsb -orient vertical -command "$w.tree yview" |
|
ttk::scrollbar $w.hsb -orient horizontal -command "$w.tree xview" |
|
pack $w.container -fill both -expand 1 |
|
grid $w.tree $w.vsb -in $w.container -sticky nsew |
|
grid $w.hsb -in $w.container -sticky nsew |
|
grid column $w.container 0 -weight 1 |
|
grid row $w.container 0 -weight 1 |
|
|
|
image create photo upArrow -data { |
|
R0lGODlhDgAOAJEAANnZ2YCAgPz8/P///yH5BAEAAAAALAAAAAAOAA4AAAImhI+ |
|
py+1LIsJHiBAh+BgmiEAJQITgW6DgUQIAECH4JN8IPqYuNxUAOw==} |
|
image create photo downArrow -data { |
|
R0lGODlhDgAOAJEAANnZ2YCAgPz8/P///yH5BAEAAAAALAAAAAAOAA4AAAInhI+ |
|
py+1I4ocQ/IgDEYIPgYJICUCE4F+YIBolEoKPEJKZmVJK6ZACADs=} |
|
image create photo noArrow -height 14 -width 14 |
|
|
|
|
|
set data { |
|
Argentina {Buenos Aires} ARS |
|
Australia Canberra AUD |
|
Brazil Brazilia BRL |
|
Canada Ottawa CAD |
|
China Beijing CNY |
|
France Paris EUR |
|
Germany Berlin EUR |
|
India {New Delhi} INR |
|
Italy Rome EUR |
|
Japan Tokyo JPY |
|
Mexico {Mexico City} MXN |
|
Russia Moscow RUB |
|
{South Africa} Pretoria ZAR |
|
{United Kingdom} London GBP |
|
{United States} {Washington, D.C.} USD |
|
} |
|
|
|
|
|
set font [ttk::style lookup Heading -font] |
|
foreach col {country capital currency} name {Country Capital Currency} { |
|
$w.tree heading $col -text $name -image noArrow -anchor w \ |
|
-command [list SortBy $w.tree $col 0] |
|
$w.tree column $col -width [expr { |
|
[font measure $font $name] + [image width noArrow] + 5 |
|
}] |
|
} |
|
set font [ttk::style lookup Treeview -font] |
|
foreach {country capital currency} $data { |
|
$w.tree insert {} end -values [list $country $capital $currency] |
|
foreach col {country capital currency} { |
|
set len [font measure $font "[set $col] "] |
|
if {[$w.tree column $col -width] < $len} { |
|
$w.tree column $col -width $len |
|
} |
|
} |
|
} |
|
|
|
|
|
proc SortBy {tree col direction} { |
|
|
|
foreach c {country capital currency} { |
|
set s [$tree heading $c state] |
|
if {("selected" in $s || "alternate" in $s) && $col ne $c} { |
|
|
|
$tree heading $c -image noArrow state {!selected !alternate !user1} |
|
set direction [expr {"alternate" in $s}] |
|
} |
|
} |
|
|
|
|
|
set data {} |
|
foreach row [$tree children {}] { |
|
lappend data [list [$tree set $row $col] $row] |
|
} |
|
|
|
set dir [expr {$direction ? "-decreasing" : "-increasing"}] |
|
set r -1 |
|
|
|
|
|
foreach info [lsort -dictionary -index 0 $dir $data] { |
|
$tree move [lindex $info 1] {} [incr r] |
|
} |
|
|
|
|
|
$tree heading $col -command [list SortBy $tree $col [expr {!$direction}]] \ |
|
state [expr {$direction?"!selected alternate":"selected !alternate"}] |
|
if {[ttk::style theme use] eq "aqua"} { |
|
|
|
$tree heading $col state "user1" |
|
} else { |
|
$tree heading $col -image [expr {$direction?"upArrow":"downArrow"}] |
|
} |
|
} |
|
|