feat: toggle button to duplicate non-unique patterns when changed

Closes #77.
This commit is contained in:
5684185+vsariola@users.noreply.github.com
2024-10-13 14:47:22 +03:00
parent 3a7ab0416a
commit 10f021a497
9 changed files with 72 additions and 24 deletions

View File

@ -21,6 +21,7 @@ type (
UnitSearching Model
UnitDisabled Model
LoopToggle Model
UniquePatterns Model
)
func (v Bool) Toggle() {
@ -45,6 +46,7 @@ func (m *Model) Follow() *Follow { return (*Follow)(m) }
func (m *Model) UnitSearching() *UnitSearching { return (*UnitSearching)(m) }
func (m *Model) UnitDisabled() *UnitDisabled { return (*UnitDisabled)(m) }
func (m *Model) LoopToggle() *LoopToggle { return (*LoopToggle)(m) }
func (m *Model) UniquePatterns() *UniquePatterns { return (*UniquePatterns)(m) }
// Panic methods
@ -185,3 +187,10 @@ func (t *LoopToggle) setValue(val bool) {
m.setLoop(newLoop)
}
func (m *LoopToggle) Enabled() bool { return true }
// UniquePatterns methods
func (m *UniquePatterns) Bool() Bool { return Bool{m} }
func (m *UniquePatterns) Value() bool { return m.uniquePatterns }
func (m *UniquePatterns) setValue(val bool) { m.uniquePatterns = val }
func (m *UniquePatterns) Enabled() bool { return true }

View File

@ -220,6 +220,8 @@ func (t *Tracker) KeyEvent(e key.Event, gtx C) {
t.UnitDisabled().Bool().Toggle()
case "LoopToggle":
t.LoopToggle().Bool().Toggle()
case "UniquePatternsToggle":
t.UniquePatterns().Bool().Toggle()
// Integers
case "InstrumentVoicesAdd":
t.Model.InstrumentVoices().Int().Add(1)

View File

@ -59,13 +59,15 @@ type NoteEditor struct {
SubtractOctaveBtn *ActionClickable
NoteOffBtn *ActionClickable
EffectBtn *BoolClickable
UniqueBtn *BoolClickable
scrollTable *ScrollTable
tag struct{}
eventFilters []event.Filter
deleteTrackHint string
addTrackHint string
deleteTrackHint string
addTrackHint string
uniqueOffTip, uniqueOnTip string
}
func NewNoteEditor(model *tracker.Model) *NoteEditor {
@ -79,6 +81,7 @@ func NewNoteEditor(model *tracker.Model) *NoteEditor {
SubtractOctaveBtn: NewActionClickable(model.SubtractOctave()),
NoteOffBtn: NewActionClickable(model.EditNoteOff()),
EffectBtn: NewBoolClickable(model.Effect().Bool()),
UniqueBtn: NewBoolClickable(model.UniquePatterns().Bool()),
scrollTable: NewScrollTable(
model.Notes().Table(),
model.Tracks().List(),
@ -93,6 +96,8 @@ func NewNoteEditor(model *tracker.Model) *NoteEditor {
}
ret.deleteTrackHint = makeHint("Delete\ntrack", "\n(%s)", "DeleteTrack")
ret.addTrackHint = makeHint("Add\ntrack", "\n(%s)", "AddTrack")
ret.uniqueOnTip = makeHint("Duplicate non-unique patterns", " (%s)", "UniquePatternsToggle")
ret.uniqueOffTip = makeHint("Allow editing non-unique patterns", " (%s)", "UniquePatternsToggle")
return ret
}
@ -145,6 +150,7 @@ func (te *NoteEditor) layoutButtons(gtx C, t *Tracker) D {
return in.Layout(gtx, numStyle.Layout)
}
effectBtnStyle := ToggleButton(gtx, t.Theme, te.EffectBtn, "Hex")
uniqueBtnStyle := ToggleIcon(gtx, t.Theme, te.UniqueBtn, icons.ToggleStarBorder, icons.ToggleStar, te.uniqueOffTip, te.uniqueOnTip)
return layout.Flex{Axis: layout.Horizontal, Alignment: layout.Middle}.Layout(gtx,
layout.Rigid(func(gtx C) D { return layout.Dimensions{Size: image.Pt(gtx.Dp(unit.Dp(12)), 0)} }),
layout.Rigid(addSemitoneBtnStyle.Layout),
@ -153,6 +159,7 @@ func (te *NoteEditor) layoutButtons(gtx C, t *Tracker) D {
layout.Rigid(subtractOctaveBtnStyle.Layout),
layout.Rigid(noteOffBtnStyle.Layout),
layout.Rigid(effectBtnStyle.Layout),
layout.Rigid(uniqueBtnStyle.Layout),
layout.Rigid(Label(" Voices:", white, t.Theme.Shaper)),
layout.Rigid(voiceUpDown),
layout.Flexed(1, func(gtx C) D { return layout.Dimensions{Size: gtx.Constraints.Min} }),

View File

@ -667,8 +667,8 @@ func (v *NoteRows) swap(i, j int) (ok bool) {
for _, track := range v.d.Song.Score.Tracks {
n1 := track.Note(ipos)
n2 := track.Note(jpos)
track.SetNote(ipos, n2)
track.SetNote(jpos, n1)
track.SetNote(ipos, n2, v.uniquePatterns)
track.SetNote(jpos, n1, v.uniquePatterns)
}
return true
}
@ -679,7 +679,7 @@ func (v *NoteRows) delete(i int) (ok bool) {
}
pos := v.d.Song.Score.SongPos(i)
for _, track := range v.d.Song.Score.Tracks {
track.SetNote(pos, 1)
track.SetNote(pos, 1, v.uniquePatterns)
}
return true
}
@ -730,7 +730,7 @@ func (v *NoteRows) unmarshal(data []byte) (from, to int, err error) {
for j, note := range arr {
y := j + from
pos := v.d.Song.Score.SongPos(y)
v.d.Song.Score.Tracks[i].SetNote(pos, note)
v.d.Song.Score.Tracks[i].SetNote(pos, note, v.uniquePatterns)
}
}
return

View File

@ -54,13 +54,14 @@ type (
changeSeverity ChangeSeverity
changeType ChangeType
panic bool
recording bool
playing bool
playPosition sointu.SongPos
loop Loop
follow bool
quitted bool
panic bool
recording bool
playing bool
playPosition sointu.SongPos
loop Loop
follow bool
quitted bool
uniquePatterns bool
cachePatternUseCount [][]int

View File

@ -60,6 +60,7 @@ func (s *modelFuzzState) Iterate(yield func(string, func(p string, t *testing.T)
s.IterateBool("Effect", s.model.Effect().Bool(), yield, seed)
s.IterateBool("CommentExpanded", s.model.CommentExpanded().Bool(), yield, seed)
s.IterateBool("Follow", s.model.Follow().Bool(), yield, seed)
s.IterateBool("UniquePatterns", s.model.UniquePatterns().Bool(), yield, seed)
// Strings
s.IterateString("FilePath", s.model.FilePath().String(), yield, seed)
s.IterateString("InstrumentName", s.model.InstrumentName().String(), yield, seed)

View File

@ -481,7 +481,7 @@ func (v *Notes) add(rect Rect, delta int) (ok bool) {
newVal = 255
}
// only do all sets after all gets, so we don't accidentally adjust single note multiple times
defer v.d.Song.Score.Tracks[x].SetNote(pos, byte(newVal))
defer v.d.Song.Score.Tracks[x].SetNote(pos, byte(newVal), v.uniquePatterns)
}
}
return true
@ -540,7 +540,7 @@ func (v *Notes) unmarshalAtCursor(data []byte) bool {
continue
}
pos := v.d.Song.Score.SongPos(y)
v.d.Song.Score.Tracks[x].SetNote(pos, q)
v.d.Song.Score.Tracks[x].SetNote(pos, q, v.uniquePatterns)
}
}
return true
@ -562,7 +562,7 @@ func (v *Notes) unmarshalRange(rect Rect, data []byte) bool {
continue
}
pos := v.d.Song.Score.SongPos(y)
v.d.Song.Score.Tracks[x].SetNote(pos, a)
v.d.Song.Score.Tracks[x].SetNote(pos, a, v.uniquePatterns)
}
}
return true
@ -609,7 +609,7 @@ func (m *Notes) SetValue(p Point, val byte) {
}
track := &(m.d.Song.Score.Tracks[p.X])
pos := m.d.Song.Score.SongPos(p.Y)
(*track).SetNote(pos, val)
(*track).SetNote(pos, val, m.uniquePatterns)
}
func (v *Notes) FillNibble(value byte, lowNibble bool) {