Grid stub

This commit is contained in:
Sasha Koshka 2023-04-05 02:12:17 -04:00
parent 8db8fab14a
commit 34b79ee30d
3 changed files with 137 additions and 1 deletions

134
elements/grid.go Normal file
View File

@ -0,0 +1,134 @@
package elements
import "image"
import "golang.org/x/image/font"
import "git.tebibyte.media/sashakoshka/tomo"
import "git.tebibyte.media/sashakoshka/tomo/input"
import "git.tebibyte.media/sashakoshka/tomo/default/theme"
import "git.tebibyte.media/sashakoshka/tomo/default/config"
// import "git.tebibyte.media/sashakoshka/tomo/textdraw"
import "git.tebibyte.media/sashakoshka/tomo/elements/core"
type gridCell struct {
rune
tomo.FontStyle
background tomo.Color
foreground tomo.Color
clean bool
}
type gridBuffer struct {
cells []gridCell
stride int
}
// Grid is an array of monospaced character cells. Each one has a foreground and
// background color. It satisfies io.Writer and can be fed text with ANSI escape
// codes.
type Grid struct {
*core.Core
*core.FocusableCore
core core.CoreControl
cells []gridCell
stride int
cellWidth int
cellHeight int
face font.Face
config config.Wrapped
theme theme.Wrapped
onResize func ()
}
func NewGrid () (element *Grid) {
element = &Grid { }
element.theme.Case = tomo.C("tomo", "grid")
element.Core, element.core = core.NewCore(element, element.drawAndPush)
element.updateFont()
element.updateMinimumSize()
return
}
func (element *Grid) HandleMouseDown (x, y int, button input.Button) {
}
func (element *Grid) HandleMouseUp (x, y int, button input.Button) {
}
func (element *Grid) HandleKeyDown (key input.Key, modifiers input.Modifiers) {
}
func (element *Grid) HandleKeyUp(key input.Key, modifiers input.Modifiers) {
}
// SetTheme sets the element's theme.
func (element *Grid) SetTheme (new tomo.Theme) {
if new == element.theme.Theme { return }
element.theme.Theme = new
element.updateFont()
element.updateMinimumSize()
element.drawAndPush()
}
// SetConfig sets the element's configuration.
func (element *Grid) SetConfig (new tomo.Config) {
if new == element.config.Config { return }
element.config.Config = new
element.updateMinimumSize()
element.drawAndPush()
}
func (element *Grid) alloc () bool {
bounds := element.Bounds()
width := bounds.Dx() / element.cellWidth
height := bounds.Dy() / element.cellHeight
unchanged :=
width == element.stride &&
height == len(element.cells) / element.stride
if unchanged { return false }
// TODO: attempt to wrap text
element.stride = width
element.cells = make([]gridCell, width * height)
for index := range element.cells {
element.cells[index].background = tomo.ColorBackground
element.cells[index].foreground = tomo.ColorForeground
}
return true
}
func (element *Grid) updateFont () {
element.face = element.theme.FontFace (
tomo.FontStyleMonospace,
tomo.FontSizeNormal)
emSpace, _ := element.face.GlyphAdvance('M')
metrics := element.face.Metrics()
element.cellWidth = emSpace.Round()
element.cellHeight = metrics.Height.Round()
}
func (element *Grid) updateMinimumSize () {
element.core.SetMinimumSize(element.cellWidth, element.cellHeight)
}
func (element *Grid) state () tomo.State {
return tomo.State {
}
}
func (element *Grid) drawAndPush () {
if element.core.HasImage () {
element.core.DamageRegion(element.draw(true))
}
}
func (element *Grid) draw (force bool) image.Rectangle {
}

1
go.mod
View File

@ -22,3 +22,4 @@ require (
github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect
github.com/jezek/xgb v1.1.0
)

View File

@ -276,12 +276,13 @@ type FontSize int; const (
// about.
FontSizeSmall
)
// FontStyle specifies stylistic alterations to a font face.
type FontStyle int; const (
FontStyleRegular FontStyle = 0
FontStyleBold FontStyle = 1
FontStyleItalic FontStyle = 2
FontStyleMonospace FontStyle = 4
FontStyleBoldItalic FontStyle = 1 | 2
)