_cycle.tcl 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. namespace eval cycle {
  2. set help_cycle \
  3. {Cycle through the possible values of an enum setting.
  4. 'cycle_back' does the same as 'cycle', but it goes in the opposite direction.
  5. Usage:
  6. cycle <enum_setting> [<cycle_list>]
  7. cycle_back <enum_setting> [<cycle_list>]
  8. Example:
  9. cycle scale_algorithm
  10. cycle scale_algorithm "hq2x hq2xlite"
  11. }
  12. set_help_text cycle $help_cycle
  13. set_help_text cycle_back $help_cycle
  14. set_tabcompletion_proc cycle [namespace code tab_cycle]
  15. set_tabcompletion_proc cycle_back [namespace code tab_cycle]
  16. proc tab_cycle {args} {
  17. set result [list]
  18. foreach setting [openmsx_info setting] {
  19. set type [lindex [openmsx_info setting $setting] 0]
  20. if {($type eq "enumeration") || ($type eq "boolean")} {
  21. lappend result $setting
  22. }
  23. }
  24. return $result
  25. }
  26. proc cycle {setting {cycle_list {}} {step 1}} {
  27. set setting_info [openmsx_info setting $setting]
  28. set type [lindex $setting_info 0]
  29. if {$type eq "enumeration"} {
  30. if {[llength $cycle_list] == 0} {
  31. set cycle_list [lindex $setting_info 2]
  32. }
  33. } elseif {$type eq "boolean"} {
  34. set cycle_list [list "true" "false"]
  35. } else {
  36. error "Not an enumeration setting: $setting"
  37. }
  38. set cur [lsearch -exact -nocase $cycle_list [set ::$setting]]
  39. set new [expr {($cur + $step) % [llength $cycle_list]}]
  40. set ::$setting [lindex $cycle_list $new]
  41. }
  42. proc cycle_back {setting} {
  43. cycle $setting {} -1
  44. }
  45. set_help_text toggle \
  46. {Toggles a boolean setting
  47. Usage:
  48. toggle <boolean_setting>
  49. Example:
  50. toggle fullscreen
  51. }
  52. set_tabcompletion_proc toggle [namespace code tab_cycle]
  53. proc toggle {setting} {
  54. cycle $setting "on off"
  55. }
  56. namespace export cycle
  57. namespace export cycle_back
  58. namespace export toggle
  59. } ;# namespace cycle
  60. namespace import cycle::*