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
This commit is contained in:
vsariola 2021-02-16 09:29:02 +02:00
parent 366a05c766
commit 803184cbe7
3 changed files with 40 additions and 2 deletions

View File

@ -211,7 +211,11 @@ func (t *Tracker) KeyEvent(w *app.Window, e key.Event) bool {
if e.Modifiers.Contain(key.ModShortcut) { if e.Modifiers.Contain(key.ModShortcut) {
t.Cursor.Row -= t.song.RowsPerPattern t.Cursor.Row -= t.song.RowsPerPattern
} else { } else {
t.Cursor.Row-- if t.Step.Value > 0 {
t.Cursor.Row -= t.Step.Value
} else {
t.Cursor.Row--
}
} }
t.NoteTracking = false t.NoteTracking = false
case EditUnits: case EditUnits:
@ -237,7 +241,11 @@ func (t *Tracker) KeyEvent(w *app.Window, e key.Event) bool {
if e.Modifiers.Contain(key.ModShortcut) { if e.Modifiers.Contain(key.ModShortcut) {
t.Cursor.Row += t.song.RowsPerPattern t.Cursor.Row += t.song.RowsPerPattern
} else { } else {
t.Cursor.Row++ if t.Step.Value > 0 {
t.Cursor.Row += t.Step.Value
} else {
t.Cursor.Row++
}
} }
t.NoteTracking = false t.NoteTracking = false
case EditUnits: case EditUnits:

View File

@ -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 { layout.Rigid(func(gtx C) D {
gtx.Constraints.Min = image.Pt(0, 0) gtx.Constraints.Min = image.Pt(0, 0)
return panicBtnStyle.Layout(gtx) return panicBtnStyle.Layout(gtx)

View File

@ -47,6 +47,7 @@ type Tracker struct {
BPM *NumberInput BPM *NumberInput
RowsPerPattern *NumberInput RowsPerPattern *NumberInput
RowsPerBeat *NumberInput RowsPerBeat *NumberInput
Step *NumberInput
InstrumentVoices *NumberInput InstrumentVoices *NumberInput
TrackVoices *NumberInput TrackVoices *NumberInput
InstrumentNameEditor *widget.Editor InstrumentNameEditor *widget.Editor
@ -325,6 +326,11 @@ func (t *Tracker) DeleteInstrument() {
func (t *Tracker) SetCurrentNote(iv byte) { func (t *Tracker) SetCurrentNote(iv byte) {
t.SaveUndo() t.SaveUndo()
t.song.Tracks[t.Cursor.Track].Patterns[t.song.Tracks[t.Cursor.Track].Sequence[t.Cursor.Pattern]][t.Cursor.Row] = iv 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) { 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].Patterns = append(t.song.Tracks[t.Cursor.Track].Patterns, tail...)
} }
t.song.Tracks[t.Cursor.Track].Sequence[t.Cursor.Pattern] = pat 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) { func (t *Tracker) SetSongLength(value int) {
@ -627,6 +638,11 @@ func (t *Tracker) DeleteSelection() {
t.song.Tracks[c].Patterns[p][s.Row] = 1 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() { func (t *Tracker) Unselect() {
@ -642,6 +658,7 @@ func New(audioContext sointu.AudioContext, synthService sointu.SynthService) *Tr
SongLength: new(NumberInput), SongLength: new(NumberInput),
RowsPerPattern: new(NumberInput), RowsPerPattern: new(NumberInput),
RowsPerBeat: new(NumberInput), RowsPerBeat: new(NumberInput),
Step: new(NumberInput),
InstrumentVoices: new(NumberInput), InstrumentVoices: new(NumberInput),
TrackVoices: new(NumberInput), TrackVoices: new(NumberInput),
InstrumentNameEditor: &widget.Editor{SingleLine: true, Submit: true, Alignment: text.Middle}, InstrumentNameEditor: &widget.Editor{SingleLine: true, Submit: true, Alignment: text.Middle},