command.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Copyright 2018 visualfc. All rights reserved.
  2. package tk
  3. import (
  4. "fmt"
  5. "sync"
  6. )
  7. type Command struct {
  8. sync.RWMutex
  9. cmds []func()
  10. }
  11. func (c *Command) Bind(fn func()) {
  12. if fn == nil {
  13. return
  14. }
  15. c.Lock()
  16. c.cmds = append(c.cmds, fn)
  17. c.Unlock()
  18. }
  19. func (c *Command) Clear() {
  20. c.Lock()
  21. c.cmds = nil
  22. c.Unlock()
  23. }
  24. func (c *Command) Invoke() {
  25. c.RLock()
  26. for _, cmd := range c.cmds {
  27. if cmd != nil {
  28. cmd()
  29. }
  30. }
  31. c.RUnlock()
  32. }
  33. type CommandEx struct {
  34. sync.RWMutex
  35. cmds []func([]string) error
  36. }
  37. func (c *CommandEx) Bind(fn func([]string) error) {
  38. if fn == nil {
  39. return
  40. }
  41. c.Lock()
  42. c.cmds = append(c.cmds, fn)
  43. c.Unlock()
  44. }
  45. func (c *CommandEx) Clear() {
  46. c.Lock()
  47. c.cmds = nil
  48. c.Unlock()
  49. }
  50. func (c *CommandEx) Invoke(args []string) {
  51. c.RLock()
  52. for _, cmd := range c.cmds {
  53. if cmd != nil {
  54. cmd(args)
  55. }
  56. }
  57. c.RUnlock()
  58. }
  59. func bindCommand(id string, command string, fn func()) error {
  60. actName := makeActionId()
  61. err := eval(fmt.Sprintf("%v configure -%v {%v}", id, command, actName))
  62. if err != nil {
  63. return err
  64. }
  65. mainInterp.CreateAction(actName, func(args []string) {
  66. fn()
  67. })
  68. return nil
  69. }
  70. func bindCommandEx(id string, command string, fn func([]string)) error {
  71. actName := makeActionId()
  72. err := eval(fmt.Sprintf("%v configure -%v {%v}", id, command, actName))
  73. if err != nil {
  74. return err
  75. }
  76. mainInterp.CreateAction(actName, func(args []string) {
  77. fn(args)
  78. })
  79. return nil
  80. }