mirror of
https://github.com/vsariola/sointu.git
synced 2025-05-28 03:10:24 -04:00
feat(tracker): adding and deleting order rows, also backward and forward deletes
This commit is contained in:
parent
a27494e17d
commit
fd1d018e82
@ -181,7 +181,7 @@ func (t *Tracker) layoutInstrumentNames(gtx C) D {
|
||||
}
|
||||
func (t *Tracker) layoutInstrumentEditor(gtx C) D {
|
||||
for t.AddUnitBtn.Clicked() {
|
||||
t.AddUnit()
|
||||
t.AddUnit(true)
|
||||
}
|
||||
addUnitBtnStyle := material.IconButton(t.Theme, t.AddUnitBtn, widgetForIcon(icons.ContentAdd))
|
||||
addUnitBtnStyle.Color = t.Theme.ContrastFg
|
||||
|
@ -164,13 +164,28 @@ func (t *Tracker) KeyEvent(w *app.Window, e key.Event) bool {
|
||||
case "F8":
|
||||
t.SetPlaying(false)
|
||||
return true
|
||||
case key.NameDeleteBackward, key.NameDeleteForward:
|
||||
case key.NameDeleteForward:
|
||||
switch t.EditMode {
|
||||
case EditPatterns:
|
||||
t.DeleteOrderRow(true)
|
||||
return true
|
||||
case EditTracks:
|
||||
t.DeleteSelection()
|
||||
return true
|
||||
case EditUnits:
|
||||
t.DeleteUnit()
|
||||
t.DeleteUnit(true)
|
||||
return true
|
||||
}
|
||||
case key.NameDeleteBackward:
|
||||
switch t.EditMode {
|
||||
case EditPatterns:
|
||||
t.DeleteOrderRow(false)
|
||||
return true
|
||||
case EditTracks:
|
||||
t.DeleteSelection()
|
||||
return true
|
||||
case EditUnits:
|
||||
t.DeleteUnit(false)
|
||||
return true
|
||||
}
|
||||
case "Space":
|
||||
@ -200,6 +215,13 @@ func (t *Tracker) KeyEvent(w *app.Window, e key.Event) bool {
|
||||
t.EditMode = (t.EditMode + 1) % 4
|
||||
}
|
||||
return true
|
||||
case key.NameReturn:
|
||||
switch t.EditMode {
|
||||
case EditPatterns:
|
||||
t.AddOrderRow(!e.Modifiers.Contain(key.ModShortcut))
|
||||
case EditUnits:
|
||||
t.AddUnit(!e.Modifiers.Contain(key.ModShortcut))
|
||||
}
|
||||
case key.NameUpArrow:
|
||||
switch t.EditMode {
|
||||
case EditPatterns:
|
||||
|
@ -440,7 +440,7 @@ func (t *Tracker) SetUnit(typ string) {
|
||||
t.sequencer.SetPatch(t.song.Patch)
|
||||
}
|
||||
|
||||
func (t *Tracker) AddUnit() {
|
||||
func (t *Tracker) AddUnit(after bool) {
|
||||
t.SaveUndo()
|
||||
start := t.song.FirstInstrumentVoice(t.CurrentInstrument)
|
||||
end := start + t.song.Patch.Instruments[t.CurrentInstrument].NumVoices
|
||||
@ -456,15 +456,59 @@ func (t *Tracker) AddUnit() {
|
||||
}
|
||||
}
|
||||
units := make([]sointu.Unit, len(t.song.Patch.Instruments[t.CurrentInstrument].Units)+1)
|
||||
copy(units, t.song.Patch.Instruments[t.CurrentInstrument].Units[:t.CurrentUnit+1])
|
||||
copy(units[t.CurrentUnit+2:], t.song.Patch.Instruments[t.CurrentInstrument].Units[t.CurrentUnit+1:])
|
||||
newUnitIndex := t.CurrentUnit
|
||||
if after {
|
||||
newUnitIndex++
|
||||
}
|
||||
copy(units, t.song.Patch.Instruments[t.CurrentInstrument].Units[:newUnitIndex])
|
||||
copy(units[newUnitIndex+1:], t.song.Patch.Instruments[t.CurrentInstrument].Units[newUnitIndex:])
|
||||
t.song.Patch.Instruments[t.CurrentInstrument].Units = units
|
||||
t.CurrentUnit++
|
||||
t.CurrentUnit = newUnitIndex
|
||||
t.CurrentParam = 0
|
||||
t.ClampPositions()
|
||||
t.sequencer.SetPatch(t.song.Patch)
|
||||
}
|
||||
|
||||
func (t *Tracker) AddOrderRow(after bool) {
|
||||
t.SaveUndo()
|
||||
l := t.song.SequenceLength()
|
||||
newRowIndex := t.Cursor.Pattern
|
||||
if after {
|
||||
newRowIndex++
|
||||
}
|
||||
for i, trk := range t.song.Tracks {
|
||||
seq := make([]byte, l+1)
|
||||
copy(seq, trk.Sequence[:newRowIndex])
|
||||
copy(seq[newRowIndex+1:], trk.Sequence[newRowIndex:])
|
||||
t.song.Tracks[i].Sequence = seq
|
||||
}
|
||||
t.Cursor.Pattern = newRowIndex
|
||||
t.SelectionCorner = t.Cursor
|
||||
t.ClampPositions()
|
||||
}
|
||||
|
||||
func (t *Tracker) DeleteOrderRow(forward bool) {
|
||||
l := t.song.SequenceLength()
|
||||
if l <= 1 {
|
||||
return
|
||||
}
|
||||
t.SaveUndo()
|
||||
c := t.Cursor.Pattern
|
||||
for i, trk := range t.song.Tracks {
|
||||
seq := make([]byte, l-1)
|
||||
copy(seq, trk.Sequence[:c])
|
||||
copy(seq[c:], trk.Sequence[c+1:])
|
||||
t.song.Tracks[i].Sequence = seq
|
||||
}
|
||||
if !forward {
|
||||
if t.Cursor.Pattern > 0 {
|
||||
t.Cursor.Pattern--
|
||||
}
|
||||
}
|
||||
t.SelectionCorner = t.Cursor
|
||||
t.ClampPositions()
|
||||
}
|
||||
|
||||
func (t *Tracker) ClearUnit() {
|
||||
t.SaveUndo()
|
||||
t.song.Patch.Instruments[t.CurrentInstrument].Units[t.CurrentUnit].Type = ""
|
||||
@ -474,7 +518,7 @@ func (t *Tracker) ClearUnit() {
|
||||
t.sequencer.SetPatch(t.song.Patch)
|
||||
}
|
||||
|
||||
func (t *Tracker) DeleteUnit() {
|
||||
func (t *Tracker) DeleteUnit(forward bool) {
|
||||
if len(t.song.Patch.Instruments[t.CurrentInstrument].Units) <= 1 {
|
||||
return
|
||||
}
|
||||
@ -498,7 +542,7 @@ func (t *Tracker) DeleteUnit() {
|
||||
copy(units, t.song.Patch.Instruments[t.CurrentInstrument].Units[:t.CurrentUnit])
|
||||
copy(units[t.CurrentUnit:], t.song.Patch.Instruments[t.CurrentInstrument].Units[t.CurrentUnit+1:])
|
||||
t.song.Patch.Instruments[t.CurrentInstrument].Units = units
|
||||
if t.CurrentUnit > 0 {
|
||||
if !forward && t.CurrentUnit > 0 {
|
||||
t.CurrentUnit--
|
||||
}
|
||||
t.CurrentParam = 0
|
||||
|
@ -168,7 +168,7 @@ func (t *Tracker) layoutUnitFooter() layout.Widget {
|
||||
op.InvalidateOp{}.Add(gtx.Ops)
|
||||
}
|
||||
for t.DeleteUnitBtn.Clicked() {
|
||||
t.DeleteUnit()
|
||||
t.DeleteUnit(false)
|
||||
op.InvalidateOp{}.Add(gtx.Ops)
|
||||
}
|
||||
deleteUnitBtnStyle := material.IconButton(t.Theme, t.DeleteUnitBtn, widgetForIcon(icons.ActionDelete))
|
||||
|
Loading…
Reference in New Issue
Block a user