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  }