Skip to content

Commit 23def0a

Browse files
authored
Merge pull request #1650 from cogentcore/textsel
Textsel: text selection fixes
2 parents 85e4c1e + be0185b commit 23def0a

3 files changed

Lines changed: 32 additions & 12 deletions

File tree

core/chooser_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ func TestChooserEditableClick(t *testing.T) {
8989
}
9090

9191
func TestChooserEditableTextFieldClick(t *testing.T) {
92+
t.Skip("todo: unreliable, https://github.com/cogentcore/core/issues/1641")
9293
b := NewBody()
9394
b.Styler(func(s *styles.Style) {
9495
s.Min.Set(units.Em(20), units.Em(10))

core/events.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -452,12 +452,11 @@ func (em *Events) handlePosEvent(e events.Event) {
452452
em.cancelRepeatClick()
453453
em.cancelLongPress()
454454
if em.slide != nil { // out of original bbox
455-
got := false
455+
var nextSlide Widget
456456
for i := n - 1; i >= 0; i-- {
457457
w := em.mouseInBBox[i]
458458
if _, ok := w.(*Text); ok {
459-
em.slide = w
460-
got = true
459+
nextSlide = w
461460
break
462461
}
463462
}
@@ -467,10 +466,12 @@ func (em *Events) handlePosEvent(e events.Event) {
467466
ec.AsBase().WhereLocal = slb.Geom.TotalBBox.Max
468467
slb.Send(events.SlideMove, ec)
469468
}
470-
if got {
469+
if nextSlide != nil {
470+
em.slide = nextSlide
471+
slb = em.slide.AsWidget()
471472
ec := e.Clone()
472473
ec.AsBase().WhereLocal = slb.Geom.TotalBBox.Min
473-
em.slide.AsWidget().Send(events.SlideStart, ec)
474+
slb.Send(events.SlideStart, ec)
474475
}
475476
} else {
476477
em.slide = em.slidePress

core/text.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"cogentcore.org/core/colors"
1616
"cogentcore.org/core/cursors"
1717
"cogentcore.org/core/events"
18+
"cogentcore.org/core/events/key"
1819
"cogentcore.org/core/icons"
1920
"cogentcore.org/core/keymap"
2021
"cogentcore.org/core/math32"
@@ -230,7 +231,9 @@ func (tx *Text) Init() {
230231
system.TheApp.OpenURL(tl.URL)
231232
})
232233
tx.OnFocusLost(func(e events.Event) {
233-
tx.selectReset()
234+
if !(tx.Scene.selectedText != nil && !e.HasAnyModifier(key.Shift, key.Meta)) {
235+
tx.selectReset()
236+
}
234237
})
235238
tx.OnKeyChord(func(e events.Event) {
236239
if tx.selectRange.Len() == 0 {
@@ -251,7 +254,9 @@ func (tx *Text) Init() {
251254
}
252255
})
253256
tx.OnFinal(events.Click, func(e events.Event) {
254-
tx.Scene.selectedText = nil // reset
257+
if !e.HasAnyModifier(key.Shift, key.Meta) {
258+
tx.selectReset()
259+
}
255260
if !TheApp.SystemPlatform().IsMobile() {
256261
return
257262
}
@@ -266,11 +271,17 @@ func (tx *Text) Init() {
266271
})
267272
tx.On(events.DoubleClick, func(e events.Event) {
268273
e.SetHandled()
274+
if !slices.Contains(tx.Scene.selectedText, tx) {
275+
tx.Scene.selectedText = append(tx.Scene.selectedText, tx)
276+
}
269277
tx.selectWord(tx.pixelToRune(e.Pos()))
270278
tx.SetFocusQuiet()
271279
})
272280
tx.On(events.TripleClick, func(e events.Event) {
273281
e.SetHandled()
282+
if !slices.Contains(tx.Scene.selectedText, tx) {
283+
tx.Scene.selectedText = append(tx.Scene.selectedText, tx)
284+
}
274285
tx.selectAll()
275286
tx.SetFocusQuiet()
276287
if TheApp.SystemPlatform().IsMobile() {
@@ -376,7 +387,6 @@ func (tx *Text) copy() { //types:add
376387
sel += "\n"
377388
}
378389
sel += string(st.richText.Join()[st.selectRange.Start:st.selectRange.End])
379-
st.selectReset()
380390
}
381391
} else {
382392
// note: selectRange is in runes, not string indexes.
@@ -415,11 +425,19 @@ func (tx *Text) hasSelection() bool {
415425
return tx.selectRange.Len() > 0
416426
}
417427

418-
// selectReset resets any current selection
428+
// selectReset resets any current selection, including for the multi-text
429+
// Scene selectedText.
419430
func (tx *Text) selectReset() {
420-
tx.selectRange.Start = 0
421-
tx.selectRange.End = 0
422-
tx.NeedsRender()
431+
reset := func(t *Text) {
432+
t.selectRange.Start = 0
433+
t.selectRange.End = 0
434+
t.NeedsRender()
435+
}
436+
for _, st := range tx.Scene.selectedText {
437+
reset(st)
438+
}
439+
reset(tx)
440+
tx.Scene.selectedText = nil
423441
}
424442

425443
// selectAll selects entire set of text

0 commit comments

Comments
 (0)