From a8bb3c2f14ae130148e4b39d167858a4d21bc3fe Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 24 Apr 2019 15:39:53 +0200 Subject: [PATCH] all: make pointer.Area an interface With an interface instead of anonymous functions, amending an area's parameters can be done even after adding it to an OpHandler. This will be useful when we switch to serialized op lists. Signed-off-by: Elias Naur --- apps/gophers/main.go | 4 ++-- ui/gesture/gestures.go | 46 +++++++++++++++++++++++------------------- ui/layout/list.go | 2 +- ui/pointer/pointer.go | 4 +++- ui/pointer/queue.go | 4 ++-- ui/text/editor.go | 2 +- 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/apps/gophers/main.go b/apps/gophers/main.go index c3eb9a26..b13ade4e 100644 --- a/apps/gophers/main.go +++ b/apps/gophers/main.go @@ -498,7 +498,7 @@ func (a *ActionButton) Layout(cs layout.Constraints) (ui.Op, layout.Dimens) { layout.Margins{Top: ui.Dp(4)}, layout.F(func(cs layout.Constraints) (ui.Op, layout.Dimens) { op, dims := fab(c, a.sendIco.image(c), fabCol, ui.Dp(56)).Layout(cs) - ops := ui.Ops{op, a.btnClicker.Op(gesture.Ellipse(dims.Size))} + ops := ui.Ops{op, a.btnClicker.Op(&gesture.Ellipse{dims.Size})} return ops, dims }), )) @@ -556,7 +556,7 @@ func (a *App) user(c *ui.Config, index int) layout.Widget { Layout() }), ).Layout(cs) - ops := ui.Ops{op, click.Op(gesture.Rect(dims.Size))} + ops := ui.Ops{op, click.Op(&gesture.Rect{dims.Size})} return ops, dims })) return elem.Layout() diff --git a/ui/gesture/gestures.go b/ui/gesture/gestures.go index c3c598d9..83f04764 100644 --- a/ui/gesture/gestures.go +++ b/ui/gesture/gestures.go @@ -37,6 +37,14 @@ type Scroll struct { scroll float32 } +type Rect struct { + Size image.Point +} + +type Ellipse struct { + Size image.Point +} + type flinger struct { // Current offset in pixels. x float32 @@ -254,30 +262,26 @@ func (f *flinger) Tick(now time.Time) int { return idist } -func Rect(sz image.Point) pointer.Area { - return func(pos f32.Point) pointer.HitResult { - if 0 <= pos.X && pos.X < float32(sz.X) && - 0 <= pos.Y && pos.Y < float32(sz.Y) { - return pointer.HitOpaque - } else { - return pointer.HitNone - } +func (r *Rect) Hit(pos f32.Point) pointer.HitResult { + if 0 <= pos.X && pos.X < float32(r.Size.X) && + 0 <= pos.Y && pos.Y < float32(r.Size.Y) { + return pointer.HitOpaque + } else { + return pointer.HitNone } } -func Ellipse(sz image.Point) pointer.Area { - return func(pos f32.Point) pointer.HitResult { - rx := float32(sz.X) / 2 - ry := float32(sz.Y) / 2 - rx2 := rx * rx - ry2 := ry * ry - xh := pos.X - rx - yk := pos.Y - ry - if xh*xh*ry2+yk*yk*rx2 <= rx2*ry2 { - return pointer.HitOpaque - } else { - return pointer.HitNone - } +func (e *Ellipse) Hit(pos f32.Point) pointer.HitResult { + rx := float32(e.Size.X) / 2 + ry := float32(e.Size.Y) / 2 + rx2 := rx * rx + ry2 := ry * ry + xh := pos.X - rx + yk := pos.Y - ry + if xh*xh*ry2+yk*yk*rx2 <= rx2*ry2 { + return pointer.HitOpaque + } else { + return pointer.HitNone } } diff --git a/ui/layout/list.go b/ui/layout/list.go index 84b4d917..81e03b03 100644 --- a/ui/layout/list.go +++ b/ui/layout/list.go @@ -83,7 +83,7 @@ func (l *List) Index() (int, bool) { } func (l *List) Layout() (ui.Op, Dimens) { - ops := append(ui.Ops{l.scroll.Op(gesture.Rect(l.size))}, l.ops...) + ops := append(ui.Ops{l.scroll.Op(&gesture.Rect{l.size})}, l.ops...) return ops, Dimens{Size: l.size} } diff --git a/ui/pointer/pointer.go b/ui/pointer/pointer.go index dcc27423..061debe3 100644 --- a/ui/pointer/pointer.go +++ b/ui/pointer/pointer.go @@ -25,7 +25,9 @@ type OpHandler struct { Grab bool } -type Area func(pos f32.Point) HitResult +type Area interface { + Hit(pos f32.Point) HitResult +} type Key interface{} diff --git a/ui/pointer/queue.go b/ui/pointer/queue.go index 86bd31c3..d2d44071 100644 --- a/ui/pointer/queue.go +++ b/ui/pointer/queue.go @@ -101,7 +101,7 @@ func (q *Queue) opHit(handlers *[]Key, op ui.Op, pos f32.Point) (HitResult, bool return HitNone, false } tpos := h.transform.InvTransform(pos) - res := h.area(tpos) + res := h.area.Hit(tpos) if res != HitNone { *handlers = append(*handlers, op.Key) } @@ -229,7 +229,7 @@ func (q *Queue) Push(e Event) { e.Priority = Foremost } e.Position = h.transform.InvTransform(e.Position) - e.Hit = h.area(e.Position) != HitNone + e.Hit = h.area.Hit(e.Position) != HitNone h.events = append(h.events, e) if e.Type == Release { // Release grab when the number of grabs reaches zero. diff --git a/ui/text/editor.go b/ui/text/editor.go index 610cb07d..f32820c7 100644 --- a/ui/text/editor.go +++ b/ui/text/editor.go @@ -206,7 +206,7 @@ func (e *Editor) Layout(cs layout.Constraints) (ui.Op, layout.Dimens) { } baseline := e.padTop + e.dims.Baseline - area := gesture.Rect(e.viewSize) + area := &gesture.Rect{e.viewSize} e.ops = append(e.ops, e.scroller.Op(area), e.clicker.Op(area)) return e.ops, layout.Dimens{Size: e.viewSize, Baseline: baseline} }