From c60f6e0f0e10100ed2ba50d118aa29f8f17e1edf Mon Sep 17 00:00:00 2001 From: vsariola <5684185+vsariola@users.noreply.github.com> Date: Sun, 14 Feb 2021 21:32:27 +0200 Subject: [PATCH] feat(tracker): make clicks change the focused panel --- tracker/instruments.go | 16 ++++++++++++++++ tracker/patterns.go | 17 +++++++++++++++++ tracker/track.go | 41 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/tracker/instruments.go b/tracker/instruments.go index 2c3b6ed..aa58d2b 100644 --- a/tracker/instruments.go +++ b/tracker/instruments.go @@ -14,7 +14,23 @@ import ( "golang.org/x/exp/shiny/materialdesign/icons" ) +var instrumentPointerTag = false + func (t *Tracker) layoutInstruments(gtx C) D { + for _, ev := range gtx.Events(&instrumentPointerTag) { + e, ok := ev.(pointer.Event) + if !ok { + continue + } + if e.Type == pointer.Press { + t.EditMode = EditUnits + } + } + rect := image.Rect(0, 0, gtx.Constraints.Max.X, gtx.Constraints.Max.Y) + pointer.Rect(rect).Add(gtx.Ops) + pointer.InputOp{Tag: &instrumentPointerTag, + Types: pointer.Press, + }.Add(gtx.Ops) if t.CurrentInstrument > 7 { t.InstrumentDragList.List.Position.First = t.CurrentInstrument - 7 } else { diff --git a/tracker/patterns.go b/tracker/patterns.go index dde8f26..c0f9eb5 100644 --- a/tracker/patterns.go +++ b/tracker/patterns.go @@ -6,6 +6,7 @@ import ( "strings" "gioui.org/f32" + "gioui.org/io/pointer" "gioui.org/layout" "gioui.org/op" "gioui.org/op/clip" @@ -17,9 +18,25 @@ const patternCellHeight = 16 const patternCellWidth = 16 const patternRowMarkerWidth = 30 +var patternPointerTag = false + func (t *Tracker) layoutPatterns(gtx C) D { defer op.Save(gtx.Ops).Load() clip.Rect{Max: gtx.Constraints.Max}.Add(gtx.Ops) + for _, ev := range gtx.Events(&patternPointerTag) { + e, ok := ev.(pointer.Event) + if !ok { + continue + } + if e.Type == pointer.Press { + t.EditMode = EditPatterns + } + } + rect := image.Rect(0, 0, gtx.Constraints.Max.X, gtx.Constraints.Max.Y) + pointer.Rect(rect).Add(gtx.Ops) + pointer.InputOp{Tag: &patternPointerTag, + Types: pointer.Press, + }.Add(gtx.Ops) patternRect := SongRect{ Corner1: SongPoint{SongRow: SongRow{Pattern: t.Cursor.Pattern}, Track: t.Cursor.Track}, Corner2: SongPoint{SongRow: SongRow{Pattern: t.SelectionCorner.Pattern}, Track: t.SelectionCorner.Track}, diff --git a/tracker/track.go b/tracker/track.go index f004301..f312b9e 100644 --- a/tracker/track.go +++ b/tracker/track.go @@ -6,6 +6,7 @@ import ( "strings" "gioui.org/f32" + "gioui.org/io/pointer" "gioui.org/layout" "gioui.org/op" "gioui.org/op/clip" @@ -20,6 +21,9 @@ const trackRowHeight = 16 const trackColWidth = 54 const patmarkWidth = 16 +var trackPointerTag bool +var trackJumpPointerTag bool + func (t *Tracker) layoutTracker(gtx layout.Context) layout.Dimensions { t.playRowPatMutex.RLock() defer t.playRowPatMutex.RUnlock() @@ -132,6 +136,21 @@ func (t *Tracker) layoutTracker(gtx layout.Context) layout.Dimensions { return dims } + for _, ev := range gtx.Events(&trackPointerTag) { + e, ok := ev.(pointer.Event) + if !ok { + continue + } + if e.Type == pointer.Press { + t.EditMode = EditTracks + } + } + rect := image.Rect(0, 0, gtx.Constraints.Max.X, gtx.Constraints.Max.Y) + pointer.Rect(rect).Add(gtx.Ops) + pointer.InputOp{Tag: &trackPointerTag, + Types: pointer.Press, + }.Add(gtx.Ops) + return layout.Flex{Axis: layout.Vertical}.Layout(gtx, layout.Rigid(func(gtx C) D { return Surface{Gray: 37, Focus: t.EditMode == 1, FitSize: true}.Layout(gtx, menu) @@ -169,9 +188,29 @@ func (t *Tracker) layoutTrackTitles(gtx C) D { func (t *Tracker) layoutTracks(gtx C) D { defer op.Save(gtx.Ops).Load() clip.Rect{Max: gtx.Constraints.Max}.Add(gtx.Ops) - op.Offset(f32.Pt(0, float32(gtx.Constraints.Max.Y-trackRowHeight)/2)).Add(gtx.Ops) cursorSongRow := t.Cursor.Pattern*t.song.RowsPerPattern + t.Cursor.Row + for _, ev := range gtx.Events(&trackJumpPointerTag) { + e, ok := ev.(pointer.Event) + if !ok { + continue + } + if e.Type == pointer.Press { + t.EditMode = EditTracks + t.Cursor.Track = int(e.Position.X) / trackColWidth + t.Cursor.Pattern = 0 + t.Cursor.Row = int(e.Position.Y) / trackRowHeight + t.Cursor.Clamp(t.song) + t.SelectionCorner = t.Cursor + cursorSongRow = t.Cursor.Pattern*t.song.RowsPerPattern + t.Cursor.Row + } + } + op.Offset(f32.Pt(0, float32(gtx.Constraints.Max.Y-trackRowHeight)/2)).Add(gtx.Ops) op.Offset(f32.Pt(0, (-1*trackRowHeight)*float32(cursorSongRow))).Add(gtx.Ops) + rect := image.Rect(0, 0, trackColWidth*len(t.song.Tracks), trackRowHeight*t.song.TotalRows()) + pointer.Rect(rect).Add(gtx.Ops) + pointer.InputOp{Tag: &trackJumpPointerTag, + Types: pointer.Press, + }.Add(gtx.Ops) if t.EditMode == EditPatterns || t.EditMode == EditTracks { x1, y1 := t.Cursor.Track, t.Cursor.Pattern x2, y2 := t.SelectionCorner.Track, t.SelectionCorner.Pattern