Skip to content

Commit

Permalink
Handle right click
Browse files Browse the repository at this point in the history
  • Loading branch information
t-geindre committed Jan 11, 2024
1 parent 217ac64 commit 5ffdeb7
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 22 deletions.
4 changes: 4 additions & 0 deletions gui-lib/control/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ import "gosynth/event"

var LeftMouseDownEvent event.Id
var LeftMouseUpEvent event.Id
var RightMouseDownEvent event.Id
var RightMouseUpEvent event.Id
var MouseEnterEvent event.Id
var MouseLeaveEvent event.Id
var FocusEvent event.Id

func init() {
LeftMouseDownEvent = event.Register()
LeftMouseUpEvent = event.Register()
RightMouseDownEvent = event.Register()
RightMouseUpEvent = event.Register()
MouseEnterEvent = event.Register()
MouseLeaveEvent = event.Register()
FocusEvent = event.Register()
Expand Down
57 changes: 35 additions & 22 deletions gui-lib/control/mouse.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,44 +7,57 @@ import (
)

type Mouse struct {
target ITarget
leftDownTarget ITarget
enterTarget ITarget
rootNode ITarget
targetHandlers map[event.Id]ITarget
}

func NewMouse(target ITarget) *Mouse {
func NewMouse(rootNode ITarget) *Mouse {
return &Mouse{
target: target,
rootNode: rootNode,
targetHandlers: map[event.Id]ITarget{
RightMouseUpEvent: nil,
LeftMouseUpEvent: nil,
MouseEnterEvent: nil,
},
}
}

func (m *Mouse) Update() {
mouseTarget, _ := m.target.GetTargetAt(ebiten.CursorPosition())
currentTarget, _ := m.rootNode.GetTargetAt(ebiten.CursorPosition())
m.mouseEnterLeave(currentTarget)
m.mouseDownUp(currentTarget, ebiten.MouseButtonLeft, LeftMouseUpEvent, LeftMouseDownEvent)
m.mouseDownUp(currentTarget, ebiten.MouseButtonRight, RightMouseUpEvent, RightMouseDownEvent)
}

if mouseTarget != m.enterTarget {
if m.enterTarget != nil {
m.enterTarget.Dispatch(event.NewEvent(MouseLeaveEvent, m.enterTarget))
func (m *Mouse) mouseEnterLeave(currentTarget ITarget) {
if currentTarget != m.targetHandlers[MouseEnterEvent] {
if m.targetHandlers[MouseEnterEvent] != nil {
m.targetHandlers[MouseEnterEvent].Dispatch(event.NewEvent(MouseLeaveEvent, m.targetHandlers[MouseEnterEvent]))
}
if mouseTarget != nil {
mouseTarget.Dispatch(event.NewEvent(MouseEnterEvent, mouseTarget))
if currentTarget != nil {
currentTarget.Dispatch(event.NewEvent(MouseEnterEvent, currentTarget))
}
m.enterTarget = mouseTarget
m.targetHandlers[MouseEnterEvent] = currentTarget
}
}

if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) {
if m.leftDownTarget != nil {
m.leftDownTarget.Dispatch(event.NewEvent(LeftMouseUpEvent, m.leftDownTarget))
func (m *Mouse) mouseDownUp(currentTarget ITarget, button ebiten.MouseButton, upEvent, downEvent event.Id) {
if inpututil.IsMouseButtonJustPressed(button) {
if m.targetHandlers[upEvent] != nil {
m.targetHandlers[upEvent].Dispatch(event.NewEvent(upEvent, m.targetHandlers[upEvent]))
}

m.leftDownTarget = mouseTarget
if m.leftDownTarget != nil {
m.leftDownTarget.Dispatch(event.NewEvent(LeftMouseDownEvent, m.leftDownTarget))
m.leftDownTarget.Dispatch(event.NewEvent(FocusEvent, m.leftDownTarget))
m.targetHandlers[upEvent] = currentTarget
if m.targetHandlers[upEvent] != nil {
m.targetHandlers[upEvent].Dispatch(event.NewEvent(downEvent, m.targetHandlers[upEvent]))
if upEvent == LeftMouseUpEvent {
m.targetHandlers[upEvent].Dispatch(event.NewEvent(FocusEvent, m.targetHandlers[upEvent]))
}
}
}

if inpututil.IsMouseButtonJustReleased(ebiten.MouseButtonLeft) && m.leftDownTarget != nil {
m.leftDownTarget.Dispatch(event.NewEvent(LeftMouseUpEvent, m.leftDownTarget))
m.leftDownTarget = nil
if inpututil.IsMouseButtonJustReleased(button) && m.targetHandlers[upEvent] != nil {
m.targetHandlers[upEvent].Dispatch(event.NewEvent(upEvent, m.targetHandlers[upEvent]))
m.targetHandlers[upEvent] = nil
}
}
2 changes: 2 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ func main() {
go func() {
runtime.LockOSThread()

// Todo check if 50ms is enough (especially on Windows)
// higher value would mean more latency, might be an issue for live performance (MIDI keyboard)
err := speaker.Init(SampleRate, SampleRate.N(time.Millisecond*50))
if err != nil {
panic(err)
Expand Down

0 comments on commit 5ffdeb7

Please sign in to comment.