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