From 92ab03510189875505ba97f1010ea85e8eebea31 Mon Sep 17 00:00:00 2001 From: vsariola Date: Fri, 8 Jan 2021 15:36:11 +0200 Subject: [PATCH] feat(tracker): add row number markers to the left --- tracker/layout.go | 13 +++++++++-- tracker/rowmarkers.go | 53 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 tracker/rowmarkers.go diff --git a/tracker/layout.go b/tracker/layout.go index ae05126..0952f71 100644 --- a/tracker/layout.go +++ b/tracker/layout.go @@ -42,7 +42,7 @@ func (t *Tracker) Layout(gtx layout.Context) { } func (t *Tracker) layoutTracker(gtx layout.Context) layout.Dimensions { - flexTracks := make([]layout.FlexChild, len(t.song.Tracks)) + flexTracks := make([]layout.FlexChild, len(t.song.Tracks)+1) t.playRowPatMutex.RLock() defer t.playRowPatMutex.RUnlock() @@ -51,8 +51,17 @@ func (t *Tracker) layoutTracker(gtx layout.Context) layout.Dimensions { playPat = -1 } + flexTracks[0] = layout.Rigid(Lowered(t.layoutRowMarkers( + len(t.song.Tracks[0].Patterns[0]), + len(t.song.Tracks[0].Sequence), + t.CursorRow, + t.DisplayPattern, + t.CursorColumn, + t.PlayRow, + playPat, + ))) for i, trk := range t.song.Tracks { - flexTracks[i] = layout.Rigid(Lowered(t.layoutTrack( + flexTracks[i+1] = layout.Rigid(Lowered(t.layoutTrack( trk.Patterns, trk.Sequence, t.ActiveTrack == i, diff --git a/tracker/rowmarkers.go b/tracker/rowmarkers.go new file mode 100644 index 0000000..71e8e45 --- /dev/null +++ b/tracker/rowmarkers.go @@ -0,0 +1,53 @@ +package tracker + +import ( + "fmt" + "image" + "strings" + + "gioui.org/f32" + "gioui.org/layout" + "gioui.org/op" + "gioui.org/op/clip" + "gioui.org/op/paint" + "gioui.org/widget" +) + +const rowMarkerWidth = 50 + +func (t *Tracker) layoutRowMarkers(patternRows, sequenceLength, cursorRow, cursorPattern, cursorCol, playRow, playPattern int) layout.Widget { + return func(gtx layout.Context) layout.Dimensions { + gtx.Constraints.Min.X = rowMarkerWidth + gtx.Constraints.Max.X = rowMarkerWidth + paint.FillShape(gtx.Ops, inactiveTrackColor, clip.Rect{ + Max: gtx.Constraints.Max, + }.Op()) + defer op.Push(gtx.Ops).Pop() + clip.Rect{Max: gtx.Constraints.Max}.Add(gtx.Ops) + op.Offset(f32.Pt(0, float32(gtx.Constraints.Max.Y/2)-trackRowHeight)).Add(gtx.Ops) + cursorSongRow := cursorPattern*patternRows + cursorRow + playSongRow := playPattern*patternRows + playRow + op.Offset(f32.Pt(0, (-1*trackRowHeight)*float32(cursorSongRow))).Add(gtx.Ops) + for i := 0; i < sequenceLength; i++ { + for j := 0; j < patternRows; j++ { + songRow := i*patternRows + j + if songRow == playSongRow { + paint.FillShape(gtx.Ops, trackerPlayColor, clip.Rect{Max: image.Pt(trackWidth, trackRowHeight)}.Op()) + } + if j == 0 { + paint.ColorOp{Color: trackerPatMarker}.Add(gtx.Ops) + widget.Label{}.Layout(gtx, textShaper, trackerFont, trackerFontSize, strings.ToUpper(fmt.Sprintf("%02x", i))) + } + if songRow == cursorSongRow { + paint.ColorOp{Color: trackerActiveTextColor}.Add(gtx.Ops) + } else { + paint.ColorOp{Color: trackerInactiveTextColor}.Add(gtx.Ops) + } + op.Offset(f32.Pt(rowMarkerWidth/2, 0)).Add(gtx.Ops) + widget.Label{}.Layout(gtx, textShaper, trackerFont, trackerFontSize, strings.ToUpper(fmt.Sprintf("%02x", j))) + op.Offset(f32.Pt(-rowMarkerWidth/2, trackRowHeight)).Add(gtx.Ops) + } + } + return layout.Dimensions{Size: gtx.Constraints.Max} + } +}