last_light/render/rectangle.go

147 lines
3.2 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 rectangle struct {
id uuid.UUID
size util.Size
position util.Position
style tcell.Style
northBorder rune
westBorder rune
eastBorder rune
southBorder rune
nwCorner rune
swCorner rune
seCorner rune
neCorner rune
isBorderless bool
isFilled bool
2024-04-19 23:11:21 +03:00
fillRune rune
}
func CreateBorderlessRectangle(x, y uint16, width, height uint16, fillRune rune, style tcell.Style) rectangle {
return CreateRectangle(
x, y, width, height,
0, 0, 0,
0, fillRune, 0,
0, 0, 0,
true, true, style,
)
}
func CreateSimpleEmptyRectangle(x, y uint16, width, height uint16, borderRune rune, style tcell.Style) rectangle {
return CreateRectangle(
x, y, width, height,
borderRune, borderRune, borderRune,
borderRune, 0, borderRune,
borderRune, borderRune, borderRune,
false, false, style,
)
}
2024-04-19 23:11:21 +03:00
func CreateSimpleRectangle(x uint16, y uint16, width uint16, height uint16, borderRune rune, fillRune rune, style tcell.Style) rectangle {
return CreateRectangle(
x, y, width, height,
borderRune, borderRune, borderRune,
borderRune, fillRune, borderRune,
borderRune, borderRune, borderRune,
false, true, style,
2024-04-19 23:11:21 +03:00
)
}
// CreateRectangle(
//
// x, y, width, height,
// '┌', '─', '┐',
// '│', ' ', '│',
// '└', '─', '┘',
// false, true,
// style
2024-04-19 23:11:21 +03:00
//
// )
func CreateRectangle(
x uint16,
y uint16,
width uint16,
height uint16,
nwCorner, northBorder, neCorner,
westBorder, fillRune, eastBorder,
swCorner, southBorder, seCorner rune,
isBorderless, isFilled bool,
2024-04-19 23:11:21 +03:00
style tcell.Style,
) rectangle {
return rectangle{
id: uuid.New(),
size: util.SizeOf(width, height),
position: util.PositionAt(x, y),
style: style,
northBorder: northBorder,
eastBorder: eastBorder,
southBorder: southBorder,
westBorder: westBorder,
nwCorner: nwCorner,
seCorner: seCorner,
swCorner: swCorner,
neCorner: neCorner,
isBorderless: isBorderless,
isFilled: isFilled,
fillRune: fillRune,
2024-04-19 23:11:21 +03:00
}
}
func (rect rectangle) UniqueId() uuid.UUID {
return rect.id
}
func (rect rectangle) drawBorders(v views.View) {
2024-04-19 23:11:21 +03:00
width := rect.size.Width()
height := rect.size.Height()
x := rect.position.X()
y := rect.position.Y()
v.SetContent(x, y, rect.nwCorner, nil, rect.style)
v.SetContent(x+width-1, y, rect.neCorner, nil, rect.style)
v.SetContent(x, y+height-1, rect.swCorner, nil, rect.style)
v.SetContent(x+width-1, y+height-1, rect.seCorner, nil, rect.style)
for w := range width - 2 {
v.SetContent(1+w, y, rect.northBorder, nil, rect.style)
v.SetContent(1+w, y+height-1, rect.southBorder, nil, rect.style)
}
for h := range height - 2 {
v.SetContent(x, 1+h, rect.westBorder, nil, rect.style)
v.SetContent(x+width-1, 1+h, rect.eastBorder, nil, rect.style)
}
}
func (rect rectangle) drawFill(v views.View) {
for w := range rect.size.Width() - 2 {
for h := range rect.size.Height() - 2 {
v.SetContent(1+w, 1+h, rect.fillRune, nil, rect.style)
2024-04-19 23:11:21 +03:00
}
}
}
func (rect rectangle) Draw(v views.View) {
if !rect.isBorderless {
rect.drawBorders(v)
}
if rect.isFilled {
rect.drawFill(v)
}
}