placeframe.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright 2018 visualfc. All rights reserved.
  2. package tk
  3. type PlaceFrame struct {
  4. *Frame
  5. items []*LayoutItem
  6. }
  7. func (w *PlaceFrame) removeItem(widget Widget) error {
  8. n := w.indexOfWidget(widget)
  9. if n == -1 {
  10. return ErrInvalid
  11. }
  12. PlaceRemove(widget)
  13. w.items = append(w.items[:n], w.items[n+1:]...)
  14. return nil
  15. }
  16. func (w *PlaceFrame) indexOfWidget(widget Widget) int {
  17. for n, v := range w.items {
  18. if v.widget == widget {
  19. return n
  20. }
  21. }
  22. return -1
  23. }
  24. func (w *PlaceFrame) AddWidget(widget Widget, attributes ...*LayoutAttr) error {
  25. if !IsValidWidget(widget) {
  26. return ErrInvalid
  27. }
  28. n := w.indexOfWidget(widget)
  29. if n != -1 {
  30. w.items = append(w.items[:n], w.items[n+1:]...)
  31. }
  32. w.items = append(w.items, &LayoutItem{widget, attributes})
  33. return w.Repack()
  34. }
  35. func (w *PlaceFrame) InsertWidget(index int, widget Widget, attributes ...*LayoutAttr) error {
  36. if index < 0 {
  37. return w.AddWidget(widget, attributes...)
  38. }
  39. n := w.indexOfWidget(widget)
  40. if n != -1 {
  41. if n == index {
  42. return ErrExist
  43. }
  44. w.items = append(w.items[:n], w.items[n+1:]...)
  45. }
  46. if index >= len(w.items) {
  47. return w.AddWidget(widget, attributes...)
  48. }
  49. w.items = append(w.items[:index], append([]*LayoutItem{&LayoutItem{widget, attributes}}, w.items[index:]...)...)
  50. return w.Repack()
  51. }
  52. func (w *PlaceFrame) RemoveWidget(widget Widget) error {
  53. if !IsValidWidget(widget) {
  54. return ErrInvalid
  55. }
  56. return w.removeItem(widget)
  57. }
  58. func (w *PlaceFrame) SetWidgetAttr(widget Widget, attributes ...*LayoutAttr) error {
  59. if !IsValidWidget(widget) {
  60. return ErrInvalid
  61. }
  62. n := w.indexOfWidget(widget)
  63. if n == -1 {
  64. return ErrInvalid
  65. }
  66. w.items[n].attrs = attributes
  67. return w.Repack()
  68. }
  69. func (w *PlaceFrame) Repack() error {
  70. for _, item := range w.items {
  71. if item.widget == nil {
  72. continue
  73. }
  74. Place(item.widget, AppendLayoutAttrs(item.attrs, PlaceAttrInMaster(w))...)
  75. }
  76. return Pack(w, PackAttrFill(FillBoth), PackAttrExpand(true))
  77. }
  78. func NewPlaceFrame(parent Widget) *PlaceFrame {
  79. place := &PlaceFrame{NewFrame(parent), nil}
  80. place.Lower(nil)
  81. place.Repack()
  82. return place
  83. }