40091c5918910a4d0493a610fc71acc605d5ed3e — Elias Naur 14 days ago 5d28f9e
ui/gesture: add Scroll.State method

And move Click.State to a method.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
3 files changed, 57 insertions(+), 21 deletions(-)

M ui/gesture/gesture.go
M ui/layout/list.go
M ui/text/editor.go
M ui/gesture/gesture.go => ui/gesture/gesture.go +55 -19
@@ 23,8 23,8 @@ // Click detects click gestures in the form
  // of ClickEvents.
  type Click struct {
- 	// State tracks the current state
- 	State ClickState
+ 	// state tracks the gesture state.
+ 	state ClickState
  }
  
  type ClickState uint8


@@ 55,6 55,8 @@ scroll float32
  }
  
+ type ScrollState uint8
+ 
  type flinger struct {
  	// Current offset in pixels.
  	x float32


@@ 72,8 74,12 @@ )
  
  const (
+ 	// StateNormal is the default click state.
  	StateNormal ClickState = iota
+ 	// StateFocused is reported when a pointer
+ 	// is hovering over the handler.
  	StateFocused
+ 	// StatePressed is then a pointer is pressed.
  	StatePressed
  )
  


@@ 86,6 92,16 @@ TypeClick
  )
  
+ const (
+ 	// StateIdle is the default scroll state.
+ 	StateIdle ScrollState = iota
+ 	// StateDrag is reported during drag gestures.
+ 	StateDragging
+ 	// StateFlinging is reported when a fling is
+ 	// in progress.
+ 	StateFlinging
+ )
+ 
  var (
  	touchSlop = ui.Dp(3)
  	// Pixels/second.


@@ 103,6 119,11 @@ op.Add(ops)
  }
  
+ // State reports the click state.
+ func (c *Click) State() ClickState {
+ 	return c.state
+ }
+ 
  // Events reports all click events for the available events.
  func (c *Click) Events(q input.Queue) []ClickEvent {
  	var events []ClickEvent


@@ 113,24 134,24 @@ }
  		switch e.Type {
  		case pointer.Release:
- 			wasPressed := c.State == StatePressed
- 			c.State = StateNormal
+ 			wasPressed := c.state == StatePressed
+ 			c.state = StateNormal
  			if wasPressed {
  				events = append(events, ClickEvent{Type: TypeClick, Position: e.Position, Source: e.Source})
  			}
  		case pointer.Cancel:
- 			c.State = StateNormal
+ 			c.state = StateNormal
  		case pointer.Press:
- 			if c.State == StatePressed || !e.Hit {
+ 			if c.state == StatePressed || !e.Hit {
  				break
  			}
- 			c.State = StatePressed
+ 			c.state = StatePressed
  			events = append(events, ClickEvent{Type: TypePress, Position: e.Position, Source: e.Source})
  		case pointer.Move:
- 			if c.State == StatePressed && !e.Hit {
- 				c.State = StateNormal
- 			} else if c.State < StateFocused {
- 				c.State = StateFocused
+ 			if c.state == StatePressed && !e.Hit {
+ 				c.state = StateNormal
+ 			} else if c.state < StateFocused {
+ 				c.state = StateFocused
  			}
  		}
  	}


@@ 151,11 172,6 @@ s.flinger = flinger{}
  }
  
- // Dragging reports whether the user is dragging the Scroll.
- func (s *Scroll) Dragging() bool {
- 	return s.dragging
- }
- 
  // Scroll detects the scrolling distance from the available events and
  // ongoing fling gestures.
  func (s *Scroll) Scroll(cfg ui.Config, q input.Queue, axis Axis) int {


@@ 243,9 259,16 @@ }
  }
  
- // Active reports whether a fling gesture is in progress.
- func (s *Scroll) Active() bool {
- 	return s.flinger.Active()
+ // State reports the scroll state.
+ func (s *Scroll) State() ScrollState {
+ 	switch {
+ 	case s.flinger.Active():
+ 		return StateFlinging
+ 	case s.dragging:
+ 		return StateDragging
+ 	default:
+ 		return StateIdle
+ 	}
  }
  
  func (f *flinger) Init(now time.Time, v0 float32) {


@@ 332,3 355,16 @@ panic("invalid ClickState")
  	}
  }
+ 
+ func (s ScrollState) String() string {
+ 	switch s {
+ 	case StateIdle:
+ 		return "StateIdle"
+ 	case StateDragging:
+ 		return "StateDragging"
+ 	case StateFlinging:
+ 		return "StateFlinging"
+ 	default:
+ 		panic("unreachable")
+ 	}
+ }

M ui/layout/list.go => ui/layout/list.go +1 -1
@@ 87,7 87,7 @@   // Dragging reports whether the List is being dragged.
  func (l *List) Dragging() bool {
- 	return l.scroll.Dragging()
+ 	return l.scroll.State() == gesture.StateDragging
  }
  
  func (l *List) update() {

M ui/text/editor.go => ui/text/editor.go +1 -1
@@ 105,7 105,7 @@ Y: int(math.Round(float64(evt.Position.Y))),
  			})
  			e.requestFocus = true
- 			if !e.scroller.Active() {
+ 			if e.scroller.State() != gesture.StateFlinging {
  				e.scrollToCaret(cfg)
  			}
  		}