Fixed up Grid and wrote a test.
This commit is contained in:
parent
0359d3bf4a
commit
a282a12b81
21
redo/grid.go
21
redo/grid.go
|
@ -25,7 +25,7 @@ type Grid interface {
|
||||||
|
|
||||||
// SetStretchy marks the given Control of the Grid as stretchy.
|
// SetStretchy marks the given Control of the Grid as stretchy.
|
||||||
// Stretchy implies filling.
|
// Stretchy implies filling.
|
||||||
// Only one control can be stretchy per Grid; calling SetStretchy multiple times merely changes which control is stretchy.
|
// Only one control can be stretchy per Grid; calling SetStretchy multiple times merely changes which control is stretchy (preserving the previous filling value).
|
||||||
// It panics if the given coordinate is invalid.
|
// It panics if the given coordinate is invalid.
|
||||||
SetStretchy(row int, column int)
|
SetStretchy(row int, column int)
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@ type grid struct {
|
||||||
controls [][]Control
|
controls [][]Control
|
||||||
filling [][]bool
|
filling [][]bool
|
||||||
stretchyrow, stretchycol int
|
stretchyrow, stretchycol int
|
||||||
|
stretchyfill bool
|
||||||
widths, heights [][]int // caches to avoid reallocating each time
|
widths, heights [][]int // caches to avoid reallocating each time
|
||||||
rowheights, colwidths []int
|
rowheights, colwidths []int
|
||||||
}
|
}
|
||||||
|
@ -92,20 +93,24 @@ func (g *grid) SetStretchy(row int, column int) {
|
||||||
if row < 0 || column < 0 || row > len(g.filling) || column > len(g.filling[row]) {
|
if row < 0 || column < 0 || row > len(g.filling) || column > len(g.filling[row]) {
|
||||||
panic(fmt.Errorf("coordinate (%d,%d) out of range passed to Grid.SetStretchy()", row, column))
|
panic(fmt.Errorf("coordinate (%d,%d) out of range passed to Grid.SetStretchy()", row, column))
|
||||||
}
|
}
|
||||||
|
if g.stretchyrow != -1 || g.stretchycol != -1 {
|
||||||
|
g.filling[g.stretchyrow][g.stretchycol] = g.stretchyfill
|
||||||
|
}
|
||||||
g.stretchyrow = row
|
g.stretchyrow = row
|
||||||
g.stretchycol = column
|
g.stretchycol = column
|
||||||
// don't set filling here in case we call SetStretchy() multiple times; the filling is committed in make() below
|
g.stretchyfill = g.filling[g.stretchyrow][g.stretchycol] // save previous value in case it changes later
|
||||||
|
g.filling[g.stretchyrow][g.stretchycol] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *grid) setParent(parent *controlParent) {
|
func (g *grid) setParent(parent *controlParent) {
|
||||||
for _, col := range s.controls {
|
for _, col := range g.controls {
|
||||||
for _, c := range col {
|
for _, c := range col {
|
||||||
c.setParent(parent)
|
c.setParent(parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *grid) allocate(x int, y int, width int, height int, d *sysSizeData) (allocations []*allocation) {
|
func (g *grid) allocate(x int, y int, width int, height int, d *sizing) (allocations []*allocation) {
|
||||||
max := func(a int, b int) int {
|
max := func(a int, b int) int {
|
||||||
if a > b {
|
if a > b {
|
||||||
return a
|
return a
|
||||||
|
@ -115,7 +120,7 @@ func (g *grid) allocate(x int, y int, width int, height int, d *sysSizeData) (al
|
||||||
|
|
||||||
var current *allocation // for neighboring
|
var current *allocation // for neighboring
|
||||||
|
|
||||||
if len(controls) == 0 {
|
if len(g.controls) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// 0) inset the available rect by the needed padding
|
// 0) inset the available rect by the needed padding
|
||||||
|
@ -183,7 +188,7 @@ func (g *grid) allocate(x int, y int, width int, height int, d *sysSizeData) (al
|
||||||
}
|
}
|
||||||
|
|
||||||
// filling and stretchy are ignored for preferred size calculation
|
// filling and stretchy are ignored for preferred size calculation
|
||||||
func (g *grid) preferredSize(d *sysSizeData) (width int, height int) {
|
func (g *grid) preferredSize(d *sizing) (width int, height int) {
|
||||||
max := func(a int, b int) int {
|
max := func(a int, b int) int {
|
||||||
if a > b {
|
if a > b {
|
||||||
return a
|
return a
|
||||||
|
@ -220,10 +225,10 @@ func (g *grid) preferredSize(d *sysSizeData) (width int, height int) {
|
||||||
return width, height
|
return width, height
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *grid) commitResize(c *allocation, d *sysSizeData) {
|
func (g *grid) commitResize(c *allocation, d *sizing) {
|
||||||
// this is to satisfy Control; nothing to do here
|
// this is to satisfy Control; nothing to do here
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *grid) getAuxResizeInfo(d *sysSizeData) {
|
func (g *grid) getAuxResizeInfo(d *sizing) {
|
||||||
// this is to satisfy Control; nothing to do here
|
// this is to satisfy Control; nothing to do here
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ var ddata = []dtype{
|
||||||
type testwin struct {
|
type testwin struct {
|
||||||
t Tab
|
t Tab
|
||||||
w Window
|
w Window
|
||||||
|
grid Grid
|
||||||
nt Tab
|
nt Tab
|
||||||
a Area
|
a Area
|
||||||
spw Stack
|
spw Stack
|
||||||
|
@ -68,6 +69,14 @@ func (tw *testwin) make(done chan struct{}) {
|
||||||
done <- struct{}{}
|
done <- struct{}{}
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
tw.grid = NewGrid(3,
|
||||||
|
NewLabel("0,0"), NewTextField(), NewLabel("0,2"),
|
||||||
|
NewButton("1,0"), NewButton("1,1"), NewButton("1,2"),
|
||||||
|
NewLabel("2,0"), NewTextField(), NewStandaloneLabel("2,2"))
|
||||||
|
tw.grid.SetFilling(2, 1)
|
||||||
|
tw.grid.SetFilling(1, 2)
|
||||||
|
tw.grid.SetStretchy(1, 1)
|
||||||
|
tw.t.Append("Grid", tw.grid)
|
||||||
tw.t.Append("Blank Tab", NewTab())
|
tw.t.Append("Blank Tab", NewTab())
|
||||||
tw.nt = NewTab()
|
tw.nt = NewTab()
|
||||||
tw.nt.Append("Tab 1", Space())
|
tw.nt.Append("Tab 1", Space())
|
||||||
|
|
Loading…
Reference in New Issue