github.com/jmigpin/editor@v1.6.0/util/uiutil/widget/pad.go (about) 1 package widget 2 3 import ( 4 "image" 5 6 "github.com/jmigpin/editor/util/imageutil" 7 ) 8 9 type Pad struct { 10 *Padder 11 } 12 13 func NewPad(ctx ImageContext, child Node) *Pad { 14 b := &Pad{Padder: NewPadder(ctx, child)} 15 b.Padder.colorName = "pad" 16 return b 17 } 18 19 //---------- 20 21 // Used by Pad and Border. 22 type Padder struct { 23 ENode 24 Top, Right, Bottom, Left int 25 ctx ImageContext 26 colorName string 27 } 28 29 func NewPadder(ctx ImageContext, child Node) *Padder { 30 p := &Padder{ctx: ctx} 31 p.Append(child) 32 return p 33 } 34 35 func (p *Padder) Set(t, r, b, l int) { 36 p.Top = t 37 p.Right = r 38 p.Bottom = b 39 p.Left = l 40 } 41 func (p *Padder) Set2(v [4]int) { 42 p.Set(v[0], v[1], v[2], v[3]) 43 } 44 func (p *Padder) SetAll(v int) { 45 p.Set(v, v, v, v) 46 } 47 48 func (p *Padder) Measure(hint image.Point) image.Point { 49 h := hint 50 h.X -= p.Right + p.Left 51 h.Y -= p.Top + p.Bottom 52 h = imageutil.MaxPoint(h, image.Point{0, 0}) 53 m := p.ENode.Measure(h) 54 m.X += p.Right + p.Left 55 m.Y += p.Top + p.Bottom 56 m = imageutil.MinPoint(m, hint) 57 return m 58 } 59 60 func (p *Padder) Layout() { 61 u := p.Bounds 62 u.Min = u.Min.Add(image.Point{p.Left, p.Top}) 63 u.Max = u.Max.Sub(image.Point{p.Right, p.Bottom}) 64 u = u.Intersect(p.Bounds) 65 p.Iterate2(func(c *EmbedNode) { 66 c.Bounds = u 67 }) 68 } 69 func (p *Padder) Paint() { 70 c1 := p.TreeThemePaletteColor(p.colorName) 71 72 b := p.Bounds 73 // top 74 u := b 75 u.Max.Y = u.Min.Y + p.Top 76 u = u.Intersect(b) 77 imageutil.FillRectangle(p.ctx.Image(), u, c1) 78 // bottom 79 u = b 80 u.Min.Y = u.Max.Y - p.Bottom 81 u = u.Intersect(b) 82 imageutil.FillRectangle(p.ctx.Image(), u, c1) 83 // right 84 u = b 85 u.Min.X = u.Max.X - p.Right 86 u = u.Intersect(b) 87 imageutil.FillRectangle(p.ctx.Image(), u, c1) 88 // left 89 u = b 90 u.Max.X = u.Min.X + p.Left 91 u = u.Intersect(b) 92 imageutil.FillRectangle(p.ctx.Image(), u, c1) 93 }