Grid stub
This commit is contained in:
parent
8db8fab14a
commit
34b79ee30d
134
elements/grid.go
Normal file
134
elements/grid.go
Normal 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
1
go.mod
@ -22,3 +22,4 @@ require (
|
|||||||
github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect
|
github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect
|
||||||
github.com/jezek/xgb v1.1.0
|
github.com/jezek/xgb v1.1.0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
3
theme.go
3
theme.go
@ -276,12 +276,13 @@ type FontSize int; const (
|
|||||||
// about.
|
// about.
|
||||||
FontSizeSmall
|
FontSizeSmall
|
||||||
)
|
)
|
||||||
|
|
||||||
// FontStyle specifies stylistic alterations to a font face.
|
// FontStyle specifies stylistic alterations to a font face.
|
||||||
type FontStyle int; const (
|
type FontStyle int; const (
|
||||||
FontStyleRegular FontStyle = 0
|
FontStyleRegular FontStyle = 0
|
||||||
FontStyleBold FontStyle = 1
|
FontStyleBold FontStyle = 1
|
||||||
FontStyleItalic FontStyle = 2
|
FontStyleItalic FontStyle = 2
|
||||||
|
FontStyleMonospace FontStyle = 4
|
||||||
FontStyleBoldItalic FontStyle = 1 | 2
|
FontStyleBoldItalic FontStyle = 1 | 2
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user