notebook.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. // Copyright 2018 visualfc. All rights reserved.
  2. package tk
  3. import (
  4. "fmt"
  5. "strings"
  6. )
  7. // notebook
  8. type Notebook struct {
  9. BaseWidget
  10. }
  11. func NewNotebook(parent Widget, attributes ...*WidgetAttr) *Notebook {
  12. theme := checkInitUseTheme(attributes)
  13. iid := makeNamedWidgetId(parent, "atk_notebook")
  14. info := CreateWidgetInfo(iid, WidgetTypeNotebook, theme, attributes)
  15. if info == nil {
  16. return nil
  17. }
  18. w := &Notebook{}
  19. w.id = iid
  20. w.info = info
  21. RegisterWidget(w)
  22. return w
  23. }
  24. func (w *Notebook) Attach(id string) error {
  25. info, err := CheckWidgetInfo(id, WidgetTypeNotebook)
  26. if err != nil {
  27. return err
  28. }
  29. w.id = id
  30. w.info = info
  31. RegisterWidget(w)
  32. return nil
  33. }
  34. func (w *Notebook) SetWidth(width int) error {
  35. return eval(fmt.Sprintf("%v configure -width {%v}", w.id, width))
  36. }
  37. func (w *Notebook) Width() int {
  38. r, _ := evalAsInt(fmt.Sprintf("%v cget -width", w.id))
  39. return r
  40. }
  41. func (w *Notebook) SetHeight(height int) error {
  42. return eval(fmt.Sprintf("%v configure -height {%v}", w.id, height))
  43. }
  44. func (w *Notebook) Height() int {
  45. r, _ := evalAsInt(fmt.Sprintf("%v cget -height", w.id))
  46. return r
  47. }
  48. func (w *Notebook) SetTakeFocus(takefocus bool) error {
  49. return eval(fmt.Sprintf("%v configure -takefocus {%v}", w.id, boolToInt(takefocus)))
  50. }
  51. func (w *Notebook) IsTakeFocus() bool {
  52. r, _ := evalAsBool(fmt.Sprintf("%v cget -takefocus", w.id))
  53. return r
  54. }
  55. func (w *Notebook) SetPaddingN(padx int, pady int) error {
  56. if w.info.IsTtk {
  57. return eval(fmt.Sprintf("%v configure -padding {%v %v}", w.id, padx, pady))
  58. }
  59. return eval(fmt.Sprintf("%v configure -padx {%v} -pady {%v}", w.id, padx, pady))
  60. }
  61. func (w *Notebook) PaddingN() (int, int) {
  62. var r string
  63. var err error
  64. if w.info.IsTtk {
  65. r, err = evalAsString(fmt.Sprintf("%v cget -padding", w.id))
  66. } else {
  67. r1, _ := evalAsString(fmt.Sprintf("%v cget -padx", w.id))
  68. r2, _ := evalAsString(fmt.Sprintf("%v cget -pady", w.id))
  69. r = r1 + " " + r2
  70. }
  71. return parserPaddingResult(r, err)
  72. }
  73. func (w *Notebook) SetPadding(pad Pad) error {
  74. return w.SetPaddingN(pad.X, pad.Y)
  75. }
  76. func (w *Notebook) Padding() Pad {
  77. x, y := w.PaddingN()
  78. return Pad{x, y}
  79. }
  80. var (
  81. tabAttributes = []string{
  82. "padding",
  83. "state",
  84. "sticky",
  85. "text",
  86. "image",
  87. "compound",
  88. }
  89. )
  90. func isTabAttributes(attr string) bool {
  91. for _, v := range tabAttributes {
  92. if v == attr {
  93. return true
  94. }
  95. }
  96. return false
  97. }
  98. func buildTabAttributeScript(ttk bool, attributes ...*WidgetAttr) string {
  99. var list []string
  100. for _, attr := range attributes {
  101. if attr == nil {
  102. continue
  103. }
  104. if attr.key == "padding" {
  105. list = append(list, checkPaddingScript(ttk, attr))
  106. continue
  107. }
  108. if !isTabAttributes(attr.key) {
  109. continue
  110. }
  111. if s, ok := attr.value.(string); ok {
  112. pname := "atk_tmp_" + attr.key
  113. setObjText(pname, s)
  114. list = append(list, fmt.Sprintf("-%v $%v", attr.key, pname))
  115. continue
  116. }
  117. list = append(list, fmt.Sprintf("-%v {%v}", attr.key, attr.value))
  118. }
  119. return strings.Join(list, " ")
  120. }
  121. func (w *Notebook) AddTab(widget Widget, text string, attributes ...*WidgetAttr) error {
  122. if !IsValidWidget(widget) {
  123. return ErrInvalid
  124. }
  125. attributes = append(attributes, &WidgetAttr{"text", text})
  126. extra := buildTabAttributeScript(w.info.IsTtk, attributes...)
  127. script := fmt.Sprintf("%v add %v", w.id, widget.Id())
  128. if extra != "" {
  129. script += " " + extra
  130. }
  131. return eval(script)
  132. }
  133. func (w *Notebook) InsertTab(pos int, widget Widget, text string, attributes ...*WidgetAttr) error {
  134. if !IsValidWidget(widget) {
  135. return ErrInvalid
  136. }
  137. attributes = append(attributes, &WidgetAttr{"text", text})
  138. extra := buildTabAttributeScript(w.info.IsTtk, attributes...)
  139. script := fmt.Sprintf("%v insert %v %v", w.id, pos, widget.Id())
  140. if extra != "" {
  141. script += " " + extra
  142. }
  143. return eval(script)
  144. }
  145. func (w *Notebook) SetTab(widget Widget, text string, attributes ...*WidgetAttr) error {
  146. if !IsValidWidget(widget) {
  147. return ErrInvalid
  148. }
  149. attributes = append(attributes, &WidgetAttr{"text", text})
  150. extra := buildTabAttributeScript(w.info.IsTtk, attributes...)
  151. script := fmt.Sprintf("%v tab %v", w.id, widget.Id())
  152. if extra != "" {
  153. script += " " + extra
  154. }
  155. return eval(script)
  156. }
  157. func (w *Notebook) RemoveTab(widget Widget) error {
  158. if !IsValidWidget(widget) {
  159. return ErrInvalid
  160. }
  161. return eval(fmt.Sprintf("%v forget %v", w.id, widget.Id()))
  162. }
  163. func (w *Notebook) SetCurrentTab(widget Widget) error {
  164. if !IsValidWidget(widget) {
  165. return ErrInvalid
  166. }
  167. return eval(fmt.Sprintf("%v select %v", w.id, widget.Id()))
  168. }
  169. func (w *Notebook) CurrentTab() Widget {
  170. r, _ := evalAsString(fmt.Sprintf("%v select", w.id))
  171. return FindWidget(r)
  172. }
  173. func (w *Notebook) CurrentTabIndex() int {
  174. r, _ := evalAsInt(fmt.Sprintf("%v index current", w.id))
  175. return r
  176. }
  177. func (w *Notebook) TabCount() int {
  178. r, _ := evalAsInt(fmt.Sprintf("%v index end", w.id))
  179. return r
  180. }
  181. func (w *Notebook) TabIndex(widget Widget) int {
  182. if !IsValidWidget(widget) {
  183. return -1
  184. }
  185. r, _ := evalAsInt(fmt.Sprintf("%v index %v", w.id, widget.Id()))
  186. return r
  187. }
  188. func TabAttrState(state State) *WidgetAttr {
  189. return &WidgetAttr{"state", state}
  190. }
  191. func TabAttrSticky(sticky Sticky) *WidgetAttr {
  192. return &WidgetAttr{"sticky", sticky}
  193. }
  194. func TabAttrPadding(padding Pad) *WidgetAttr {
  195. return &WidgetAttr{"padding", padding}
  196. }
  197. func TabAttrText(text string) *WidgetAttr {
  198. return &WidgetAttr{"text", text}
  199. }
  200. func TabAttrImage(image *Image) *WidgetAttr {
  201. if image == nil {
  202. return nil
  203. }
  204. return &WidgetAttr{"image", image.Id()}
  205. }
  206. func TabAttrCompound(compound Compound) *WidgetAttr {
  207. return &WidgetAttr{"compound", compound}
  208. }
  209. func NotebookAttrWidth(width int) *WidgetAttr {
  210. return &WidgetAttr{"width", width}
  211. }
  212. func NotebookAttrHeight(height int) *WidgetAttr {
  213. return &WidgetAttr{"height", height}
  214. }
  215. func NotebookAttrTakeFocus(takefocus bool) *WidgetAttr {
  216. return &WidgetAttr{"takefocus", boolToInt(takefocus)}
  217. }
  218. func NotebookAttrPadding(padding Pad) *WidgetAttr {
  219. return &WidgetAttr{"padding", padding}
  220. }