- Add a scrollbar
- Make sure the names of the variables are lined up (columns of equal width for all frames)
- Make sure the names of the variables are justified to the left
- More variable types
- Turn it into an actual meta-widget
- The [grid] geometry manager does not always comply to the sticky option - or at least that is what I saw with Tcl/Tk 8.4.1 (I know, oldish ;)) (Peter Spjuth helped with this one: I needed to allow the grid's columns to expand. Just a note, as below I use a spinbox instead)
- The width of the widgets inside this "editor" must be carefully controlled, otherwise you get different results with different platforms.
# properties.tcl --
# Simple properties editor
#
# PropertiesColor --
# Select a new color
#
# Arguments:
# wcolor Name of the label that gets the color
# var Name of the variable associated with it
# Result:
# None
#
proc PropertiesColor { wcolor var } {
set color [uplevel #0 [list set $var]]
set color [tk_chooseColor -initialcolor $color -parent $wcolor]
if { $color != "" } {
$wcolor configure -bg $color
uplevel #0 [list set $var $color]
}
}
# PropertiesShow --
# Show or hide a frame
#
# Arguments:
# wcheck Name of the checkbutton
# wframe Name of the frame
# Result:
# None
#
proc PropertiesShow { wcheck wframe row } {
set var [$wcheck cget -variable]
if { [uplevel #0 [list set $var]] == 1 } {
grid configure $wframe -row $row -sticky news
} else {
grid forget $wframe
}
}
# propertiesEditor --
# Create a new window to edit properties
#
# Arguments:
# widget Widget name
# properties Definition of the properties
# valuesName Name of a (global) variable containing the values
# Result:
# The widget name
#
proc propertiesEditor { widget properties valuesName } {
upvar #0 $valuesName values
set group 0
set row 0
set count 0
set w [frame $widget]
set wg $w
foreach {type name} $properties {
switch -- $type {
"group" {
set values($name) 1
set wt [checkbutton $widget.t$group -text $name \
-variable "${valuesName}($name)" \
-offrelief flat \
-overrelief flat ]
set wg [frame $widget.w$group -relief solid -bd 2 \
-bg white]
grid $wt -sticky w
grid $wg -sticky news
incr group
incr row
$wt configure -command [list PropertiesShow $wt $wg $row]
incr row
set count 0
}
"string" {
set wl [label $wg.l$count -text $name -fg black -bg white]
set we [entry $wg.e$count -textvariable "${valuesName}($name)" ]
grid $wl $we - -sticky w
incr count
}
"logical" {
#set wc [checkbutton $wg.c$count -text $name \
# -variable "${valuesName}($name)" -justify left]
#set dummy [label $wg.l$count -text " " ]
#grid $wc $dummy -sticky news ;# Stickiness does not work as I expected
set wl [label $wg.l$count -text $name \
-fg black -bg white]
set ws [spinbox $wg.s$count -values "True False" \
-textvariable "${valuesName}($name)" \
-fg black -bg white]
grid $wl $ws - -sticky w
incr count
}
"color" {
set wl [label $wg.l$count -text $name -fg black -bg white]
set wc [label $wg.c$count -text \
[string repeat " " 20] -bg $values($name)]
set wb [button $wg.b$count -text "Choose" \
-command [list PropertiesColor $wc "${valuesName}($name)"]]
grid $wl $wc $wb -sticky w
incr count
}
}
}
return $w
}
# main --
# Testing the above procedures
#
set valuesx(name) "My name"
set valuesx(address) "My address"
set valuesx(value) 0
set valuesx(myfavourite) red
set props {group Personalia
string name
string address
group Data
logical value
color myfavourite
}
set w [propertiesEditor .w $props valuesx]
pack $w -fill bothTV jul 19 05 Perhaps point to LemonTree.

