github.com/jmigpin/editor@v1.6.0/util/uiutil/mousefilter/dragfilter.go (about) 1 package mousefilter 2 3 import ( 4 "image" 5 6 "github.com/jmigpin/editor/util/uiutil/event" 7 ) 8 9 // Produce mousedrag* events. Keeps track of the first mouse button used. 10 type DragFilter struct { 11 pressEv *event.MouseDown 12 dragging bool 13 emitEvFn func(interface{}, image.Point) 14 } 15 16 func NewDragFilter(emitEvFn func(interface{}, image.Point)) *DragFilter { 17 return &DragFilter{emitEvFn: emitEvFn} 18 } 19 20 func (dragf *DragFilter) Filter(ev interface{}) { 21 switch t := ev.(type) { 22 case *event.MouseDown: 23 dragf.keepStartingPoint(t) 24 case *event.MouseMove: 25 dragf.startOrMove(t) 26 case *event.MouseUp: 27 dragf.end(t) 28 } 29 } 30 31 func (dragf *DragFilter) keepStartingPoint(ev *event.MouseDown) { 32 if dragf.pressEv == nil { 33 dragf.pressEv = ev 34 return 35 } 36 } 37 38 func (dragf *DragFilter) startOrMove(ev *event.MouseMove) { 39 if dragf.pressEv == nil { 40 return 41 } 42 if !dragf.dragging { 43 if DetectMove(dragf.pressEv.Point, ev.Point) { 44 dragf.dragging = true 45 b := dragf.pressEv.Button 46 start := dragf.pressEv.Point 47 ev2 := &event.MouseDragStart{start, ev.Point, b, ev.Buttons, ev.Mods} 48 dragf.emitEv(ev2, start) 49 } 50 } else { 51 ev2 := &event.MouseDragMove{ev.Point, ev.Buttons, ev.Mods} 52 dragf.emitEv(ev2, ev.Point) 53 } 54 } 55 56 func (dragf *DragFilter) end(ev *event.MouseUp) { 57 if dragf.pressEv != nil && ev.Button == dragf.pressEv.Button { 58 if dragf.dragging { 59 ev2 := &event.MouseDragEnd{ev.Point, ev.Button, ev.Buttons, ev.Mods} 60 dragf.emitEv(ev2, ev.Point) 61 } 62 // reset 63 dragf.pressEv = nil 64 dragf.dragging = false 65 } 66 } 67 68 //---------- 69 70 func (dragf *DragFilter) emitEv(ev interface{}, p image.Point) { 71 dragf.emitEvFn(ev, p) 72 }