diff --git a/application.go b/application.go index ec7c541..fc6fefa 100644 --- a/application.go +++ b/application.go @@ -83,7 +83,7 @@ type Application struct { // An optional capture function which receives a mouse event and returns the // event to be forwarded to the default mouse handler (nil if nothing should // be forwarded). - mouseCapture func(event EventMouse) EventMouse + mouseCapture func(event *EventMouse) *EventMouse lastMouseX, lastMouseY int lastMouseBtn tcell.ButtonMask @@ -163,7 +163,7 @@ func (a *Application) SetMouseCapture(capture func(event EventMouse) EventMouse) // GetMouseCapture returns the function installed with SetMouseCapture() or nil // if no such function has been installed. -func (a *Application) GetMouseCapture() func(event EventMouse) EventMouse { +func (a *Application) GetMouseCapture() func(event *EventMouse) *EventMouse { return a.mouseCapture } @@ -401,12 +401,12 @@ EventLoop: a.lastMouseBtn = btn } - event2 := EventMouse{event, ptarget, a, act} + event2 := NewEventMouse(event, ptarget, a, act) // Intercept event. if mouseCapture != nil { event2 = mouseCapture(event2) - if event2.IsZero() { + if event2 == nil { a.draw() continue // Don't forward event. } diff --git a/box.go b/box.go index aa2102d..53c480b 100644 --- a/box.go +++ b/box.go @@ -62,7 +62,7 @@ type Box struct { // An optional capture function which receives a mouse event and returns the // event to be forwarded to the primitive's default mouse event handler (nil if // nothing should be forwarded). - mouseCapture func(event EventMouse) EventMouse + mouseCapture func(event *EventMouse) *EventMouse } // NewBox returns a Box without a border. @@ -202,19 +202,19 @@ func (b *Box) GetInputCapture() func(event *tcell.EventKey) *tcell.EventKey { // on to the provided (default) event handler. // // This is only meant to be used by subclassing primitives. -func (b *Box) WrapMouseHandler(mouseHandler func(EventMouse)) func(EventMouse) { - return func(event EventMouse) { +func (b *Box) WrapMouseHandler(mouseHandler func(*EventMouse)) func(*EventMouse) { + return func(event *EventMouse) { if b.mouseCapture != nil { event = b.mouseCapture(event) } - if !event.IsZero() && mouseHandler != nil { + if event != nil && mouseHandler != nil { mouseHandler(event) } } } // MouseHandler returns nil. -func (b *Box) MouseHandler() func(event EventMouse) { +func (b *Box) MouseHandler() func(event *EventMouse) { return b.WrapMouseHandler(nil) } @@ -225,14 +225,14 @@ func (b *Box) MouseHandler() func(event EventMouse) { // be called. // // Providing a nil handler will remove a previously existing handler. -func (b *Box) SetMouseCapture(capture func(EventMouse) EventMouse) *Box { +func (b *Box) SetMouseCapture(capture func(*EventMouse) *EventMouse) *Box { b.mouseCapture = capture return b } // GetMouseCapture returns the function installed with SetMouseCapture() or nil // if no such function has been installed. -func (b *Box) GetMouseCapture() func(EventMouse) EventMouse { +func (b *Box) GetMouseCapture() func(*EventMouse) *EventMouse { return b.mouseCapture } diff --git a/button.go b/button.go index 4639b1f..0ed28bb 100644 --- a/button.go +++ b/button.go @@ -137,10 +137,10 @@ func (b *Button) InputHandler() func(event *tcell.EventKey, setFocus func(p Prim } // MouseHandler returns the mouse handler for this primitive. -func (b *Button) MouseHandler() func(event EventMouse) { - return b.WrapMouseHandler(func(event EventMouse) { +func (b *Button) MouseHandler() func(event *EventMouse) { + return b.WrapMouseHandler(func(event *EventMouse) { // Process mouse event. - if event.Action&MouseClick != 0 { + if event.Action()&MouseClick != 0 { if b.selected != nil { b.selected() } diff --git a/checkbox.go b/checkbox.go index 88eed29..6184c3a 100644 --- a/checkbox.go +++ b/checkbox.go @@ -203,10 +203,10 @@ func (c *Checkbox) InputHandler() func(event *tcell.EventKey, setFocus func(p Pr } // MouseHandler returns the mouse handler for this primitive. -func (c *Checkbox) MouseHandler() func(event EventMouse) { - return c.WrapMouseHandler(func(event EventMouse) { +func (c *Checkbox) MouseHandler() func(event *EventMouse) { + return c.WrapMouseHandler(func(event *EventMouse) { // Process mouse event. - if event.Action&MouseClick != 0 { + if event.Action()&MouseClick != 0 { c.checked = !c.checked if c.changed != nil { c.changed(c.checked) diff --git a/dropdown.go b/dropdown.go index a502517..f842502 100644 --- a/dropdown.go +++ b/dropdown.go @@ -468,7 +468,7 @@ func (d *DropDown) openList(setFocus func(Primitive), app *Application) { return event }) if app != nil { - app.SetMouseCapture(func(event EventMouse) EventMouse { + app.SetMouseCapture(func(event *EventMouse) *EventMouse { if d.open { // Forward the mouse event to the list. atX, atY := event.Position() @@ -476,17 +476,19 @@ func (d *DropDown) openList(setFocus func(Primitive), app *Application) { if atX >= x && atY >= y && atX < x+w && atY < y+h { // Mouse is within the list. if handler := d.list.MouseHandler(); handler != nil { - if event.Action&MouseUp != 0 { + if event.Action()&MouseUp != 0 { // Treat mouse up as click here. // This allows you to expand and select in one go. - event.Action |= MouseClick + event = NewEventMouse(event.EventMouse, + event.Target(), event.Application(), + event.Action()|MouseClick) } handler(event) - return EventMouse{} // handled + return nil // handled } } else { // Mouse not within the list. - if event.Action&MouseDown != 0 { + if event.Action()&MouseDown != 0 { // If a mouse button was pressed, cancel this capture. app.SetMouseCapture(nil) d.closeList(event.SetFocus) @@ -523,16 +525,16 @@ func (d *DropDown) HasFocus() bool { } // MouseHandler returns the mouse handler for this primitive. -func (d *DropDown) MouseHandler() func(event EventMouse) { - return d.WrapMouseHandler(func(event EventMouse) { +func (d *DropDown) MouseHandler() func(event *EventMouse) { + return d.WrapMouseHandler(func(event *EventMouse) { // Process mouse event. - if event.Action&MouseDown != 0 && event.Buttons()&tcell.Button1 != 0 { + if event.Action()&MouseDown != 0 && event.Buttons()&tcell.Button1 != 0 { //d.open = !d.open //event.SetFocus(d) if d.open { d.closeList(event.SetFocus) } else { - d.openList(event.SetFocus, event.Application) + d.openList(event.SetFocus, event.Application()) } } }) diff --git a/events.go b/events.go new file mode 100644 index 0000000..78b6ead --- /dev/null +++ b/events.go @@ -0,0 +1,51 @@ +package cview + +import "github.com/gdamore/tcell" + +// EventKey is the key input event info. +// This exists for some consistency with EventMouse, +// even though it's just an alias to tcell.EventKey for backwards compatibility. +type EventKey = tcell.EventKey + +// MouseAction are bit flags indicating what the mouse is logically doing. +type MouseAction int + +const ( + MouseDown MouseAction = 1 << iota + MouseUp + MouseClick // Button1 only. + MouseMove // The mouse position changed. +) + +// EventMouse is the mouse event info. +type EventMouse struct { + *tcell.EventMouse + target Primitive + app *Application + action MouseAction +} + +// Target gets the target Primitive of the mouse event. +func (e *EventMouse) Target() Primitive { + return e.target +} + +// Application gets the event originating *Application. +func (e *EventMouse) Application() *Application { + return e.app +} + +// MouseAction gets the mouse action of this event. +func (e *EventMouse) Action() MouseAction { + return e.action +} + +// SetFocus will set focus to the primitive. +func (e *EventMouse) SetFocus(p Primitive) { + e.app.SetFocus(p) +} + +// NewEventMouse creates a new mouse event. +func NewEventMouse(base *tcell.EventMouse, target Primitive, app *Application, action MouseAction) *EventMouse { + return &EventMouse{base, target, app, action} +} diff --git a/inputfield.go b/inputfield.go index 852cf10..7f67497 100644 --- a/inputfield.go +++ b/inputfield.go @@ -593,10 +593,10 @@ func (i *InputField) InputHandler() func(event *tcell.EventKey, setFocus func(p } // MouseHandler returns the mouse handler for this primitive. -func (i *InputField) MouseHandler() func(event EventMouse) { - return i.WrapMouseHandler(func(event EventMouse) { +func (i *InputField) MouseHandler() func(event *EventMouse) { + return i.WrapMouseHandler(func(event *EventMouse) { // Process mouse event. - if event.Action&MouseDown != 0 { + if event.Action()&MouseDown != 0 { event.SetFocus(i) } }) diff --git a/list.go b/list.go index 7dcb4f6..155c951 100644 --- a/list.go +++ b/list.go @@ -569,10 +569,10 @@ func (l *List) indexAtPoint(atX, atY int) int { } // MouseHandler returns the mouse handler for this primitive. -func (l *List) MouseHandler() func(event EventMouse) { - return l.WrapMouseHandler(func(event EventMouse) { +func (l *List) MouseHandler() func(event *EventMouse) { + return l.WrapMouseHandler(func(event *EventMouse) { // Process mouse event. - if event.Action&MouseClick != 0 { + if event.Action()&MouseClick != 0 { atX, atY := event.Position() index := l.indexAtPoint(atX, atY) if index != -1 { diff --git a/primitive.go b/primitive.go index ae0c0af..60b2d7b 100644 --- a/primitive.go +++ b/primitive.go @@ -50,10 +50,10 @@ type Primitive interface { // MouseHandler returns a handler which receives mouse events. // It is called by the Application class. // - // A zero value of EventMouse{} may also be returned to stop propagation. + // A value of nil may also be returned to stop propagation. // // The Box class provides functionality to intercept mouse events. If you // subclass from Box, it is recommended that you wrap your handler using // Box.WrapMouseHandler() so you inherit that functionality. - MouseHandler() func(event EventMouse) + MouseHandler() func(event *EventMouse) }