ids.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Copyright 2018 visualfc. All rights reserved.
  2. package tk
  3. import (
  4. "fmt"
  5. "sync"
  6. )
  7. func NewGenInt64Func(id int64) func() <-chan int64 {
  8. ch := make(chan int64)
  9. go func(i int64) {
  10. for {
  11. i++
  12. ch <- i
  13. }
  14. }(id)
  15. return func() <-chan int64 {
  16. return ch
  17. }
  18. }
  19. func NewGenIntFunc(id int) func() <-chan int {
  20. ch := make(chan int)
  21. go func(i int) {
  22. for {
  23. i++
  24. ch <- i
  25. }
  26. }(id)
  27. return func() <-chan int {
  28. return ch
  29. }
  30. }
  31. type NamedId interface {
  32. GetId(name string) string
  33. }
  34. type baseNamedId struct {
  35. m map[string]int
  36. }
  37. func (m *baseNamedId) GetId(name string) (r string) {
  38. m.m[name]++
  39. r = fmt.Sprintf("%v%v", name, m.m[name])
  40. return
  41. }
  42. type safeNamedId struct {
  43. sync.Mutex
  44. m map[string]int
  45. }
  46. func (m *safeNamedId) GetId(name string) (r string) {
  47. m.Lock()
  48. m.m[name]++
  49. r = fmt.Sprintf("%v%v", name, m.m[name])
  50. m.Unlock()
  51. return
  52. }
  53. func NewNamedId(safe bool) NamedId {
  54. if safe {
  55. return &safeNamedId{m: make(map[string]int)}
  56. }
  57. return &baseNamedId{make(map[string]int)}
  58. }
  59. var (
  60. atkNamedId = NewNamedId(false)
  61. )
  62. func makeNamedId(name string) string {
  63. return atkNamedId.GetId(name)
  64. }
  65. func makeNamedWidgetId(parent Widget, typ string) string {
  66. if parent == nil || parent.Id() == "." {
  67. return makeNamedId("." + typ)
  68. }
  69. return makeNamedId(parent.Id() + "." + typ)
  70. }
  71. func makeActionId() string {
  72. return makeNamedId("atk_action")
  73. }
  74. func makeBindEventId() string {
  75. return makeNamedId("atk_bindevent")
  76. }
  77. func makeTreeItemId(treeid string, pid string) string {
  78. if pid != "" {
  79. return makeNamedId(pid + ".I")
  80. }
  81. return makeNamedId(treeid + ".I")
  82. }
  83. func variableId(id string) string {
  84. return "::atk" + id + "_variable"
  85. }
  86. func evalSetValue(id string, value string) error {
  87. return eval(fmt.Sprintf("set %v {%v}", id, value))
  88. }
  89. func evalGetValue(id string) string {
  90. r, _ := evalAsString(fmt.Sprintf("set %v", id))
  91. return r
  92. }
  93. func traceVariable(id string, fn func()) error {
  94. act := makeActionId()
  95. mainInterp.CreateAction(act, func(args []string) {
  96. if fn != nil {
  97. fn()
  98. }
  99. })
  100. return eval(fmt.Sprintf("trace add variable %v write %v", id, act))
  101. }