1package ui 2 3import ( 4 "github.com/gdamore/tcell" 5) 6 7const ( 8 BORDER_LEFT = 1 << iota 9 BORDER_TOP = 1 << iota 10 BORDER_RIGHT = 1 << iota 11 BORDER_BOTTOM = 1 << iota 12) 13 14type Bordered struct { 15 Invalidatable 16 borders uint 17 content Drawable 18 onInvalidate func(d Drawable) 19} 20 21func NewBordered(content Drawable, borders uint) *Bordered { 22 b := &Bordered{ 23 borders: borders, 24 content: content, 25 } 26 content.OnInvalidate(b.contentInvalidated) 27 return b 28} 29 30func (bordered *Bordered) contentInvalidated(d Drawable) { 31 bordered.Invalidate() 32} 33 34func (bordered *Bordered) Children() []Drawable { 35 return []Drawable{bordered.content} 36} 37 38func (bordered *Bordered) Invalidate() { 39 bordered.DoInvalidate(bordered) 40} 41 42func (bordered *Bordered) Draw(ctx *Context) { 43 x := 0 44 y := 0 45 width := ctx.Width() 46 height := ctx.Height() 47 style := tcell.StyleDefault.Reverse(true) 48 if bordered.borders&BORDER_LEFT != 0 { 49 ctx.Fill(0, 0, 1, ctx.Height(), ' ', style) 50 x += 1 51 width -= 1 52 } 53 if bordered.borders&BORDER_TOP != 0 { 54 ctx.Fill(0, 0, ctx.Width(), 1, ' ', style) 55 y += 1 56 height -= 1 57 } 58 if bordered.borders&BORDER_RIGHT != 0 { 59 ctx.Fill(ctx.Width()-1, 0, 1, ctx.Height(), ' ', style) 60 width -= 1 61 } 62 if bordered.borders&BORDER_BOTTOM != 0 { 63 ctx.Fill(0, ctx.Height()-1, ctx.Width(), 1, ' ', style) 64 height -= 1 65 } 66 subctx := ctx.Subcontext(x, y, width, height) 67 bordered.content.Draw(subctx) 68} 69 70func (bordered *Bordered) MouseEvent(localX int, localY int, event tcell.Event) { 71 switch content := bordered.content.(type) { 72 case Mouseable: 73 content.MouseEvent(localX, localY, event) 74 } 75} 76