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  }