Wrote the Grid test and found/fixed one error in Grid's position calculations. (If you compare the previous Windows build with this one, you may not notice a difference; this is because of the default preferred size of Labels being too wide).

This commit is contained in:
Pietro Gagliardi 2014-02-25 18:40:36 -05:00
parent 7ba3c5ac17
commit c6cafdd402
2 changed files with 35 additions and 12 deletions

25
grid.go
View File

@ -2,6 +2,7 @@
package ui package ui
import ( import (
"fmt"
"sync" "sync"
) )
@ -13,7 +14,7 @@ type Grid struct {
lock sync.Mutex lock sync.Mutex
created bool created bool
controls [][]Control controls [][]Control
cwidths, cheights [][]int // caches to avoid reallocating each time widths, heights [][]int // caches to avoid reallocating each time
rowheights, colwidths []int rowheights, colwidths []int
} }
@ -29,10 +30,10 @@ func NewGrid(nPerRow int, controls ...Control) *Grid {
if len(controls) % nPerRow != 0 { if len(controls) % nPerRow != 0 {
panic(fmt.Errorf("incomplete grid given to NewGrid() (not enough controls to evenly divide %d controls into rows of %d controls each)", len(controls), nPerRow)) panic(fmt.Errorf("incomplete grid given to NewGrid() (not enough controls to evenly divide %d controls into rows of %d controls each)", len(controls), nPerRow))
} }
nRows = len(controls) / nPerRow nRows := len(controls) / nPerRow
cc := make([][]Control, nRows) cc := make([][]Control, nRows)
cw := make([][]int, nRows) cw := make([][]int, nRows)
ch := make([][]int, nRow) ch := make([][]int, nRows)
i := 0 i := 0
for row := 0; row < nRows; row++ { for row := 0; row < nRows; row++ {
cc[row] = make([]Control, nPerRow) cc[row] = make([]Control, nPerRow)
@ -57,7 +58,7 @@ func (g *Grid) make(window *sysData) error {
defer g.lock.Unlock() defer g.lock.Unlock()
for row, xcol := range g.controls { for row, xcol := range g.controls {
for col, c := range xcol for col, c := range xcol {
err := c.make(window) err := c.make(window)
if err != nil { if err != nil {
return fmt.Errorf("error adding control (%d,%d) to Grid: %v", row, col, err) return fmt.Errorf("error adding control (%d,%d) to Grid: %v", row, col, err)
@ -93,24 +94,24 @@ func (g *Grid) setRect(x int, y int, width int, height int) error {
if err != nil { if err != nil {
return fmt.Errorf("error getting preferred size of control (%d,%d) in Grid.setRect(): %v", row, col, err) return fmt.Errorf("error getting preferred size of control (%d,%d) in Grid.setRect(): %v", row, col, err)
} }
widths[row][col] = w g.widths[row][col] = w
g.heights[row][col] = h g.heights[row][col] = h
g.rowheights[row] = max(g.rowheights[row], h) g.rowheights[row] = max(g.rowheights[row], h)
g.colwidths[col] = max(g.colwidths[row], w) g.colwidths[col] = max(g.colwidths[col], w)
} }
} }
// 3) draw // 3) draw
startx := x startx := x
for row, xcol := range g.controls { for row, xcol := range g.controls {
for col, c := range xcol { for col, c := range xcol {
err = c.setRect(x, y, g.widths[row][col], g.heights[row][col]) err := c.setRect(x, y, g.widths[row][col], g.heights[row][col])
if err != nil { if err != nil {
return fmt.Errorf("error setting size of control (%d,%d) in Grid.setRect(): %v", row, col, err) return fmt.Errorf("error setting size of control (%d,%d) in Grid.setRect(): %v", row, col, err)
} }
x += colwidths[col] x += g.colwidths[col]
} }
x = startx x = startx
y += rowheights[row] y += g.rowheights[row]
} }
return nil return nil
} }
@ -138,12 +139,12 @@ func (g *Grid) preferredSize() (width int, height int, err error) {
for col, c := range xcol { for col, c := range xcol {
w, h, err := c.preferredSize() w, h, err := c.preferredSize()
if err != nil { if err != nil {
return fmt.Errorf("error getting preferred size of control (%d,%d) in Grid.setRect(): %v", row, col, err) return 0, 0, fmt.Errorf("error getting preferred size of control (%d,%d) in Grid.setRect(): %v", row, col, err)
} }
widths[row][col] = w g.widths[row][col] = w
g.heights[row][col] = h g.heights[row][col] = h
g.rowheights[row] = max(g.rowheights[row], h) g.rowheights[row] = max(g.rowheights[row], h)
g.colwidths[col] = max(g.colwidths[row], w) g.colwidths[col] = max(g.colwidths[col], w)
} }
} }
// 3) now compute // 3) now compute

View File

@ -6,6 +6,23 @@ import (
"testing" "testing"
) )
func gridWindow() (*Window, error) {
w := NewWindow("Grid Test", 400, 400)
b00 := NewButton("0,0")
b01 := NewButton("0,1")
b02 := NewButton("0,2")
l11 := NewListbox(true, "1,1")
b12 := NewButton("1,2")
l20 := NewLabel("2,0")
c21 := NewCheckbox("2,1")
l22 := NewLabel("2,2")
g := NewGrid(3,
b00, b01, b02,
Space(), l11, b12,
l20, c21, l22)
return w, w.Open(g)
}
func TestMain(t *testing.T) { func TestMain(t *testing.T) {
w := NewWindow("Main Window", 320, 240) w := NewWindow("Main Window", 320, 240)
w.Closing = Event() w.Closing = Event()
@ -50,6 +67,10 @@ func TestMain(t *testing.T) {
if err != nil { if err != nil {
panic(err) panic(err)
} }
gw, err := gridWindow()
if err != nil {
panic(err)
}
mainloop: mainloop:
for { for {
@ -93,5 +114,6 @@ mainloop:
pbar.SetProgress(prog) pbar.SetProgress(prog)
} }
} }
gw.Hide()
w.Hide() w.Hide()
} }