feat(tracker): add buttons for increasing and decreasing song length

This commit is contained in:
vsariola 2021-01-11 21:19:27 +02:00
parent 8b666064b2
commit dcb0877c71
2 changed files with 55 additions and 20 deletions

View File

@ -188,6 +188,14 @@ func (t *Tracker) layoutControls(gtx layout.Context) layout.Dimensions {
t.SaveSongFile() t.SaveSongFile()
} }
for t.SongLengthUpBtn.Clicked() {
t.IncreaseSongLength()
}
for t.SongLengthDownBtn.Clicked() {
t.DecreaseSongLength()
}
return layout.Flex{Axis: layout.Horizontal}.Layout(gtx, return layout.Flex{Axis: layout.Horizontal}.Layout(gtx,
layout.Rigid(t.layoutPatterns( layout.Rigid(t.layoutPatterns(
t.song.Tracks, t.song.Tracks,
@ -196,6 +204,12 @@ func (t *Tracker) layoutControls(gtx layout.Context) layout.Dimensions {
t.CursorColumn, t.CursorColumn,
playPat, playPat,
)), )),
layout.Rigid(func(gtx layout.Context) layout.Dimensions {
return in.Layout(gtx, smallButton(material.IconButton(t.Theme, t.SongLengthUpBtn, upIcon)).Layout)
}),
layout.Rigid(func(gtx layout.Context) layout.Dimensions {
return in.Layout(gtx, enableButton(smallButton(material.IconButton(t.Theme, t.SongLengthDownBtn, downIcon)), t.song.SequenceLength() > 1).Layout)
}),
layout.Rigid(Label(fmt.Sprintf("BPM: %3v", t.song.BPM), white)), layout.Rigid(Label(fmt.Sprintf("BPM: %3v", t.song.BPM), white)),
layout.Rigid(func(gtx layout.Context) layout.Dimensions { layout.Rigid(func(gtx layout.Context) layout.Dimensions {
return in.Layout(gtx, enableButton(smallButton(material.IconButton(t.Theme, t.BPMUpBtn, upIcon)), t.song.BPM < 999).Layout) return in.Layout(gtx, enableButton(smallButton(material.IconButton(t.Theme, t.BPMUpBtn, upIcon)), t.song.BPM < 999).Layout)

View File

@ -37,6 +37,8 @@ type Tracker struct {
NewTrackBtn *widget.Clickable NewTrackBtn *widget.Clickable
NewInstrumentBtn *widget.Clickable NewInstrumentBtn *widget.Clickable
LoadSongFileBtn *widget.Clickable LoadSongFileBtn *widget.Clickable
SongLengthUpBtn *widget.Clickable
SongLengthDownBtn *widget.Clickable
SaveSongFileBtn *widget.Clickable SaveSongFileBtn *widget.Clickable
ParameterSliders []*widget.Float ParameterSliders []*widget.Float
UnitBtns []*widget.Clickable UnitBtns []*widget.Clickable
@ -253,28 +255,47 @@ func (t *Tracker) SetCurrentPattern(pat byte) {
t.song.Tracks[t.ActiveTrack].Sequence[t.DisplayPattern] = pat t.song.Tracks[t.ActiveTrack].Sequence[t.DisplayPattern] = pat
} }
func (t *Tracker) IncreaseSongLength() {
t.SaveUndo()
for i := range t.song.Tracks {
seq := t.song.Tracks[i].Sequence
t.song.Tracks[i].Sequence = append(seq, seq[len(seq)-1])
}
}
func (t *Tracker) DecreaseSongLength() {
t.SaveUndo()
for i := range t.song.Tracks {
if len(t.song.Tracks[i].Sequence) > 0 {
t.song.Tracks[i].Sequence = t.song.Tracks[i].Sequence[0 : len(t.song.Tracks[i].Sequence)-1]
}
}
}
func New(audioContext sointu.AudioContext) *Tracker { func New(audioContext sointu.AudioContext) *Tracker {
t := &Tracker{ t := &Tracker{
Theme: material.NewTheme(gofont.Collection()), Theme: material.NewTheme(gofont.Collection()),
QuitButton: new(widget.Clickable), QuitButton: new(widget.Clickable),
CurrentOctave: 4, CurrentOctave: 4,
audioContext: audioContext, audioContext: audioContext,
OctaveUpBtn: new(widget.Clickable), OctaveUpBtn: new(widget.Clickable),
OctaveDownBtn: new(widget.Clickable), OctaveDownBtn: new(widget.Clickable),
BPMUpBtn: new(widget.Clickable), BPMUpBtn: new(widget.Clickable),
BPMDownBtn: new(widget.Clickable), BPMDownBtn: new(widget.Clickable),
NewTrackBtn: new(widget.Clickable), NewTrackBtn: new(widget.Clickable),
NewInstrumentBtn: new(widget.Clickable), NewInstrumentBtn: new(widget.Clickable),
LoadSongFileBtn: new(widget.Clickable), LoadSongFileBtn: new(widget.Clickable),
SaveSongFileBtn: new(widget.Clickable), SaveSongFileBtn: new(widget.Clickable),
setPlaying: make(chan bool), SongLengthUpBtn: new(widget.Clickable),
rowJump: make(chan int), SongLengthDownBtn: new(widget.Clickable),
patternJump: make(chan int), setPlaying: make(chan bool),
ticked: make(chan struct{}), rowJump: make(chan int),
closer: make(chan struct{}), patternJump: make(chan int),
undoStack: []sointu.Song{}, ticked: make(chan struct{}),
redoStack: []sointu.Song{}, closer: make(chan struct{}),
InstrumentList: &layout.List{Axis: layout.Horizontal}, undoStack: []sointu.Song{},
redoStack: []sointu.Song{},
InstrumentList: &layout.List{Axis: layout.Horizontal},
} }
t.Theme.Color.Primary = primaryColor t.Theme.Color.Primary = primaryColor
t.Theme.Color.InvText = black t.Theme.Color.InvText = black