mirror of
https://github.com/vsariola/sointu.git
synced 2025-06-04 01:28:45 -04:00
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:
parent
366a05c766
commit
803184cbe7
@ -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:
|
||||||
|
@ -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)
|
||||||
|
@ -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},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user