diff --git a/tracker/action.go b/tracker/action.go index 2dd5d26..2e6991f 100644 --- a/tracker/action.go +++ b/tracker/action.go @@ -133,7 +133,6 @@ func (m *Model) AddUnit(before bool) Action { (*Model)(m).assignUnitIDs(newUnits[m.d.UnitIndex : m.d.UnitIndex+1]) m.d.Song.Patch[m.d.InstrIndex].Units = newUnits m.d.ParamIndex = 0 - m.d.UnitSearchString = "" }) } @@ -145,7 +144,6 @@ func (m *Model) DeleteUnit() Action { do: func() { defer (*Model)(m).change("DeleteUnitAction", PatchChange, MajorChange)() m.Units().List().DeleteElements(true) - m.d.UnitSearchString = m.Units().SelectedType() }, } } @@ -156,7 +154,6 @@ func (m *Model) ClearUnit() Action { defer (*Model)(m).change("DeleteUnitAction", PatchChange, MajorChange)() m.d.UnitIndex = intMax(intMin(m.d.UnitIndex, len(m.d.Song.Patch[m.d.InstrIndex].Units)-1), 0) m.d.Song.Patch[m.d.InstrIndex].Units[m.d.UnitIndex] = sointu.Unit{} - m.d.UnitSearchString = "" }, allowed: func() bool { return m.d.InstrIndex >= 0 && diff --git a/tracker/bool.go b/tracker/bool.go index 1ff352d..9e27df9 100644 --- a/tracker/bool.go +++ b/tracker/bool.go @@ -18,6 +18,7 @@ type ( Effect Model CommentExpanded Model NoteTracking Model + UnitSearching Model ) func (v Bool) Toggle() { @@ -39,6 +40,7 @@ func (m *Model) InstrEnlarged() *InstrEnlarged { return (*InstrEnlarged)(m) func (m *Model) Effect() *Effect { return (*Effect)(m) } func (m *Model) CommentExpanded() *CommentExpanded { return (*CommentExpanded)(m) } func (m *Model) NoteTracking() *NoteTracking { return (*NoteTracking)(m) } +func (m *Model) UnitSearching() *UnitSearching { return (*UnitSearching)(m) } // Panic methods @@ -112,3 +114,15 @@ func (m *Effect) setValue(val bool) { m.d.Song.Score.Tracks[m.d.Cursor.Track].Effect = val } func (m *Effect) Enabled() bool { return true } + +// UnitSearching methods + +func (m *UnitSearching) Bool() Bool { return Bool{m} } +func (m *UnitSearching) Value() bool { return m.d.UnitSearching } +func (m *UnitSearching) setValue(val bool) { + m.d.UnitSearching = val + if !val { + m.d.UnitSearchString = "" + } +} +func (m *UnitSearching) Enabled() bool { return true } diff --git a/tracker/gioui/instrument_editor.go b/tracker/gioui/instrument_editor.go index 1d674a9..432a54d 100644 --- a/tracker/gioui/instrument_editor.go +++ b/tracker/gioui/instrument_editor.go @@ -373,6 +373,7 @@ func (ie *InstrumentEditor) layoutUnitList(gtx C, t *Tracker) D { } } t.Units().SetSelectedType(txt) + t.UnitSearching().Bool().Set(false) continue } } @@ -384,12 +385,18 @@ func (ie *InstrumentEditor) layoutUnitList(gtx C, t *Tracker) D { defer clip.Rect(image.Rect(0, 0, gtx.Constraints.Max.X, gtx.Constraints.Max.Y)).Push(gtx.Ops).Pop() key.InputOp{Tag: &ie.searchEditor, Keys: globalKeys}.Add(gtx.Ops) + txt := u.Type str := tracker.String{StringData: (*tracker.UnitSearch)(t.Model)} - if ie.searchEditor.Text() != str.Value() { - ie.searchEditor.SetText(str.Value()) + if t.UnitSearching().Value() { + txt = str.Value() + } + if ie.searchEditor.Text() != txt { + ie.searchEditor.SetText(txt) } ret := editor.Layout(gtx) - str.Set(ie.searchEditor.Text()) + if ie.searchEditor.Text() != txt { + str.Set(ie.searchEditor.Text()) + } return ret } else { unitNameLabel := LabelStyle{Text: u.Type, ShadeColor: black, Color: color, Font: labelDefaultFont, FontSize: unit.Sp(12), Shaper: t.Theme.Shaper} diff --git a/tracker/gioui/unit_editor.go b/tracker/gioui/unit_editor.go index f23a9dc..9a9e8eb 100644 --- a/tracker/gioui/unit_editor.go +++ b/tracker/gioui/unit_editor.go @@ -59,8 +59,8 @@ func (pe *UnitEditor) Layout(gtx C, t *Tracker) D { key.InputOp{Tag: &pe.tag, Keys: "←|Shift-←|→|Shift-→|⎋"}.Add(gtx.Ops) editorFunc := pe.layoutSliders - str := tracker.String{StringData: (*tracker.UnitSearch)(t.Model)} - if str.Value() != t.Model.Units().SelectedType() || pe.sliderList.TrackerList.Count() == 0 { + + if t.UnitSearching().Value() || pe.sliderList.TrackerList.Count() == 0 { editorFunc = pe.layoutUnitTypeChooser } return Surface{Gray: 24, Focus: t.InstrumentEditor.wasFocused}.Layout(gtx, func(gtx C) D { diff --git a/tracker/list.go b/tracker/list.go index fdefea3..8a45dde 100644 --- a/tracker/list.go +++ b/tracker/list.go @@ -209,6 +209,8 @@ func (v *Instruments) SetSelected(value int) { v.d.InstrIndex = intMax(intMin(value, v.Count()-1), 0) v.d.UnitIndex = 0 v.d.UnitIndex2 = 0 + v.d.UnitSearching = false + v.d.UnitSearchString = "" } func (v *Instruments) SetSelected2(value int) { @@ -310,7 +312,6 @@ func (m *Units) SetSelectedType(t string) { return } defer m.change("SetSelectedType", MajorChange)() - m.d.UnitSearchString = unit.Type m.d.Song.Patch[m.d.InstrIndex].Units[m.d.UnitIndex] = unit m.d.Song.Patch[m.d.InstrIndex].Units[m.d.UnitIndex].ID = oldUnit.ID // keep the ID of the replaced unit } @@ -341,9 +342,8 @@ func (v *Units) SetSelected(value int) { m := (*Model)(v) m.d.UnitIndex = intMax(intMin(value, v.Count()-1), 0) m.d.ParamIndex = 0 - if m.d.UnitIndex >= 0 && m.d.UnitIndex < len(m.d.Song.Patch[m.d.InstrIndex].Units) { - m.d.UnitSearchString = m.d.Song.Patch[m.d.InstrIndex].Units[m.d.UnitIndex].Type - } + m.d.UnitSearching = false + m.d.UnitSearchString = "" } func (v *Units) SetSelected2(value int) { diff --git a/tracker/model.go b/tracker/model.go index 9f79ca5..dd18599 100644 --- a/tracker/model.go +++ b/tracker/model.go @@ -29,6 +29,7 @@ type ( ParamIndex int UnitSearchIndex int UnitSearchString string + UnitSearching bool Octave int Step int FilePath string @@ -222,6 +223,8 @@ func (m *Model) change(kind string, t ChangeType, severity ChangeSeverity) func( } m.d.UnitIndex = clamp(m.d.UnitIndex, 0, unitCount-1) m.d.UnitIndex2 = clamp(m.d.UnitIndex2, 0, unitCount-1) + m.d.UnitSearching = false // if we change anything in the patch, reset the unit searching + m.d.UnitSearchString = "" m.send(m.d.Song.Patch.Copy()) } if m.changeType&BPMChange != 0 { diff --git a/tracker/string.go b/tracker/string.go index cc3725e..aceda76 100644 --- a/tracker/string.go +++ b/tracker/string.go @@ -40,9 +40,12 @@ func (v *FilePath) change(kind string) func() { return func() {} } // UnitSearchString -func (v *UnitSearch) String() String { return String{v} } -func (v *UnitSearch) Value() string { return v.d.UnitSearchString } -func (v *UnitSearch) setValue(value string) { v.d.UnitSearchString = value } +func (v *UnitSearch) String() String { return String{v} } +func (v *UnitSearch) Value() string { return v.d.UnitSearchString } +func (v *UnitSearch) setValue(value string) { + v.d.UnitSearchString = value + v.d.UnitSearching = true +} func (v *UnitSearch) change(kind string) func() { return func() {} } // InstrumentNameString