From 5436f8f5fab00913c7c76dc4082110aecccd2dc9 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Thu, 13 Feb 2014 17:04:57 -0500 Subject: Added Stacks of controls. --- stack.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 stack.go (limited to 'stack.go') diff --git a/stack.go b/stack.go new file mode 100644 index 0000000..ed8d608 --- /dev/null +++ b/stack.go @@ -0,0 +1,73 @@ +// 13 february 2014 +package main + +import ( + "fmt" + "sync" +) + +// Orientation defines the orientation of controls in a Stack. +type Orientation int +const ( + Horizontal Orientation = iota + Vertical +) + +// A Stack stacks controls horizontally or vertically within the Stack's parent, alotting each the same size. +type Stack struct { + // The controls of the Stack. Once the Window containing the Stack has been created, this should not be modified. + Controls []Control + + lock sync.Mutex + created bool + orientation Orientation +} + +// NewStack creates a new Stack with the specified orientation. +func NewStack(o Orientation) *Stack { + if o != Horizontal && o != Vertical { + panic(fmt.Sprintf("invalid orientation %d given to NewStack()", o)) + } + return &Stack{ + orientation: o, + } +} + +// TODO adorn errors with which stage failed +func (s *Stack) apply(window *sysData) error { + for _, c := range s.Controls { + err := c.apply(window) + if err != nil { + return err + } + } + return nil +} + +// TODO adorn errors with which stage failed +func (s *Stack) setRect(x int, y int, width int, height int) error { + var dx, dy int + + if len(s.Controls) == 0 { // do nothing if there's nothing to do + return nil + } + switch s.orientation { + case Horizontal: + dx = width / len(s.Controls) + width = dx + case Vertical: + dy = height / len(s.Controls) + height = dy + default: + panic(fmt.Sprintf("invalid orientation %d given to Stack.setRect()", s.orientation)) + } + for _, c := range s.Controls { + err := c.setRect(x, y, width, height) + if err != nil { + return err + } + x += dx + y += dy + } + return nil +} -- cgit v1.2.3