pack.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // Copyright 2018 visualfc. All rights reserved.
  2. package tk
  3. import (
  4. "fmt"
  5. "strings"
  6. )
  7. func PackAttrSide(side Side) *LayoutAttr {
  8. return &LayoutAttr{"side", side}
  9. }
  10. func PackAttrSideLeft() *LayoutAttr {
  11. return &LayoutAttr{"side", "left"}
  12. }
  13. func PackAttrSideRight() *LayoutAttr {
  14. return &LayoutAttr{"side", "right"}
  15. }
  16. func PackAttrSideTop() *LayoutAttr {
  17. return &LayoutAttr{"side", "top"}
  18. }
  19. func PackAttrSideBottom() *LayoutAttr {
  20. return &LayoutAttr{"side", "bottom"}
  21. }
  22. func PackAttrPadx(padx int) *LayoutAttr {
  23. return &LayoutAttr{"padx", padx}
  24. }
  25. func PackAttrPady(pady int) *LayoutAttr {
  26. return &LayoutAttr{"pady", pady}
  27. }
  28. func PackAttrIpadx(padx int) *LayoutAttr {
  29. return &LayoutAttr{"ipadx", padx}
  30. }
  31. func PackAttrIpady(pady int) *LayoutAttr {
  32. return &LayoutAttr{"ipady", pady}
  33. }
  34. func PackAttrAnchor(anchor Anchor) *LayoutAttr {
  35. v := anchor.String()
  36. if v == "" {
  37. return nil
  38. }
  39. return &LayoutAttr{"anchor", v}
  40. }
  41. func PackAttrExpand(b bool) *LayoutAttr {
  42. return &LayoutAttr{"expand", boolToInt(b)}
  43. }
  44. func PackAttrFill(fill Fill) *LayoutAttr {
  45. return &LayoutAttr{"fill", fill}
  46. }
  47. func PackAttrFillX() *LayoutAttr {
  48. return &LayoutAttr{"fill", "x"}
  49. }
  50. func PackAttrFillY() *LayoutAttr {
  51. return &LayoutAttr{"fill", "y"}
  52. }
  53. func PackAttrFillBoth() *LayoutAttr {
  54. return &LayoutAttr{"fill", "both"}
  55. }
  56. func PackAttrFillNone() *LayoutAttr {
  57. return &LayoutAttr{"fill", "none"}
  58. }
  59. func PackAttrBefore(w Widget) *LayoutAttr {
  60. if !IsValidWidget(w) {
  61. return nil
  62. }
  63. return &LayoutAttr{"before", w.Id()}
  64. }
  65. func PackAttrAfter(w Widget) *LayoutAttr {
  66. if !IsValidWidget(w) {
  67. return nil
  68. }
  69. return &LayoutAttr{"after", w.Id()}
  70. }
  71. func PackAttrInMaster(w Widget) *LayoutAttr {
  72. if !IsValidWidget(w) {
  73. return nil
  74. }
  75. return &LayoutAttr{"in", w.Id()}
  76. }
  77. var (
  78. packAttrKeys = []string{
  79. "side",
  80. "padx", "pady",
  81. "ipadx", "ipady",
  82. "anchor",
  83. "expand",
  84. "fill",
  85. "before",
  86. "after",
  87. "in",
  88. }
  89. )
  90. func Pack(widget Widget, attributes ...*LayoutAttr) error {
  91. return PackList([]Widget{widget}, attributes...)
  92. }
  93. func PackRemove(widget Widget) error {
  94. if !IsValidWidget(widget) {
  95. return ErrInvalid
  96. }
  97. widget = checkLayoutWidget(widget)
  98. return eval("pack forget " + widget.Id())
  99. }
  100. func PackList(widgets []Widget, attributes ...*LayoutAttr) error {
  101. var idList []string
  102. for _, w := range widgets {
  103. if IsValidWidget(w) {
  104. w = checkLayoutWidget(w)
  105. idList = append(idList, w.Id())
  106. }
  107. }
  108. if len(idList) == 0 {
  109. return ErrInvalid
  110. }
  111. var attrList []string
  112. for _, attr := range attributes {
  113. if attr == nil || !isValidKey(attr.key, packAttrKeys) {
  114. continue
  115. }
  116. attrList = append(attrList, fmt.Sprintf("-%v {%v}", attr.key, attr.value))
  117. }
  118. script := fmt.Sprintf("pack %v", strings.Join(idList, " "))
  119. if len(attrList) > 0 {
  120. script += " " + strings.Join(attrList, " ")
  121. }
  122. return eval(script)
  123. }