Managing the Preferences File
The preference settings are saved in the per-user file. The file is divided into two parts. The tail is automatically rewritten by the preferences package. Users can manually add resource specifications to the beginning of the file and they will be preserved:
Example 45-8 Saving preferences settings to a file
# PrefSave writes the resource specifications to the
# end of the per-user resource file,
proc PrefSave {} {
global pref
if [catch {
set old [open $pref(userDefaults) r]
set oldValues [split [read $old] \n]
close $old
}] {
set oldValues {}
}
if [catch {open $pref(userDefaults).new w} out] {
.pref.but.label configure -text \
"Cannot save in $pref(userDefaults).new: $out"
return
}
foreach line $oldValues {
if {$line == \
"!!! Lines below here automatically added"} {
break
} else {
puts $out $line
}
}
puts $out "!!! Lines below here automatically added"
puts $out "!!! [exec date]"
puts $out "!!! Do not edit below here"
foreach item $preferences {
set varName [PrefVar $item]
set resName [PrefRes $item]
if [info exists pref(entry,$varName)] {
PrefEntrySet $pref(entry,$varName) $varName
}
set value [PrefValue $varName $resName]
puts $out [format "%s\t%s" *${resName}: $value]
}
close $out
set new [glob $pref(userDefaults).new]
set old [file root $new]
if [catch {file rename -force $new $old} err] {
Status "Cannot install $new: $err"
return
}
PrefDismiss
}
There is one fine point in PrefSave. The value from the entry widget for general-purpose items is obtained explicitly in case the user has not already pressed <Return> to update the Tcl variable.
The interface is rounded out with the PrefReset and PrefDismiss procedures. A reset is achieved by clearing the option database and reloading it, and then temporarily clearing the preference items and their associated variables and then redefining them with Pref_Add.
Example 45-9 Read settings from the preferences file
proc PrefReset {} {
global pref
# Re-read user defaults
option clear
PrefReadFile $pref(appDefaults) startup
PrefReadFile $pref(userDefaults) user
# Clear variables
set items $pref(items)
set pref(items) {}
foreach item $items {
uplevel #0 [list unset [PrefVar $item]]
}
# Restore values
Pref_Add $items
}
proc PrefDismiss {} {
destroy .pref
catch {destroy .prefitemhelp}
}
|