From c531b7836636e57430175ccc64abcedfc9ecfaa2 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 21 Oct 2022 19:31:05 +0100 Subject: [PATCH] Fix issue where implicit selection deletion can break text state Fixes #3340 --- widget/entry.go | 3 +++ widget/entry_test.go | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/widget/entry.go b/widget/entry.go index e4dfc1873d..e607ff6aaf 100644 --- a/widget/entry.go +++ b/widget/entry.go @@ -728,7 +728,10 @@ func (e *Entry) TypedRune(r rune) { // if we've typed a character and we're selecting then replace the selection with the character if selecting { + cb := e.OnChanged + e.OnChanged = nil // don't propagate this change to binding etc e.eraseSelection() + e.OnChanged = cb // the change later will then trigger callback } e.propertyLock.Lock() diff --git a/widget/entry_test.go b/widget/entry_test.go index adb1884471..019ee640a7 100644 --- a/widget/entry_test.go +++ b/widget/entry_test.go @@ -42,6 +42,21 @@ func TestEntry_Binding(t *testing.T) { assert.Equal(t, "Typed", entry.Text) } +func TestEntry_Binding_Replace(t *testing.T) { + entry := widget.NewEntry() + str := binding.NewString() + _ = str.Set("Content") + entry.Bind(str) + waitForBinding() + assert.Equal(t, "Content", entry.Text) + + typeKeys(entry, fyne.KeyRight, fyne.KeyRight, keyShiftLeftDown, fyne.KeyRight, fyne.KeyRight, keyShiftLeftUp) + assert.Equal(t, "nt", entry.SelectedText()) + + test.Type(entry, "g") + assert.Equal(t, "Cogent", entry.Text) +} + func TestEntry_Clicked(t *testing.T) { entry, window := setupImageTest(t, true) defer teardownImageTest(window)