From 01226a291028cf715c1a7c009bcc32c660626c61 Mon Sep 17 00:00:00 2001 From: vsariola <5684185+vsariola@users.noreply.github.com> Date: Thu, 11 Mar 2021 22:26:42 +0200 Subject: [PATCH] feat(tracker, gioui): add ability & button to delete tracks. Refer #46. --- tracker/gioui/track.go | 13 +++++++++++++ tracker/gioui/tracker.go | 2 ++ tracker/model.go | 21 +++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/tracker/gioui/track.go b/tracker/gioui/track.go index 6cb207e..6a901a3 100644 --- a/tracker/gioui/track.go +++ b/tracker/gioui/track.go @@ -32,6 +32,10 @@ func (t *Tracker) layoutTracker(gtx layout.Context) layout.Dimensions { t.AddTrack(true) } + for t.DeleteTrackBtn.Clicked() { + t.DeleteTrack(false) + } + //t.TrackHexCheckBoxes[i2].Value = t.TrackShowHex[i2] //cbStyle := material.CheckBox(t.Theme, t.TrackHexCheckBoxes[i2], "hex") //cbStyle.Color = white @@ -70,6 +74,14 @@ func (t *Tracker) layoutTracker(gtx layout.Context) layout.Dimensions { subtractOctaveBtnStyle.Color = primaryColor subtractOctaveBtnStyle.Background = transparent subtractOctaveBtnStyle.Inset = layout.UniformInset(unit.Dp(6)) + deleteTrackBtnStyle := material.IconButton(t.Theme, t.DeleteTrackBtn, widgetForIcon(icons.ActionDelete)) + deleteTrackBtnStyle.Background = transparent + deleteTrackBtnStyle.Inset = layout.UniformInset(unit.Dp(6)) + if t.CanDeleteTrack() { + deleteTrackBtnStyle.Color = primaryColor + } else { + deleteTrackBtnStyle.Color = disabledTextColor + } newTrackBtnStyle := material.IconButton(t.Theme, t.NewTrackBtn, widgetForIcon(icons.ContentAdd)) newTrackBtnStyle.Background = transparent newTrackBtnStyle.Inset = layout.UniformInset(unit.Dp(6)) @@ -110,6 +122,7 @@ func (t *Tracker) layoutTracker(gtx layout.Context) layout.Dimensions { layout.Rigid(Label(" Voices:", white)), layout.Rigid(voiceUpDown), layout.Flexed(1, func(gtx C) D { return layout.Dimensions{Size: gtx.Constraints.Min} }), + layout.Rigid(deleteTrackBtnStyle.Layout), layout.Rigid(newTrackBtnStyle.Layout)) t.Song().Score.Tracks[t.Cursor().Track].Effect = t.TrackHexCheckBox.Value // TODO: we should not modify the model, but how should this be done t.SetTrackVoices(t.TrackVoices.Value) diff --git a/tracker/gioui/tracker.go b/tracker/gioui/tracker.go index 4bc7b80..192e2dd 100644 --- a/tracker/gioui/tracker.go +++ b/tracker/gioui/tracker.go @@ -28,6 +28,7 @@ type Tracker struct { TrackVoices *NumberInput InstrumentNameEditor *widget.Editor NewTrackBtn *widget.Clickable + DeleteTrackBtn *widget.Clickable NewInstrumentBtn *widget.Clickable DeleteInstrumentBtn *widget.Clickable AddSemitoneBtn *widget.Clickable @@ -113,6 +114,7 @@ func New(audioContext sointu.AudioContext, synthService sointu.SynthService, syn TrackVoices: new(NumberInput), InstrumentNameEditor: &widget.Editor{SingleLine: true, Submit: true, Alignment: text.Middle}, NewTrackBtn: new(widget.Clickable), + DeleteTrackBtn: new(widget.Clickable), NewInstrumentBtn: new(widget.Clickable), DeleteInstrumentBtn: new(widget.Clickable), AddSemitoneBtn: new(widget.Clickable), diff --git a/tracker/model.go b/tracker/model.go index 3a6ff10..603b1fa 100644 --- a/tracker/model.go +++ b/tracker/model.go @@ -203,6 +203,27 @@ func (m *Model) CanAddTrack() bool { return m.song.Score.NumVoices() < 32 } +func (m *Model) DeleteTrack(forward bool) { + if !m.CanDeleteTrack() { + return + } + m.saveUndo("DeleteTrack", 0) + newTracks := make([]sointu.Track, len(m.song.Score.Tracks)-1) + copy(newTracks, m.song.Score.Tracks[:m.cursor.Track]) + copy(newTracks[m.cursor.Track:], m.song.Score.Tracks[m.cursor.Track+1:]) + m.song.Score.Tracks = newTracks + if !forward { + m.cursor.Track-- + } + m.selectionCorner = m.cursor + m.clampPositions() + m.notifyScoreChange() +} + +func (m *Model) CanDeleteTrack() bool { + return len(m.song.Score.Tracks) > 1 +} + func (m *Model) SetTrackVoices(value int) { if value < 1 { value = 1