From 22c433b3e4a4c8db0792dc2283a096780d82d8a6 Mon Sep 17 00:00:00 2001 From: vsariola <5684185+vsariola@users.noreply.github.com> Date: Sat, 30 Jan 2021 22:55:27 +0200 Subject: [PATCH] feat(tracker): add button for deleting instrument --- tracker/instruments.go | 31 +++++++++++++++++++++++++++++++ tracker/layout.go | 5 +++++ tracker/tracker.go | 13 +++++++++++++ 3 files changed, 49 insertions(+) diff --git a/tracker/instruments.go b/tracker/instruments.go index 79d9e4f..d834fe7 100644 --- a/tracker/instruments.go +++ b/tracker/instruments.go @@ -44,10 +44,41 @@ func (t *Tracker) layoutInstruments() layout.Widget { }), ) }), + layout.Rigid(t.layoutInstrumentHeader()), layout.Flexed(1, t.layoutInstrumentEditor())) } } +func (t *Tracker) layoutInstrumentHeader() layout.Widget { + headerBg := func(gtx C) D { + paint.FillShape(gtx.Ops, trackMenuSurfaceColor, clip.Rect{ + Max: gtx.Constraints.Min, + }.Op()) + return layout.Dimensions{Size: gtx.Constraints.Min} + } + header := func(gtx C) D { + deleteInstrumentBtnStyle := material.IconButton(t.Theme, t.DeleteInstrumentBtn, deleteIcon) + deleteInstrumentBtnStyle.Background = transparent + deleteInstrumentBtnStyle.Inset = layout.UniformInset(unit.Dp(6)) + if len(t.song.Patch.Instruments) > 1 { + deleteInstrumentBtnStyle.Color = primaryColor + } else { + deleteInstrumentBtnStyle.Color = disabledTextColor + } + return layout.Flex{Axis: layout.Horizontal}.Layout(gtx, + layout.Flexed(1, func(gtx C) D { return layout.Dimensions{Size: gtx.Constraints.Min} }), + layout.Rigid(deleteInstrumentBtnStyle.Layout)) + } + for t.DeleteInstrumentBtn.Clicked() { + t.DeleteInstrument() + } + return func(gtx C) D { + return layout.Stack{Alignment: layout.Center}.Layout(gtx, + layout.Expanded(headerBg), + layout.Stacked(header)) + } +} + func (t *Tracker) layoutInstrumentNames() layout.Widget { return func(gtx C) D { gtx.Constraints.Max.Y = gtx.Px(unit.Dp(36)) diff --git a/tracker/layout.go b/tracker/layout.go index 156f2e6..01e7c6c 100644 --- a/tracker/layout.go +++ b/tracker/layout.go @@ -22,6 +22,7 @@ var addIcon *widget.Icon var loadIcon *widget.Icon var saveIcon *widget.Icon var clearIcon *widget.Icon +var deleteIcon *widget.Icon func init() { var err error @@ -49,6 +50,10 @@ func init() { if err != nil { log.Fatal(err) } + deleteIcon, err = widget.NewIcon(icons.ActionDelete) + if err != nil { + log.Fatal(err) + } } func smallButton(icStyle material.IconButtonStyle) material.IconButtonStyle { diff --git a/tracker/tracker.go b/tracker/tracker.go index f03d5d9..95e83a3 100644 --- a/tracker/tracker.go +++ b/tracker/tracker.go @@ -31,6 +31,7 @@ type Tracker struct { BPM *NumberInput NewTrackBtn *widget.Clickable NewInstrumentBtn *widget.Clickable + DeleteInstrumentBtn *widget.Clickable LoadSongFileBtn *widget.Clickable NewSongFileBtn *widget.Clickable AddSemitoneBtn *widget.Clickable @@ -210,6 +211,17 @@ func (t *Tracker) AddInstrument() { t.sequencer.SetPatch(t.song.Patch) } +func (t *Tracker) DeleteInstrument() { + if len(t.song.Patch.Instruments) <= 1 { + return + } + t.SaveUndo() + t.song.Patch.Instruments = append(t.song.Patch.Instruments[:t.CurrentInstrument], t.song.Patch.Instruments[t.CurrentInstrument+1:]...) + if t.CurrentInstrument >= len(t.song.Patch.Instruments) { + t.CurrentInstrument = len(t.song.Patch.Instruments) - 1 + } +} + // SetCurrentNote sets the (note) value in current pattern under cursor to iv func (t *Tracker) SetCurrentNote(iv byte) { t.SaveUndo() @@ -318,6 +330,7 @@ func New(audioContext sointu.AudioContext) *Tracker { SongLength: new(NumberInput), NewTrackBtn: new(widget.Clickable), NewInstrumentBtn: new(widget.Clickable), + DeleteInstrumentBtn: new(widget.Clickable), NewSongFileBtn: new(widget.Clickable), LoadSongFileBtn: new(widget.Clickable), SaveSongFileBtn: new(widget.Clickable),