entry.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. // Copyright 2018 visualfc. All rights reserved.
  2. package tk
  3. import (
  4. "fmt"
  5. "strings"
  6. )
  7. // entry
  8. type Entry struct {
  9. BaseWidget
  10. xscrollcommand *CommandEx
  11. }
  12. func NewEntry(parent Widget, attributes ...*WidgetAttr) *Entry {
  13. theme := checkInitUseTheme(attributes)
  14. iid := makeNamedWidgetId(parent, "atk_entry")
  15. attributes = append(attributes, &WidgetAttr{"textvariable", variableId(iid)})
  16. info := CreateWidgetInfo(iid, WidgetTypeEntry, theme, attributes)
  17. if info == nil {
  18. return nil
  19. }
  20. w := &Entry{}
  21. w.id = iid
  22. w.info = info
  23. evalSetValue(variableId(iid), "")
  24. RegisterWidget(w)
  25. return w
  26. }
  27. func (w *Entry) Attach(id string) error {
  28. info, err := CheckWidgetInfo(id, WidgetTypeEntry)
  29. if err != nil {
  30. return err
  31. }
  32. w.id = id
  33. w.info = info
  34. RegisterWidget(w)
  35. return nil
  36. }
  37. func (w *Entry) SetForeground(color string) error {
  38. setObjText("atk_tmp_text", color)
  39. return eval(fmt.Sprintf("%v configure -foreground $atk_tmp_text", w.id))
  40. }
  41. func (w *Entry) Foreground() string {
  42. r, _ := evalAsString(fmt.Sprintf("%v cget -foreground", w.id))
  43. return r
  44. }
  45. func (w *Entry) SetBackground(color string) error {
  46. setObjText("atk_tmp_text", color)
  47. return eval(fmt.Sprintf("%v configure -background $atk_tmp_text", w.id))
  48. }
  49. func (w *Entry) Background() string {
  50. r, _ := evalAsString(fmt.Sprintf("%v cget -background", w.id))
  51. return r
  52. }
  53. func (w *Entry) SetWidth(width int) error {
  54. return eval(fmt.Sprintf("%v configure -width {%v}", w.id, width))
  55. }
  56. func (w *Entry) Width() int {
  57. r, _ := evalAsInt(fmt.Sprintf("%v cget -width", w.id))
  58. return r
  59. }
  60. func (w *Entry) SetFont(font Font) error {
  61. if font == nil {
  62. return ErrInvalid
  63. }
  64. return eval(fmt.Sprintf("%v configure -font {%v}", w.id, font.Id()))
  65. }
  66. func (w *Entry) Font() Font {
  67. r, err := evalAsString(fmt.Sprintf("%v cget -font", w.id))
  68. return parserFontResult(r, err)
  69. }
  70. func (w *Entry) SetJustify(justify Justify) error {
  71. return eval(fmt.Sprintf("%v configure -justify {%v}", w.id, justify))
  72. }
  73. func (w *Entry) Justify() Justify {
  74. r, err := evalAsString(fmt.Sprintf("%v cget -justify", w.id))
  75. return parserJustifyResult(r, err)
  76. }
  77. func (w *Entry) SetShow(show string) error {
  78. setObjText("atk_tmp_text", show)
  79. return eval(fmt.Sprintf("%v configure -show $atk_tmp_text", w.id))
  80. }
  81. func (w *Entry) Show() string {
  82. r, _ := evalAsString(fmt.Sprintf("%v cget -show", w.id))
  83. return r
  84. }
  85. func (w *Entry) SetState(state State) error {
  86. return eval(fmt.Sprintf("%v configure -state {%v}", w.id, state))
  87. }
  88. func (w *Entry) State() State {
  89. r, err := evalAsString(fmt.Sprintf("%v cget -state", w.id))
  90. return parserStateResult(r, err)
  91. }
  92. func (w *Entry) SetTakeFocus(takefocus bool) error {
  93. return eval(fmt.Sprintf("%v configure -takefocus {%v}", w.id, boolToInt(takefocus)))
  94. }
  95. func (w *Entry) IsTakeFocus() bool {
  96. r, _ := evalAsBool(fmt.Sprintf("%v cget -takefocus", w.id))
  97. return r
  98. }
  99. func (w *Entry) SetExportSelection(export bool) error {
  100. return eval(fmt.Sprintf("%v configure -exportselection {%v}", w.id, boolToInt(export)))
  101. }
  102. func (w *Entry) IsExportSelection() bool {
  103. r, _ := evalAsBool(fmt.Sprintf("%v cget -exportselection", w.id))
  104. return r
  105. }
  106. func (w *Entry) SetText(text string) error {
  107. setObjText("atk_tmp_text", text)
  108. return eval(fmt.Sprintf("set %v $atk_tmp_text", variableId(w.id)))
  109. }
  110. func (w *Entry) Text() string {
  111. r, _ := evalAsString(fmt.Sprintf("set %v", variableId(w.id)))
  112. return r
  113. }
  114. func (w *Entry) SetXViewArgs(args []string) error {
  115. return eval(fmt.Sprintf("%v xview %v", w.id, strings.Join(args, " ")))
  116. }
  117. func (w *Entry) OnXScrollEx(fn func([]string) error) error {
  118. if fn == nil {
  119. return ErrInvalid
  120. }
  121. if w.xscrollcommand == nil {
  122. w.xscrollcommand = &CommandEx{}
  123. bindCommandEx(w.id, "xscrollcommand", w.xscrollcommand.Invoke)
  124. }
  125. w.xscrollcommand.Bind(fn)
  126. return nil
  127. }
  128. func (w *Entry) BindXScrollBar(bar *ScrollBar) error {
  129. if !IsValidWidget(bar) {
  130. return ErrInvalid
  131. }
  132. w.OnXScrollEx(bar.SetScrollArgs)
  133. bar.OnCommandEx(w.SetXViewArgs)
  134. return nil
  135. }
  136. func (w *Entry) SetCursorPosition(pos int) *Entry {
  137. eval(fmt.Sprintf("%v icursor %v", w.id, pos))
  138. return w
  139. }
  140. func (w *Entry) CursorPosition() int {
  141. return w.index("insert")
  142. }
  143. func (w *Entry) OnUpdate(fn func()) error {
  144. return traceVariable(variableId(w.id), fn)
  145. }
  146. func (w *Entry) OnEditReturn(fn func()) error {
  147. if fn == nil {
  148. return ErrInvalid
  149. }
  150. w.BindEvent("<Return>", func(e *Event) {
  151. fn()
  152. })
  153. return nil
  154. }
  155. func (w *Entry) Copy() {
  156. SendEvent(w, "<<Copy>>")
  157. }
  158. func (w *Entry) Paste() {
  159. SendEvent(w, "<<Paste")
  160. }
  161. func (w *Entry) Cut() {
  162. SendEvent(w, "<<Cut>>")
  163. }
  164. func (w *Entry) Clear() {
  165. w.SetText("")
  166. }
  167. func (w *Entry) Delete(index int) {
  168. eval(fmt.Sprintf("%v delete %v", w.id, index))
  169. }
  170. func (w *Entry) DeleteRange(start int, end int) {
  171. eval(fmt.Sprintf("%v delete %v %v", w.id, start, end))
  172. }
  173. func (w *Entry) TextLength() int {
  174. return w.index("end")
  175. }
  176. func (w *Entry) index(index string) int {
  177. r, _ := evalAsInt(fmt.Sprintf("%v index %v", w.id, index))
  178. return r
  179. }
  180. func (w *Entry) Index(index int) int {
  181. r, _ := evalAsInt(fmt.Sprintf("%v index %v", w.id, index))
  182. return r
  183. }
  184. func (w *Entry) Insert(index int, str string) error {
  185. setObjText("atk_entry_text", str)
  186. return eval(fmt.Sprintf("%v insert %v $atk_entry_text", w.id, index))
  187. }
  188. func (w *Entry) Append(str string) error {
  189. setObjText("atk_entry_text", str)
  190. return eval(fmt.Sprintf("%v insert end $atk_entry_text", w.id))
  191. }
  192. func (w *Entry) ClearSelection() {
  193. eval(fmt.Sprintf("%v selection clear", w.id))
  194. }
  195. func (w *Entry) HasSelectedText() bool {
  196. r, _ := evalAsBool(fmt.Sprintf("%v selection present", w.id))
  197. return r
  198. }
  199. func (w *Entry) SelectedText() string {
  200. if !w.HasSelectedText() {
  201. return ""
  202. }
  203. return SubString(w.Text(), w.SelectionStart(), w.SelectionEnd())
  204. }
  205. func (w *Entry) SetSelection(start int, end int) {
  206. eval(fmt.Sprintf("%v selection range %v %v", w.id, start, end))
  207. }
  208. func (w *Entry) SelectAll() {
  209. w.SetSelection(0, w.TextLength())
  210. }
  211. func (w *Entry) SelectionStart() int {
  212. if !w.HasSelectedText() {
  213. return -1
  214. }
  215. return w.index("sel.first")
  216. }
  217. func (w *Entry) SelectionEnd() int {
  218. if !w.HasSelectedText() {
  219. return -1
  220. }
  221. return w.index("sel.last")
  222. }
  223. func EntryAttrForeground(color string) *WidgetAttr {
  224. return &WidgetAttr{"foreground", color}
  225. }
  226. func EntryAttrBackground(color string) *WidgetAttr {
  227. return &WidgetAttr{"background", color}
  228. }
  229. func EntryAttrWidth(width int) *WidgetAttr {
  230. return &WidgetAttr{"width", width}
  231. }
  232. func EntryAttrFont(font Font) *WidgetAttr {
  233. if font == nil {
  234. return nil
  235. }
  236. return &WidgetAttr{"font", font.Id()}
  237. }
  238. func EntryAttrJustify(justify Justify) *WidgetAttr {
  239. return &WidgetAttr{"justify", justify}
  240. }
  241. func EntryAttrShow(show string) *WidgetAttr {
  242. return &WidgetAttr{"show", show}
  243. }
  244. func EntryAttrState(state State) *WidgetAttr {
  245. return &WidgetAttr{"state", state}
  246. }
  247. func EntryAttrTakeFocus(takefocus bool) *WidgetAttr {
  248. return &WidgetAttr{"takefocus", boolToInt(takefocus)}
  249. }
  250. func EntryAttrExportSelection(export bool) *WidgetAttr {
  251. return &WidgetAttr{"exportselection", boolToInt(export)}
  252. }