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:
parent
7ba3c5ac17
commit
c6cafdd402
25
grid.go
25
grid.go
|
@ -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
|
||||||
|
|
22
main_test.go
22
main_test.go
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue