basewidget.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. // Copyright 2018 visualfc. All rights reserved.
  2. package tk
  3. import (
  4. "fmt"
  5. "strings"
  6. )
  7. var _ Widget = &BaseWidget{}
  8. type BaseWidget struct {
  9. id string
  10. info *WidgetInfo
  11. }
  12. func (w *BaseWidget) String() string {
  13. iw := globalWidgetMap[w.id]
  14. if iw != nil {
  15. return fmt.Sprintf("%v{%v}", iw.TypeName(), w.id)
  16. } else {
  17. return fmt.Sprintf("Invalid{%v}", w.id)
  18. }
  19. }
  20. func (w *BaseWidget) Id() string {
  21. return w.id
  22. }
  23. func (w *BaseWidget) Info() *WidgetInfo {
  24. return w.info
  25. }
  26. func (w *BaseWidget) Type() WidgetType {
  27. if w.info != nil {
  28. return w.info.Type
  29. }
  30. return WidgetTypeNone
  31. }
  32. func (w *BaseWidget) TypeName() string {
  33. if w.info != nil {
  34. return w.info.TypeName
  35. }
  36. return "Invalid"
  37. }
  38. func (w *BaseWidget) Parent() Widget {
  39. return ParentOfWidget(w)
  40. }
  41. func (w *BaseWidget) Children() []Widget {
  42. return ChildrenOfWidget(w)
  43. }
  44. func (w *BaseWidget) IsValid() bool {
  45. return IsValidWidget(w)
  46. }
  47. func (w *BaseWidget) Destroy() error {
  48. return DestroyWidget(w)
  49. }
  50. func (w *BaseWidget) DestroyChildren() error {
  51. if !IsValidWidget(w) {
  52. return ErrInvalid
  53. }
  54. for _, child := range w.Children() {
  55. DestroyWidget(child)
  56. }
  57. return nil
  58. }
  59. func (w *BaseWidget) NativeAttribute(key string) string {
  60. if !IsValidWidget(w) {
  61. return ""
  62. }
  63. if !w.info.MetaClass.HasAttribute(key) {
  64. return ""
  65. }
  66. r, _ := evalAsString(fmt.Sprintf("%v cget -%v", w.id, key))
  67. return r
  68. }
  69. func (w *BaseWidget) NativeAttributes(keys ...string) (attributes []NativeAttr) {
  70. if !IsValidWidget(w) {
  71. return nil
  72. }
  73. if keys == nil {
  74. for _, key := range w.info.MetaClass.Attributes {
  75. r, _ := evalAsString(fmt.Sprintf("%v cget -%v", w.id, key))
  76. attributes = append(attributes, NativeAttr{key, r})
  77. }
  78. } else {
  79. for _, key := range keys {
  80. if w.info.MetaClass.HasAttribute(key) {
  81. r, _ := evalAsString(fmt.Sprintf("%v cget -%v", w.id, key))
  82. attributes = append(attributes, NativeAttr{key, r})
  83. }
  84. }
  85. }
  86. return
  87. }
  88. func (w *BaseWidget) SetNativeAttribute(key string, value string) error {
  89. return w.SetNativeAttributes([]NativeAttr{NativeAttr{key, value}}...)
  90. }
  91. func (w *BaseWidget) SetNativeAttributes(attributes ...NativeAttr) error {
  92. if !IsValidWidget(w) {
  93. return ErrInvalid
  94. }
  95. var attrList []string
  96. for _, attr := range attributes {
  97. if !w.info.MetaClass.HasAttribute(attr.Key) {
  98. continue
  99. }
  100. pname := "atk_tmp_" + attr.Key
  101. setObjText(pname, attr.Value)
  102. attrList = append(attrList, fmt.Sprintf("-%v $%v", attr.Key, pname))
  103. }
  104. if len(attrList) > 0 {
  105. return eval(fmt.Sprintf("%v configure %v", w.id, strings.Join(attrList, " ")))
  106. }
  107. return nil
  108. }
  109. func (w *BaseWidget) SetAttributes(attributes ...*WidgetAttr) error {
  110. if !IsValidWidget(w) {
  111. return ErrInvalid
  112. }
  113. extra := buildWidgetAttributeScript(w.info.MetaClass, w.info.IsTtk, attributes)
  114. if len(extra) > 0 {
  115. return eval(fmt.Sprintf("%v configure %v", w.id, extra))
  116. }
  117. return nil
  118. }
  119. func (w *BaseWidget) BindEvent(event string, fn func(e *Event)) error {
  120. return BindEvent(w.id, event, fn)
  121. }
  122. func (w *BaseWidget) BindKeyEvent(fn func(e *KeyEvent)) error {
  123. return BindKeyEventEx(w.id, fn, nil)
  124. }
  125. func (w *BaseWidget) BindKeyEventEx(fnPress func(e *KeyEvent), fnRelease func(e *KeyEvent)) error {
  126. return BindKeyEventEx(w.id, fnPress, fnRelease)
  127. }
  128. func (w *BaseWidget) BindInfo() []string {
  129. return BindInfo(w.id)
  130. }
  131. func (w *BaseWidget) ClearBind(event string) error {
  132. return ClearBindEvent(w.id, event)
  133. }
  134. func (w *BaseWidget) Lower(below Widget) error {
  135. script := fmt.Sprintf("lower %v", w.id)
  136. if IsValidWidget(below) {
  137. script += " " + below.Id()
  138. }
  139. return eval(script)
  140. }
  141. func (w *BaseWidget) Raise(above Widget) error {
  142. script := fmt.Sprintf("raise %v", w.id)
  143. if IsValidWidget(above) {
  144. script += " " + above.Id()
  145. }
  146. return eval(script)
  147. }
  148. func (w *BaseWidget) SetGrab() error {
  149. return eval(fmt.Sprintf("grab set %v", w.id))
  150. }
  151. func (w *BaseWidget) ReleaseGrab() error {
  152. return eval(fmt.Sprintf("grab release %v", w.id))
  153. }
  154. func (w *BaseWidget) IsGrab() bool {
  155. id, err := evalAsString("grab current")
  156. if err != nil || id == "" {
  157. return false
  158. }
  159. return w.id == id
  160. }
  161. func (w *BaseWidget) SetFocus() error {
  162. return eval(fmt.Sprintf("focus %v", w.id))
  163. }
  164. func (w *BaseWidget) IsFocus() bool {
  165. id, err := evalAsString("focus")
  166. if err != nil || id == "" {
  167. return false
  168. }
  169. return w.id == id
  170. }
  171. func (w *BaseWidget) FocusNextWidget() Widget {
  172. id, err := evalAsString("tk_focusNext " + w.id)
  173. if err != nil || id == "" {
  174. return nil
  175. }
  176. return FindWidget(id)
  177. }
  178. func (w *BaseWidget) FocusPrevWidget() Widget {
  179. id, err := evalAsString("tk_focusPrev " + w.id)
  180. if err != nil || id == "" {
  181. return nil
  182. }
  183. return FindWidget(id)
  184. }
  185. func SetFocusFollowsMouse() error {
  186. return eval("tk_focusFollowsMouse")
  187. }
  188. func FocusWidget() Widget {
  189. id, err := evalAsString("focus")
  190. if err != nil || id == "" {
  191. return nil
  192. }
  193. return FindWidget(id)
  194. }
  195. func GrabWidget() Widget {
  196. id, err := evalAsString("grab current")
  197. if err != nil || id == "" {
  198. return nil
  199. }
  200. return FindWidget(id)
  201. }