From dcb0877c7134a8eded348ad049090816df327961 Mon Sep 17 00:00:00 2001 From: vsariola Date: Mon, 11 Jan 2021 21:19:27 +0200 Subject: [PATCH] feat(tracker): add buttons for increasing and decreasing song length --- tracker/layout.go | 14 +++++++++++ tracker/tracker.go | 61 +++++++++++++++++++++++++++++++--------------- 2 files changed, 55 insertions(+), 20 deletions(-) diff --git a/tracker/layout.go b/tracker/layout.go index c685be1..b8a4f34 100644 --- a/tracker/layout.go +++ b/tracker/layout.go @@ -188,6 +188,14 @@ func (t *Tracker) layoutControls(gtx layout.Context) layout.Dimensions { t.SaveSongFile() } + for t.SongLengthUpBtn.Clicked() { + t.IncreaseSongLength() + } + + for t.SongLengthDownBtn.Clicked() { + t.DecreaseSongLength() + } + return layout.Flex{Axis: layout.Horizontal}.Layout(gtx, layout.Rigid(t.layoutPatterns( t.song.Tracks, @@ -196,6 +204,12 @@ func (t *Tracker) layoutControls(gtx layout.Context) layout.Dimensions { t.CursorColumn, 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(func(gtx layout.Context) layout.Dimensions { return in.Layout(gtx, enableButton(smallButton(material.IconButton(t.Theme, t.BPMUpBtn, upIcon)), t.song.BPM < 999).Layout) diff --git a/tracker/tracker.go b/tracker/tracker.go index 66400f6..fce5006 100644 --- a/tracker/tracker.go +++ b/tracker/tracker.go @@ -37,6 +37,8 @@ type Tracker struct { NewTrackBtn *widget.Clickable NewInstrumentBtn *widget.Clickable LoadSongFileBtn *widget.Clickable + SongLengthUpBtn *widget.Clickable + SongLengthDownBtn *widget.Clickable SaveSongFileBtn *widget.Clickable ParameterSliders []*widget.Float UnitBtns []*widget.Clickable @@ -253,28 +255,47 @@ func (t *Tracker) SetCurrentPattern(pat byte) { 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 { t := &Tracker{ - Theme: material.NewTheme(gofont.Collection()), - QuitButton: new(widget.Clickable), - CurrentOctave: 4, - audioContext: audioContext, - OctaveUpBtn: new(widget.Clickable), - OctaveDownBtn: new(widget.Clickable), - BPMUpBtn: new(widget.Clickable), - BPMDownBtn: new(widget.Clickable), - NewTrackBtn: new(widget.Clickable), - NewInstrumentBtn: new(widget.Clickable), - LoadSongFileBtn: new(widget.Clickable), - SaveSongFileBtn: new(widget.Clickable), - setPlaying: make(chan bool), - rowJump: make(chan int), - patternJump: make(chan int), - ticked: make(chan struct{}), - closer: make(chan struct{}), - undoStack: []sointu.Song{}, - redoStack: []sointu.Song{}, - InstrumentList: &layout.List{Axis: layout.Horizontal}, + Theme: material.NewTheme(gofont.Collection()), + QuitButton: new(widget.Clickable), + CurrentOctave: 4, + audioContext: audioContext, + OctaveUpBtn: new(widget.Clickable), + OctaveDownBtn: new(widget.Clickable), + BPMUpBtn: new(widget.Clickable), + BPMDownBtn: new(widget.Clickable), + NewTrackBtn: new(widget.Clickable), + NewInstrumentBtn: new(widget.Clickable), + LoadSongFileBtn: new(widget.Clickable), + SaveSongFileBtn: new(widget.Clickable), + SongLengthUpBtn: new(widget.Clickable), + SongLengthDownBtn: new(widget.Clickable), + setPlaying: make(chan bool), + rowJump: make(chan int), + patternJump: make(chan int), + ticked: make(chan struct{}), + closer: make(chan struct{}), + undoStack: []sointu.Song{}, + redoStack: []sointu.Song{}, + InstrumentList: &layout.List{Axis: layout.Horizontal}, } t.Theme.Color.Primary = primaryColor t.Theme.Color.InvText = black