summaryrefslogtreecommitdiff
path: root/stack.go
diff options
context:
space:
mode:
Diffstat (limited to 'stack.go')
-rw-r--r--stack.go23
1 files changed, 21 insertions, 2 deletions
diff --git a/stack.go b/stack.go
index 46b8878..4a6a033 100644
--- a/stack.go
+++ b/stack.go
@@ -13,12 +13,18 @@ const (
Vertical
)
-// A Stack stacks controls horizontally or vertically within the Stack's parent, alotting each the same size.
+// A Stack stacks controls horizontally or vertically within the Stack's parent.
+// A horizontal Stack gives all controls the same height and their preferred widths.
+// A vertical Stack gives all controls the same width and their preferred heights.
+// Some controls may be marked as "stretchy": when the Window they are in changes size, stretchy controls resize to take up the remaining space after non-stretchy controls are laid out. If multiple controls are marked stretchy, they are alloted equal distribution of the remaining space.
type Stack struct {
lock sync.Mutex
created bool
orientation Orientation
controls []Control
+ stretchy []bool
+ xpos, ypos []int // caches to avoid reallocating these each time
+ width, height []int
}
// NewStack creates a new Stack with the specified orientation.
@@ -29,14 +35,27 @@ func NewStack(o Orientation, controls ...Control) *Stack {
return &Stack{
orientation: o,
controls: controls,
+ stretchy: make([]bool, len(controls)),
+ xpos: make([]int, len(controls)),
+ ypos: make([]int, len(controls)),
+ width: make([]int, len(controls)),
+ height: make([]int, len(controls)),
}
}
+// SetStretchy marks a control in a Stack as stretchy.
+func (s *Stack) SetStretchy(index int) {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ s[index] = true // TODO explicitly check for index out of bounds?
+}
+
func (s *Stack) make(window *sysData) error {
for i, c := range s.controls {
err := c.make(window)
if err != nil {
- return fmt.Errorf("error adding control %d: %v", i, err)
+ return fmt.Errorf("error adding control %d to Stack: %v", i, err)
}
}
s.created = true