diff --git a/main.go b/main.go index 09c0fe1..5745c51 100644 --- a/main.go +++ b/main.go @@ -9,14 +9,10 @@ func main() { w := NewWindow("Main Window", 320, 240) w.Closing = make(chan struct{}) b := NewButton("Click Me") - err := w.Open(b) - if err != nil { - panic(err) - } - - w2 := NewWindow("Checkbox Window", 200, 100) c := NewCheckbox("Check Me") - err = w2.Open(c) + s := NewStack(Vertical) + s.Controls = []Control{b, c} + err := w.Open(s) if err != nil { panic(err) } 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 +} diff --git a/todo.md b/todo.md index c52a71f..6cc362d 100644 --- a/todo.md +++ b/todo.md @@ -2,6 +2,7 @@ so I don't forget: - Window.SizeToFit() or WIndow.OptimalSize() (use: `Window.SetSize(Window.OptimalSize())`) for sizing a window to the control's interest - Control.Show()/Control.Hide() - Control.SetText() +- Groupbox super ultra important things: - the windows build appears to be unstable: @@ -16,3 +17,7 @@ far off: - localization - strip unused constants from the Windows files - combine more Windows files; rename some? +- normalize error handling to adorn errors with function call information + +maybe: +- rename Stack to Box?