58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
|
package views
|
||
|
|
||
|
import (
|
||
|
"image"
|
||
|
|
||
|
"git.milar.in/milarin/gui"
|
||
|
)
|
||
|
|
||
|
type AnchorView struct {
|
||
|
gui.WrapperTmpl
|
||
|
Anchor gui.Anchor
|
||
|
}
|
||
|
|
||
|
var _ gui.View = &AnchorView{}
|
||
|
|
||
|
func NewAnchorView(view gui.View, anchor gui.Anchor) *AnchorView {
|
||
|
v := &AnchorView{Anchor: anchor}
|
||
|
v.SetView(view)
|
||
|
return v
|
||
|
}
|
||
|
|
||
|
func (v *AnchorView) Draw(img *gui.Image, ctx gui.AppContext) {
|
||
|
var pos image.Point
|
||
|
|
||
|
w, h := v.View().Layout(ctx)
|
||
|
w = iff(w >= 0, w, img.Bounds().Dx())
|
||
|
h = iff(h >= 0, h, img.Bounds().Dy())
|
||
|
|
||
|
vw, vh := img.Bounds().Dx(), img.Bounds().Dy()
|
||
|
|
||
|
switch v.Anchor {
|
||
|
case gui.AnchorTopLeft:
|
||
|
pos = image.Pt(0, 0)
|
||
|
case gui.AnchorTop:
|
||
|
pos = image.Pt(vw/2-w/2, 0)
|
||
|
case gui.AnchorTopRight:
|
||
|
pos = image.Pt(vw-w, 0)
|
||
|
case gui.AnchorLeft:
|
||
|
pos = image.Pt(0, vh/2-h/2)
|
||
|
case gui.AnchorCenter:
|
||
|
pos = image.Pt(vw/2-w/2, vh/2-h/2)
|
||
|
case gui.AnchorRight:
|
||
|
pos = image.Pt(vw-w, vh/2-h/2)
|
||
|
case gui.AnchorBottomLeft:
|
||
|
pos = image.Pt(0, vh-h)
|
||
|
case gui.AnchorBottom:
|
||
|
pos = image.Pt(0, vh-h)
|
||
|
case gui.AnchorBottomRight:
|
||
|
pos = image.Pt(vw-w, vh-h)
|
||
|
default:
|
||
|
panic("invalid anchor in AnchorView")
|
||
|
}
|
||
|
|
||
|
pos = pos.Add(img.Bounds().Min)
|
||
|
rect := image.Rect(pos.X, pos.Y, pos.X+w, pos.Y+h)
|
||
|
v.View().Draw(img.SubImage(rect).(*gui.Image), ctx)
|
||
|
}
|