layout.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // Copyright 2018 visualfc. All rights reserved.
  2. package tk
  3. import "fmt"
  4. type LayoutWidget interface {
  5. Widget
  6. LayoutWidget() Widget
  7. }
  8. func checkLayoutWidget(widget Widget) Widget {
  9. if w, ok := (widget).(LayoutWidget); ok {
  10. return w.LayoutWidget()
  11. }
  12. return widget
  13. }
  14. type Layout interface {
  15. Widget
  16. AddWidget(widget Widget, attrs ...*LayoutAttr) error
  17. AddLayout(layout Layout, attrs ...*LayoutAttr) error
  18. RemoveWidget(widget Widget) error
  19. RemoveLayout(layout Layout) error
  20. }
  21. type LayoutAttr struct {
  22. key string
  23. value interface{}
  24. }
  25. type LayoutItem struct {
  26. widget Widget
  27. attrs []*LayoutAttr
  28. }
  29. type LayoutSpacer struct {
  30. BaseWidget
  31. space int
  32. expand bool
  33. }
  34. func (w *LayoutSpacer) Type() WidgetType {
  35. return WidgetTypeLayoutSpacer
  36. }
  37. func (w *LayoutSpacer) TypeName() string {
  38. return "LayoutSpacer"
  39. }
  40. func (w *LayoutSpacer) SetSpace(space int) error {
  41. w.space = space
  42. return nil
  43. }
  44. func (w *LayoutSpacer) Space() int {
  45. return w.space
  46. }
  47. func (w *LayoutSpacer) SetExpand(expand bool) error {
  48. w.expand = expand
  49. return nil
  50. }
  51. func (w *LayoutSpacer) IsExpand() bool {
  52. return w.expand
  53. }
  54. // width ignore for PackLayout
  55. func (w *LayoutSpacer) SetWidth(width int) error {
  56. return eval(fmt.Sprintf("%v configure -width {%v}", w.id, width))
  57. }
  58. func (w *LayoutSpacer) Width() int {
  59. r, _ := evalAsInt(fmt.Sprintf("%v cget -width", w.id))
  60. return r
  61. }
  62. // height ignore for PackLayout
  63. func (w *LayoutSpacer) SetHeight(height int) error {
  64. return eval(fmt.Sprintf("%v configure -height {%v}", w.id, height))
  65. }
  66. func (w *LayoutSpacer) Height() int {
  67. r, _ := evalAsInt(fmt.Sprintf("%v cget -height", w.id))
  68. return r
  69. }
  70. func NewLayoutSpacer(parent Widget, space int, expand bool) *LayoutSpacer {
  71. theme := checkInitUseTheme(nil)
  72. iid := makeNamedWidgetId(parent, "atk_layoutspacer")
  73. info := CreateWidgetInfo(iid, WidgetTypeFrame, theme, nil)
  74. if info == nil {
  75. return nil
  76. }
  77. w := &LayoutSpacer{}
  78. w.id = iid
  79. w.info = info
  80. w.space = space
  81. w.expand = expand
  82. RegisterWidget(w)
  83. return w
  84. }
  85. type LayoutFrame struct {
  86. BaseWidget
  87. }
  88. func (w *LayoutFrame) Type() WidgetType {
  89. return WidgetTypeLayoutFrame
  90. }
  91. func (w *LayoutFrame) TypeName() string {
  92. return "LayoutFrame"
  93. }
  94. func NewLayoutFrame(parent Widget, attributes ...*WidgetAttr) *LayoutFrame {
  95. theme := checkInitUseTheme(attributes)
  96. iid := makeNamedWidgetId(parent, "atk_layoutframe")
  97. info := CreateWidgetInfo(iid, WidgetTypeFrame, theme, attributes)
  98. if info == nil {
  99. return nil
  100. }
  101. w := &LayoutFrame{}
  102. w.id = iid
  103. w.info = info
  104. RegisterWidget(w)
  105. return w
  106. }
  107. func AppendLayoutAttrs(org []*LayoutAttr, attributes ...*LayoutAttr) []*LayoutAttr {
  108. var remain []*LayoutAttr
  109. var find bool
  110. for _, attr := range attributes {
  111. find = false
  112. for _, old := range org {
  113. if old.key == attr.key {
  114. old.value = attr.value
  115. find = true
  116. break
  117. }
  118. }
  119. if !find {
  120. remain = append(remain, attr)
  121. }
  122. }
  123. return append(org, remain...)
  124. }