last_light/render/grid.go

150 lines
3.9 KiB
Go
Raw Normal View History

2024-04-19 23:11:21 +03:00
package render
import (
"mvvasilev/last_light/util"
"github.com/gdamore/tcell/v2"
"github.com/gdamore/tcell/v2/views"
2024-04-19 23:11:21 +03:00
"github.com/google/uuid"
)
type grid struct {
id uuid.UUID
internalCellSize util.Size
numCellsHorizontal uint16
numCellsVertical uint16
position util.Position
style tcell.Style
northBorder rune
westBorder rune
eastBorder rune
southBorder rune
internalVerticalBorder rune
internalHorizontalBorder rune
2024-04-19 23:11:21 +03:00
nwCorner rune
swCorner rune
seCorner rune
neCorner rune
verticalDownwardsTJunction rune
verticalUpwardsTJunction rune
horizontalLeftTJunction rune
horizontalRightTJunction rune
crossJunction rune
2024-04-19 23:11:21 +03:00
fillRune rune
}
func CreateSimpleGrid(
x, y uint16,
cellWidth, cellHeight uint16,
numCellsHorizontal, numCellsVertical uint16,
borderRune, fillRune rune,
style tcell.Style,
) grid {
return CreateGrid(
x, y, cellWidth, cellHeight, numCellsHorizontal, numCellsVertical,
borderRune, borderRune, borderRune, borderRune,
borderRune, fillRune, borderRune, borderRune,
borderRune, borderRune, borderRune, borderRune,
borderRune, borderRune, borderRune, borderRune,
style,
)
}
// '┌', '─', '┬', '┐',
// '│', '#', '│', '│',
// '├', '─', '┼', '┤',
// '└', '─', '┴', '┘',
2024-04-19 23:11:21 +03:00
func CreateGrid(
x uint16,
y uint16,
cellWidth uint16,
cellHeight uint16,
numCellsHorizontal uint16,
numCellsVertical uint16,
nwCorner, northBorder, verticalDownwardsTJunction, neCorner,
westBorder, fillRune, internalVerticalBorder, eastBorder,
horizontalRightTJunction, internalHorizontalBorder, crossJunction, horizontalLeftTJunction,
swCorner, southBorder, verticalUpwardsTJunction, seCorner rune,
2024-04-19 23:11:21 +03:00
style tcell.Style,
) grid {
return grid{
id: uuid.New(),
internalCellSize: util.SizeOf(cellWidth, cellHeight),
numCellsHorizontal: numCellsHorizontal,
numCellsVertical: numCellsVertical,
position: util.PositionAt(x, y),
style: style,
northBorder: northBorder,
eastBorder: eastBorder,
southBorder: southBorder,
westBorder: westBorder,
internalVerticalBorder: internalVerticalBorder,
internalHorizontalBorder: internalHorizontalBorder,
nwCorner: nwCorner,
seCorner: seCorner,
swCorner: swCorner,
neCorner: neCorner,
verticalDownwardsTJunction: verticalDownwardsTJunction,
verticalUpwardsTJunction: verticalUpwardsTJunction,
horizontalRightTJunction: horizontalRightTJunction,
horizontalLeftTJunction: horizontalLeftTJunction,
fillRune: fillRune,
crossJunction: crossJunction,
2024-04-19 23:11:21 +03:00
}
}
func (g grid) UniqueId() uuid.UUID {
return g.id
}
// C###T###T###C
// # # # #
// # # # #
// # # # #
// T###X###X###T
// # # # #
// # # # #
// # # # #
// T###X###X###T
// # # # #
// # # # #
// # # # #
// C###T###T###C
func (g grid) drawBorders(v views.View) {
width := 2 + (g.internalCellSize.Width() * int(g.numCellsHorizontal)) + (int(g.numCellsHorizontal) - 1)
height := 2 + (g.internalCellSize.Height() * int(g.numCellsVertical)) + (int(g.numCellsVertical) - 1)
x := g.position.X()
y := g.position.Y()
v.SetContent(x, y, g.nwCorner, nil, g.style)
v.SetContent(x+width-1, y, g.neCorner, nil, g.style)
v.SetContent(x, y+height-1, g.swCorner, nil, g.style)
v.SetContent(x+width-1, y+height-1, g.seCorner, nil, g.style)
for w := range width - 2 {
v.SetContent(1+w, y, g.northBorder, nil, g.style)
v.SetContent(1+w, y+height-1, g.southBorder, nil, g.style)
}
for h := range height - 2 {
v.SetContent(x, 1+h, g.westBorder, nil, g.style)
v.SetContent(x+width-1, 1+h, g.eastBorder, nil, g.style)
}
}
func (g grid) drawFill(v views.View) {
}
2024-04-19 23:11:21 +03:00
func (g grid) Draw(v views.View) {
g.drawBorders(v)
g.drawFill(v)
2024-04-19 23:11:21 +03:00
}