action.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. // Copyright 2018 visualfc. All rights reserved.
  2. package tk
  3. import (
  4. "fmt"
  5. )
  6. type Action struct {
  7. actid string
  8. label string
  9. checkid string
  10. groupid string
  11. radioid string
  12. command *Command
  13. data interface{}
  14. }
  15. func (a *Action) String() string {
  16. if a.actid == "" {
  17. return "Separator"
  18. } else if a.groupid != "" {
  19. return fmt.Sprintf("RadioAction{%v}", a.label)
  20. } else if a.checkid != "" {
  21. return fmt.Sprintf("CheckAction{%v}", a.label)
  22. } else {
  23. return fmt.Sprintf("Action{%v}", a.label)
  24. }
  25. }
  26. func (a *Action) IsSeparator() bool {
  27. return a.actid == ""
  28. }
  29. func (a *Action) IsRadioAction() bool {
  30. return a.groupid != ""
  31. }
  32. func (a *Action) IsCheckAction() bool {
  33. return a.checkid != ""
  34. }
  35. func (a *Action) SetChecked(b bool) {
  36. if a.groupid != "" {
  37. eval(fmt.Sprintf("set %v {%v}", a.groupid, a.radioid))
  38. } else if a.checkid != "" {
  39. eval(fmt.Sprintf("set %v {%v}", a.checkid, boolToInt(b)))
  40. }
  41. }
  42. func (a *Action) IsChecked() bool {
  43. if a.groupid != "" {
  44. r, _ := evalAsString(fmt.Sprintf("set %v", a.groupid))
  45. return r == a.radioid
  46. } else if a.checkid != "" {
  47. b, _ := evalAsBool(fmt.Sprintf("set %v", a.checkid))
  48. return b
  49. }
  50. return false
  51. }
  52. func (a *Action) Label() string {
  53. return a.label
  54. }
  55. func (a *Action) SetData(data interface{}) {
  56. a.data = data
  57. }
  58. func (a *Action) Data() interface{} {
  59. return a.data
  60. }
  61. func (a *Action) Invoke() {
  62. a.command.Invoke()
  63. }
  64. func (a *Action) OnCommand(fn func()) error {
  65. if fn == nil {
  66. return ErrInvalid
  67. }
  68. a.command.Bind(fn)
  69. return nil
  70. }
  71. func NewAction(label string) *Action {
  72. act := &Action{}
  73. act.label = label
  74. act.actid = makeActionId()
  75. act.command = &Command{}
  76. mainInterp.CreateAction(act.actid, func([]string) {
  77. act.command.Invoke()
  78. })
  79. return act
  80. }
  81. func NewActionEx(label string, cmd func()) *Action {
  82. act := NewAction(label)
  83. act.OnCommand(cmd)
  84. return act
  85. }
  86. func NewCheckAction(label string) *Action {
  87. act := NewAction(label)
  88. id := makeNamedId("atk_checkaction")
  89. evalSetValue(id, "0")
  90. act.checkid = id
  91. return act
  92. }
  93. func NewCheckActionEx(label string, cmd func()) *Action {
  94. act := NewCheckAction(label)
  95. act.OnCommand(cmd)
  96. return act
  97. }
  98. func NewRadioAction(group *ActionGroup, label string) *Action {
  99. return group.AddNewRadioAction(label)
  100. }
  101. func NewSeparatorAction() *Action {
  102. action := &Action{}
  103. return action
  104. }
  105. type ActionGroup struct {
  106. groupid string
  107. actions []*Action
  108. fnRadioCommand func()
  109. }
  110. func NewActionGroup() *ActionGroup {
  111. id := makeNamedId("atk_actiongroup")
  112. evalSetValue(id, "")
  113. return &ActionGroup{id, nil, nil}
  114. }
  115. func (a *ActionGroup) findAction(act *Action) bool {
  116. for _, v := range a.actions {
  117. if v == act {
  118. return true
  119. }
  120. }
  121. return false
  122. }
  123. func (a *ActionGroup) radioCommand() {
  124. if a.fnRadioCommand != nil {
  125. a.fnRadioCommand()
  126. }
  127. }
  128. func (a *ActionGroup) AddRadioAction(act *Action) error {
  129. if a.findAction(act) {
  130. return ErrExist
  131. }
  132. act.groupid = a.groupid
  133. act.radioid = makeNamedId("atk_radioaction")
  134. act.OnCommand(a.radioCommand)
  135. a.actions = append(a.actions, act)
  136. return nil
  137. }
  138. func (a *ActionGroup) AddNewRadioAction(label string) *Action {
  139. act := NewAction(label)
  140. a.AddRadioAction(act)
  141. return act
  142. }
  143. func (a *ActionGroup) OnCommand(fn func()) {
  144. a.fnRadioCommand = fn
  145. }
  146. func (a *ActionGroup) checkedValue() string {
  147. r, _ := evalAsStringEx(fmt.Sprintf("set %v", a.groupid), false)
  148. return r
  149. }
  150. func (a *ActionGroup) SetCheckedIndex(index int) error {
  151. if index < 0 || index > len(a.actions) {
  152. return ErrInvalid
  153. }
  154. a.actions[index].SetChecked(true)
  155. return nil
  156. }
  157. func (a *ActionGroup) SetCheckedAction(act *Action) error {
  158. if act == nil {
  159. return ErrInvalid
  160. }
  161. for _, v := range a.actions {
  162. if v == act {
  163. act.SetChecked(true)
  164. return nil
  165. }
  166. }
  167. return ErrNotExist
  168. }
  169. func (a *ActionGroup) CheckedActionIndex() int {
  170. s := a.checkedValue()
  171. if s == "" {
  172. return -1
  173. }
  174. for n, act := range a.actions {
  175. if act.radioid == s {
  176. return n
  177. }
  178. }
  179. return -1
  180. }
  181. func (a *ActionGroup) CheckedAction() *Action {
  182. s := a.checkedValue()
  183. if s == "" {
  184. return nil
  185. }
  186. for _, act := range a.actions {
  187. if act.radioid == s {
  188. return act
  189. }
  190. }
  191. return nil
  192. }
  193. func (a *ActionGroup) Actions() []*Action {
  194. return a.actions
  195. }