func (t *TextBoxController) AddCarets(transform SelectionTransform) { t.storeCaretLocationsNextEdit = true up := t.selections.Transform(0, transform) for _, s := range up { interval.Merge(&t.selections, s) } t.onSelectionChanged.Fire() }
func TestTextSelectionMergeExtendEnd(t *testing.T) { s1 := TextSelection{6, 9, true} s2 := TextSelection{8, 15, false} l := TextSelectionList{s1} interval.Merge(&l, s2) test.AssertEquals(t, TextSelectionList{ TextSelection{6, 15, false}, }, l) }
func TestTextSelectionMergeDuplicate0Len(t *testing.T) { s1 := TextSelection{2, 2, false} s2 := TextSelection{2, 2, true} l := TextSelectionList{s1} interval.Merge(&l, s2) test.AssertEquals(t, TextSelectionList{ TextSelection{2, 2, true}, }, l) }
func TestTextSelectionMergeEncompass(t *testing.T) { s1 := TextSelection{6, 9, false} s2 := TextSelection{5, 10, true} l := TextSelectionList{s1} interval.Merge(&l, s2) test.AssertEquals(t, TextSelectionList{ TextSelection{5, 10, true}, }, l) }
func TestTextSelectionMergeAtStart(t *testing.T) { s1 := TextSelection{6, 9, true} s2 := TextSelection{6, 7, false} l := TextSelectionList{s1} interval.Merge(&l, s2) test.AssertEquals(t, TextSelectionList{ TextSelection{6, 9, false}, }, l) }
func (l TextSelectionList) Transform(from int, transform func(i int) int) TextSelectionList { res := TextSelectionList{} for _, s := range l { start := s.start end := s.end if start >= from { start = transform(start) } if end >= from { end = transform(end) } interval.Merge(&res, TextSelection{start, end, s.caretAtStart}) } return res }
func (l TextSelectionList) TransformCarets(from int, transform func(i int) int) TextSelectionList { res := TextSelectionList{} for _, s := range l { if s.caretAtStart && s.start >= from { s.start = transform(s.start) } else if s.end >= from { s.end = transform(s.end) } if s.start > s.end { tmp := s.start s.start = s.end s.end = tmp s.caretAtStart = !s.caretAtStart } interval.Merge(&res, s) } return res }
func (t *TextBoxController) updateSelectionsForEdits(edits []TextBoxEdit) { min := 0 max := len(t.text) selections := TextSelectionList{} for _, selection := range t.selections { for _, e := range edits { at := e.At delta := e.Delta if selection.start > at { selection.start += delta } if selection.end >= at { selection.end += delta } } if selection.end < selection.start { selection.end = selection.start } selection.start = math.Clamp(selection.start, min, max) selection.end = math.Clamp(selection.end, min, max) interval.Merge(&selections, selection) } t.selections = selections }
func TestTextSelectionMergeOne(t *testing.T) { s := TextSelection{5, 10, true} l := TextSelectionList{} interval.Merge(&l, s) test.AssertEquals(t, TextSelectionList{s}, l) }
func (t *TextBoxController) AddSelection(s TextSelection) { t.storeCaretLocationsNextEdit = true interval.Merge(&t.selections, s) t.onSelectionChanged.Fire() }