fix(tracker): unit searching to work more reliably

This commit is contained in:
5684185+vsariola@users.noreply.github.com 2024-02-17 20:54:46 +02:00
parent db6c9f6052
commit 2b3f6d8200
7 changed files with 39 additions and 15 deletions

View File

@ -133,7 +133,6 @@ func (m *Model) AddUnit(before bool) Action {
(*Model)(m).assignUnitIDs(newUnits[m.d.UnitIndex : m.d.UnitIndex+1]) (*Model)(m).assignUnitIDs(newUnits[m.d.UnitIndex : m.d.UnitIndex+1])
m.d.Song.Patch[m.d.InstrIndex].Units = newUnits m.d.Song.Patch[m.d.InstrIndex].Units = newUnits
m.d.ParamIndex = 0 m.d.ParamIndex = 0
m.d.UnitSearchString = ""
}) })
} }
@ -145,7 +144,6 @@ func (m *Model) DeleteUnit() Action {
do: func() { do: func() {
defer (*Model)(m).change("DeleteUnitAction", PatchChange, MajorChange)() defer (*Model)(m).change("DeleteUnitAction", PatchChange, MajorChange)()
m.Units().List().DeleteElements(true) 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)() 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.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.Song.Patch[m.d.InstrIndex].Units[m.d.UnitIndex] = sointu.Unit{}
m.d.UnitSearchString = ""
}, },
allowed: func() bool { allowed: func() bool {
return m.d.InstrIndex >= 0 && return m.d.InstrIndex >= 0 &&

View File

@ -18,6 +18,7 @@ type (
Effect Model Effect Model
CommentExpanded Model CommentExpanded Model
NoteTracking Model NoteTracking Model
UnitSearching Model
) )
func (v Bool) Toggle() { 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) Effect() *Effect { return (*Effect)(m) }
func (m *Model) CommentExpanded() *CommentExpanded { return (*CommentExpanded)(m) } func (m *Model) CommentExpanded() *CommentExpanded { return (*CommentExpanded)(m) }
func (m *Model) NoteTracking() *NoteTracking { return (*NoteTracking)(m) } func (m *Model) NoteTracking() *NoteTracking { return (*NoteTracking)(m) }
func (m *Model) UnitSearching() *UnitSearching { return (*UnitSearching)(m) }
// Panic methods // Panic methods
@ -112,3 +114,15 @@ func (m *Effect) setValue(val bool) {
m.d.Song.Score.Tracks[m.d.Cursor.Track].Effect = val m.d.Song.Score.Tracks[m.d.Cursor.Track].Effect = val
} }
func (m *Effect) Enabled() bool { return true } 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 }

View File

@ -373,6 +373,7 @@ func (ie *InstrumentEditor) layoutUnitList(gtx C, t *Tracker) D {
} }
} }
t.Units().SetSelectedType(txt) t.Units().SetSelectedType(txt)
t.UnitSearching().Bool().Set(false)
continue 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() 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) key.InputOp{Tag: &ie.searchEditor, Keys: globalKeys}.Add(gtx.Ops)
txt := u.Type
str := tracker.String{StringData: (*tracker.UnitSearch)(t.Model)} str := tracker.String{StringData: (*tracker.UnitSearch)(t.Model)}
if ie.searchEditor.Text() != str.Value() { if t.UnitSearching().Value() {
ie.searchEditor.SetText(str.Value()) txt = str.Value()
}
if ie.searchEditor.Text() != txt {
ie.searchEditor.SetText(txt)
} }
ret := editor.Layout(gtx) ret := editor.Layout(gtx)
str.Set(ie.searchEditor.Text()) if ie.searchEditor.Text() != txt {
str.Set(ie.searchEditor.Text())
}
return ret return ret
} else { } else {
unitNameLabel := LabelStyle{Text: u.Type, ShadeColor: black, Color: color, Font: labelDefaultFont, FontSize: unit.Sp(12), Shaper: t.Theme.Shaper} unitNameLabel := LabelStyle{Text: u.Type, ShadeColor: black, Color: color, Font: labelDefaultFont, FontSize: unit.Sp(12), Shaper: t.Theme.Shaper}

View File

@ -59,8 +59,8 @@ func (pe *UnitEditor) Layout(gtx C, t *Tracker) D {
key.InputOp{Tag: &pe.tag, Keys: "←|Shift-←|→|Shift-→|⎋"}.Add(gtx.Ops) key.InputOp{Tag: &pe.tag, Keys: "←|Shift-←|→|Shift-→|⎋"}.Add(gtx.Ops)
editorFunc := pe.layoutSliders 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 editorFunc = pe.layoutUnitTypeChooser
} }
return Surface{Gray: 24, Focus: t.InstrumentEditor.wasFocused}.Layout(gtx, func(gtx C) D { return Surface{Gray: 24, Focus: t.InstrumentEditor.wasFocused}.Layout(gtx, func(gtx C) D {

View File

@ -209,6 +209,8 @@ func (v *Instruments) SetSelected(value int) {
v.d.InstrIndex = intMax(intMin(value, v.Count()-1), 0) v.d.InstrIndex = intMax(intMin(value, v.Count()-1), 0)
v.d.UnitIndex = 0 v.d.UnitIndex = 0
v.d.UnitIndex2 = 0 v.d.UnitIndex2 = 0
v.d.UnitSearching = false
v.d.UnitSearchString = ""
} }
func (v *Instruments) SetSelected2(value int) { func (v *Instruments) SetSelected2(value int) {
@ -310,7 +312,6 @@ func (m *Units) SetSelectedType(t string) {
return return
} }
defer m.change("SetSelectedType", MajorChange)() 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] = unit
m.d.Song.Patch[m.d.InstrIndex].Units[m.d.UnitIndex].ID = oldUnit.ID // keep the ID of the replaced 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 := (*Model)(v)
m.d.UnitIndex = intMax(intMin(value, v.Count()-1), 0) m.d.UnitIndex = intMax(intMin(value, v.Count()-1), 0)
m.d.ParamIndex = 0 m.d.ParamIndex = 0
if m.d.UnitIndex >= 0 && m.d.UnitIndex < len(m.d.Song.Patch[m.d.InstrIndex].Units) { m.d.UnitSearching = false
m.d.UnitSearchString = m.d.Song.Patch[m.d.InstrIndex].Units[m.d.UnitIndex].Type m.d.UnitSearchString = ""
}
} }
func (v *Units) SetSelected2(value int) { func (v *Units) SetSelected2(value int) {

View File

@ -29,6 +29,7 @@ type (
ParamIndex int ParamIndex int
UnitSearchIndex int UnitSearchIndex int
UnitSearchString string UnitSearchString string
UnitSearching bool
Octave int Octave int
Step int Step int
FilePath string 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.UnitIndex = clamp(m.d.UnitIndex, 0, unitCount-1)
m.d.UnitIndex2 = clamp(m.d.UnitIndex2, 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()) m.send(m.d.Song.Patch.Copy())
} }
if m.changeType&BPMChange != 0 { if m.changeType&BPMChange != 0 {

View File

@ -40,9 +40,12 @@ func (v *FilePath) change(kind string) func() { return func() {} }
// UnitSearchString // UnitSearchString
func (v *UnitSearch) String() String { return String{v} } func (v *UnitSearch) String() String { return String{v} }
func (v *UnitSearch) Value() string { return v.d.UnitSearchString } func (v *UnitSearch) Value() string { return v.d.UnitSearchString }
func (v *UnitSearch) setValue(value string) { v.d.UnitSearchString = value } func (v *UnitSearch) setValue(value string) {
v.d.UnitSearchString = value
v.d.UnitSearching = true
}
func (v *UnitSearch) change(kind string) func() { return func() {} } func (v *UnitSearch) change(kind string) func() { return func() {} }
// InstrumentNameString // InstrumentNameString