func (i *Image) PixelAt(p math.Point) (math.Point, bool) { ir := i.calculateDrawRect() if tex := i.Texture(); tex != nil { s := tex.SizePixels() p = p.Sub(ir.Min). ScaleX(float32(s.W) / float32(ir.W())). ScaleY(float32(s.H) / float32(ir.H())) if s.Rect().Contains(p) { return p, true } } return math.Point{X: -1, Y: -1}, false }
func (c *Container) ContainsPoint(p math.Point) bool { if !c.outer.IsVisible() || !c.outer.Size().Rect().Contains(p) { return false } for _, v := range c.children { if v.Control.ContainsPoint(p.Sub(v.Offset)) { return true } } if c.IsMouseEventTarget() { return true } return false }
func TopControlsUnder(p math.Point, c Parent) ControlPointList { children := c.Children() for i := len(children) - 1; i >= 0; i-- { child := children[i] cp := p.Sub(child.Offset) if child.Control.ContainsPoint(cp) { l := ControlPointList{ControlPoint{child.Control, cp}} if cc, ok := child.Control.(Parent); ok { l = append(l, TopControlsUnder(cp, cc)...) } return l } } return ControlPointList{} }
func BreadcrumbsAt(p Container, pnt math.Point) string { s := reflect.TypeOf(p).String() for _, c := range p.Children() { b := c.Control.Size().Rect().Offset(c.Offset) if b.Contains(pnt) { switch t := c.Control.(type) { case Container: return s + " > " + BreadcrumbsAt(t, pnt.Sub(c.Offset)) default: return s + " > " + reflect.TypeOf(c.Control).String() } } } return s }
func ControlsUnder(p math.Point, c Parent) ControlPointList { toVisit := []ParentPoint{ParentPoint{c, p}} l := ControlPointList{} for len(toVisit) > 0 { c = toVisit[0].C p = toVisit[0].P toVisit = toVisit[1:] for _, child := range c.Children() { cp := p.Sub(child.Offset) if child.Control.ContainsPoint(cp) { l = append(l, ControlPoint{child.Control, cp}) if cc, ok := child.Control.(Parent); ok { toVisit = append(toVisit, ParentPoint{cc, cp}) } } } } return l }
func WindowToChild(coord math.Point, to Control) math.Point { c := to for { p := c.Parent() if p == nil { panic("Control's parent was nil") } child := p.Children().Find(c) if child == nil { Dump(p) panic(fmt.Errorf("Control's parent (%p %T) did not contain control (%p %T).", &p, p, &c, c)) } coord = coord.Sub(child.Offset) if _, ok := p.(Window); ok { return coord } c = p.(Control) } }
func ParentToChild(coord math.Point, from Parent, to Control) math.Point { return coord.Sub(ChildToParent(math.ZeroPoint, to, from)) }