preferences.tcl
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:7k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. ######################################################################
  2. #
  3. # preferences.tcl
  4. # created 11/2/98  magi
  5. #
  6. # read/write/access preference data
  7. #
  8. ######################################################################
  9. #
  10. # exports:
  11. #   get_preference
  12. #   set_preference
  13. #   write_preferences
  14. #   prefs_AutoPersistVar
  15. #
  16. # globals:
  17. #   global_preferences
  18. #   global_prefs_persistvars
  19. #
  20. ######################################################################
  21. set global_prefsRead 0
  22. proc get_preference {name {default ""}} {
  23.     global global_preferences
  24.     # read prefs from file if they haven't been
  25.     if {[expr ![globalset global_prefsRead]]} {
  26. read_preferences
  27.     }
  28.     if {[expr ![info exists global_preferences($name)]]} {
  29. set global_preferences($name) $default
  30.     }
  31.     
  32.     return $global_preferences($name)
  33. }
  34. proc set_preference {name value} {
  35.     global global_preferences
  36.     set global_preferences($name) $value
  37. }
  38. proc prefs_AutoPersistVar {var {default ""}} {
  39.     # mark given variable as persistent between sessions
  40.     # so read its value from configuration file, and mark
  41.     # it for write at shutdown
  42.     # if variable is array member, we only want to global the array
  43.     set av [getglobalname $var]
  44.     # read in the variable
  45.     global $av
  46.     set $var [get_preference $var $default]
  47.     # and mark it for later
  48.     global global_prefs_persistvars
  49.     lappend global_prefs_persistvars $var
  50. }
  51. proc prefs_UpdatePersistVars {} {
  52.     global global_prefs_persistvars
  53.     if {[info exists global_prefs_persistvars]} {
  54. foreach persistvar $global_prefs_persistvars {
  55.     set_preference $persistvar [globalset $persistvar]
  56. }
  57.     }
  58. }
  59. proc read_preferences {} {
  60.     set prefs [getPrefFilename]
  61.     global global_preferences
  62.     # force array to exist
  63.     set global_preferences() ""
  64.     # read whatever's in the file
  65.     if {[file exists $prefs]} {
  66. puts "Reading settings from $prefs"
  67. set file [open $prefs r]
  68. while {[expr ![eof $file]]} {
  69.     set line [gets $file]
  70.     #puts "read: $line"
  71.     if {$line != ""} {
  72. set sep [string first = $line]
  73. if {$sep} {
  74.     set name [string range $line 0 [expr $sep - 1]]
  75.     set value [string range $line [expr $sep + 1] end]
  76.     if {$value == ""} {
  77. puts "Warning: ignoring blank setting $line"
  78.     } else {
  79. set global_preferences($name) "$value"
  80.     }
  81. } else {
  82.     puts "Malformed default: $line"
  83. }
  84.     }
  85. }
  86. close $file
  87.     }
  88.     
  89.     # and flag that we've read the file
  90.     globalset global_prefsRead 1
  91. }
  92. proc write_preferences {} {
  93.     # open file
  94.     set prefs [getPrefFilename]
  95.     set file [open $prefs w]
  96.     # update the auto-save vars
  97.     prefs_UpdatePersistVars
  98.     # the write out the preferences
  99.     global global_preferences
  100.     foreach name [array names global_preferences] {
  101. if {$name != ""} {
  102.     puts $file "$name=$global_preferences($name)"
  103. }
  104.     }
  105.     close $file
  106. }
  107. proc getPrefFilename {} {
  108.     global env
  109.     return "$env(HOME)/.scanalyzedefaults"
  110. }
  111. proc prefs_AutoPrefsVar {var description values default {command ""}} {
  112.     # uses global array prefs_pref_vars
  113.     global prefs_pref_vars
  114.     # save as a preference
  115.     set prefs_pref_vars($var) [list $description $values $command]
  116.     # get the value, and mark it for auto-save
  117.     prefs_AutoPersistVar $var $default
  118.     # if it has a command to execute when it changes, do that now,
  119.     # since we just read the value
  120.     eval $command
  121. }
  122. proc prefs_sortByDesc {p1 p2} {
  123.     global prefs_pref_vars
  124.     set d1 [lindex $prefs_pref_vars($p1) 0]
  125.     set d2 [lindex $prefs_pref_vars($p2) 0]
  126.     return [string compare $d1 $d2]
  127. }
  128. proc prefsDialog {} {
  129.     if {[window_Activate .prefs]} {return}
  130.     set p [toplevel .prefs]
  131.     wm title $p "Scanalyze preferences"
  132.     window_Register $p
  133.     global prefs_pref_vars
  134.     foreach pref [lsort -command prefs_sortByDesc 
  135.       [array names prefs_pref_vars]] {
  136. set data $prefs_pref_vars($pref)
  137. set desc [lindex $data 0]
  138. set values [lindex $data 1]
  139. set command [lindex $data 2]
  140. if {$values == "bool"} {
  141.     set f [checkbutton $p.$pref -variable $pref -text $desc 
  142.       -command $command -anchor w]
  143.     set ys 1
  144. } else {
  145.     set f [frame $p.$pref -relief groove -border 2]
  146.     label $f.l -text $desc
  147.     set l2 [frame $f.l2]
  148.     foreach valuepair $values {
  149. set value [lindex $valuepair 0]
  150. set valdesc [lindex $valuepair 1]
  151. set r [radiobutton $l2.$value -text $valdesc 
  152.    -variable $pref -value $value 
  153.   -command $command]
  154. pack $r -side left
  155.     }
  156.     pack $f.l $l2 -side top -anchor w
  157.     set ys 3
  158. }
  159. pack $f -side top -anchor w -padx 3 -pady $ys -fill x
  160.     }
  161.     set ui [frame $p.ui]
  162.     button $ui.save -text "Save preferences now" 
  163. -command write_preferences
  164.     button $ui.close -text "Close" -command "destroy $p"
  165.     packchildren $ui -side left -fill x -expand true
  166.     pack $ui -side top -fill x -expand true
  167. }
  168. proc prefs_setRendererBasedDefaults {} {
  169.     set r [plv_getrendererstring]
  170.     # BUGBUG instead of defaulting to 1 and turning off for specific systems,
  171.     # this should default off and then turn on for IR or Impact (Octane),
  172.     # because they're the only ones it's good for.  I've yet to see a single
  173.     # PC system that can handle z-buffer reads reasonably.  Alternatively, we
  174.     # could implement a lighter-weight display cache that only caches frame
  175.     # buffer and not Z buffer (which would mean anything that needs Z buffer
  176.     # would have to trigger a redraw), since on most PC cards, frame buffer
  177.     # reads are OK but Z buffer reads are deathly slow.
  178.     set cache 1
  179.     set renderer [lindex $r 0]
  180.     if {$renderer == "CRIME"} {
  181. puts "O2; disabling display cache"
  182. set cache 0
  183.     } elseif {$renderer == "NEWPORT"} {
  184. puts "Indy; disabling display cache"
  185. set cache 0
  186.     } elseif {$renderer == "GDI"} {
  187. puts "Software renderer; disabling display cache"
  188. set cache 0
  189.     } elseif {$renderer == "3Dfx/Voodoo3"} {
  190. puts "Voodoo3; disabling display cache; expect lighting to be broken"
  191. set cache 0
  192.     } elseif {[regexp "GeForce.*" $renderer]} {
  193. puts "GeForce; disabling display cache"
  194. set cache 0
  195.     } elseif {[regexp "Quadro.*" $renderer]} {
  196. puts "Quadro; disabling display cache"
  197. set cache 0
  198.     } elseif {$renderer == "ELSA"} {
  199. puts "Elsa Nvidia card of some variety; disabling display cache"
  200. set cache 0
  201.     }
  202.     puts "render $renderer; cache $cache"
  203.     globalset styleCacheRender $cache
  204. }
  205. # The following was written by jed to handle saving variables to specific
  206. # files. Initially inteneded for contexts, but hopefully useful in general.
  207. # Save a bunch of variables to a file. Arrays are ok as well.
  208. proc pref_saveVarsToFile {filename args} {
  209.     # Open the file
  210.     set fd [open $filename w]
  211.     # Write the vars
  212.     foreach var $args {
  213. upvar $var varprox
  214. if {[array size varprox] == 0} {
  215.     # Normal var
  216.     set str "set $var "$varprox"" 
  217.     puts $fd $str
  218. } else {
  219.     # Array var
  220.     foreach el [array names varprox] {
  221. set str "set $var($el) "$varprox($el)""
  222. puts $fd $str
  223.     }
  224. }
  225.     }
  226.     # Close file 
  227.     close $fd
  228. }
  229. # Assuming you used the above routine to write the file, we can just source
  230. # it to read it into tcl
  231. proc pref_loadVarsFromFile {filename} {
  232.     eval uplevel {
  233.  source $filename
  234.     }
  235. }