From 803184cbe7f3f2a9b108c3972336b709ea43f15b Mon Sep 17 00:00:00 2001 From: vsariola <5684185+vsariola@users.noreply.github.com> Date: Tue, 16 Feb 2021 09:29:02 +0200 Subject: [PATCH] feat(tracker): add step parameter to advance cursor after edit The step is currently in the song panel; might consider putting it somewhere else. Closes #6 --- tracker/keyevent.go | 12 ++++++++++-- tracker/songpanel.go | 13 +++++++++++++ tracker/tracker.go | 17 +++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/tracker/keyevent.go b/tracker/keyevent.go index 05712d5..b058f5b 100644 --- a/tracker/keyevent.go +++ b/tracker/keyevent.go @@ -211,7 +211,11 @@ func (t *Tracker) KeyEvent(w *app.Window, e key.Event) bool { if e.Modifiers.Contain(key.ModShortcut) { t.Cursor.Row -= t.song.RowsPerPattern } else { - t.Cursor.Row-- + if t.Step.Value > 0 { + t.Cursor.Row -= t.Step.Value + } else { + t.Cursor.Row-- + } } t.NoteTracking = false case EditUnits: @@ -237,7 +241,11 @@ func (t *Tracker) KeyEvent(w *app.Window, e key.Event) bool { if e.Modifiers.Contain(key.ModShortcut) { t.Cursor.Row += t.song.RowsPerPattern } else { - t.Cursor.Row++ + if t.Step.Value > 0 { + t.Cursor.Row += t.Step.Value + } else { + t.Cursor.Row++ + } } t.NoteTracking = false case EditUnits: diff --git a/tracker/songpanel.go b/tracker/songpanel.go index 42533b2..70afcb2 100644 --- a/tracker/songpanel.go +++ b/tracker/songpanel.go @@ -175,6 +175,19 @@ func (t *Tracker) layoutSongOptions(gtx C) D { }), ) }), + layout.Rigid(func(gtx C) D { + return layout.Flex{Axis: layout.Horizontal}.Layout(gtx, + layout.Rigid(Label("STP:", white)), + layout.Rigid(func(gtx layout.Context) layout.Dimensions { + numStyle := NumericUpDown(t.Theme, t.Step, 0, 8) + numStyle.UnitsPerStep = unit.Dp(20) + gtx.Constraints.Min.Y = gtx.Px(unit.Dp(20)) + gtx.Constraints.Min.X = gtx.Px(unit.Dp(70)) + dims := in.Layout(gtx, numStyle.Layout) + return dims + }), + ) + }), layout.Rigid(func(gtx C) D { gtx.Constraints.Min = image.Pt(0, 0) return panicBtnStyle.Layout(gtx) diff --git a/tracker/tracker.go b/tracker/tracker.go index 203a8f5..685780c 100644 --- a/tracker/tracker.go +++ b/tracker/tracker.go @@ -47,6 +47,7 @@ type Tracker struct { BPM *NumberInput RowsPerPattern *NumberInput RowsPerBeat *NumberInput + Step *NumberInput InstrumentVoices *NumberInput TrackVoices *NumberInput InstrumentNameEditor *widget.Editor @@ -325,6 +326,11 @@ func (t *Tracker) DeleteInstrument() { func (t *Tracker) SetCurrentNote(iv byte) { t.SaveUndo() t.song.Tracks[t.Cursor.Track].Patterns[t.song.Tracks[t.Cursor.Track].Sequence[t.Cursor.Pattern]][t.Cursor.Row] = iv + if !t.Playing || !t.NoteTracking { + t.Cursor.Row += t.Step.Value + t.ClampPositions() + t.Unselect() + } } func (t *Tracker) SetCurrentPattern(pat byte) { @@ -338,6 +344,11 @@ func (t *Tracker) SetCurrentPattern(pat byte) { t.song.Tracks[t.Cursor.Track].Patterns = append(t.song.Tracks[t.Cursor.Track].Patterns, tail...) } t.song.Tracks[t.Cursor.Track].Sequence[t.Cursor.Pattern] = pat + if t.Step.Value > 0 && (!t.Playing || !t.NoteTracking) { + t.Cursor.Pattern++ + t.ClampPositions() + t.Unselect() + } } func (t *Tracker) SetSongLength(value int) { @@ -627,6 +638,11 @@ func (t *Tracker) DeleteSelection() { t.song.Tracks[c].Patterns[p][s.Row] = 1 } } + if (!t.Playing || !t.NoteTracking) && t.Step.Value > 0 && r1 == r2 { + t.Cursor.Row += t.Step.Value + t.ClampPositions() + t.Unselect() + } } func (t *Tracker) Unselect() { @@ -642,6 +658,7 @@ func New(audioContext sointu.AudioContext, synthService sointu.SynthService) *Tr SongLength: new(NumberInput), RowsPerPattern: new(NumberInput), RowsPerBeat: new(NumberInput), + Step: new(NumberInput), InstrumentVoices: new(NumberInput), TrackVoices: new(NumberInput), InstrumentNameEditor: &widget.Editor{SingleLine: true, Submit: true, Alignment: text.Middle},