2018-02-19 15:25:02 +08:00
|
|
|
package termui
|
|
|
|
|
|
|
|
var Body *Grid
|
|
|
|
|
|
|
|
// GridBufferer introduces a Bufferer that can be manipulated by Grid.
|
|
|
|
type GridBufferer interface {
|
|
|
|
Bufferer
|
|
|
|
Resize(int, int, int, int)
|
|
|
|
SetGrid(int, int, int, int)
|
|
|
|
}
|
|
|
|
|
|
|
|
type Grid struct {
|
|
|
|
Widgets []GridBufferer
|
|
|
|
Width int
|
|
|
|
Height int
|
|
|
|
Cols int
|
|
|
|
Rows int
|
2018-02-21 16:46:11 +08:00
|
|
|
BgColor Color
|
2018-02-19 15:25:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewGrid() *Grid {
|
|
|
|
return &Grid{}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (g *Grid) Set(x0, y0, x1, y1 int, widget GridBufferer) {
|
|
|
|
if widget == nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if x1 <= x0 || y1 <= y0 {
|
|
|
|
panic("Invalid widget coordinates")
|
|
|
|
}
|
|
|
|
|
|
|
|
widget.SetGrid(x0, y0, x1, y1)
|
|
|
|
widget.Resize(g.Width, g.Height, g.Cols, g.Rows)
|
|
|
|
|
|
|
|
g.Widgets = append(g.Widgets, widget)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (g *Grid) Resize() {
|
|
|
|
for _, w := range g.Widgets {
|
|
|
|
w.Resize(g.Width, g.Height, g.Cols, g.Rows)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Buffer implements Bufferer interface.
|
|
|
|
func (g *Grid) Buffer() *Buffer {
|
2018-02-22 02:39:19 +08:00
|
|
|
buf := NewFilledBuffer(0, 0, g.Width, g.Height, Cell{' ', ColorDefault, Theme.Bg})
|
2018-02-19 15:25:02 +08:00
|
|
|
for _, w := range g.Widgets {
|
|
|
|
buf.MergeWithOffset(w.Buffer(), w.GetXOffset(), w.GetYOffset())
|
|
|
|
}
|
|
|
|
return buf
|
|
|
|
}
|
|
|
|
|
|
|
|
func (g *Grid) GetXOffset() int {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func (g *Grid) GetYOffset() int {
|
|
|
|
return 0
|
|
|
|
}
|