diff --git a/widget/entry.go b/widget/entry.go index dbdcc0c3e2..e5f151dc17 100644 --- a/widget/entry.go +++ b/widget/entry.go @@ -907,7 +907,8 @@ func (e *Entry) rowColFromTextPos(pos int) (row int, col int) { row++ } col = pos - b.begin - if canWrap && b.begin == pos && col == 0 && pos != 0 && row < (totalRows-1) { + // if this gap is at `pos` and is a line wrap, increment (safe to access boundary i-1) + if canWrap && b.begin == pos && pos != 0 && provider.rowBoundary(i-1).end == b.begin && row < (totalRows-1) { row++ } } else { diff --git a/widget/entry_test.go b/widget/entry_test.go index 152bfc151e..479fa2d41d 100644 --- a/widget/entry_test.go +++ b/widget/entry_test.go @@ -512,12 +512,26 @@ func TestEntry_OnKeyDown_Backspace(t *testing.T) { assert.Equal(t, 0, entry.CursorRow) assert.Equal(t, 2, entry.CursorColumn) - key := &fyne.KeyEvent{Name: fyne.KeyBackspace} - entry.TypedKey(key) + backspace := &fyne.KeyEvent{Name: fyne.KeyBackspace} + entry.TypedKey(backspace) assert.Equal(t, "H", entry.Text) assert.Equal(t, 0, entry.CursorRow) assert.Equal(t, 1, entry.CursorColumn) + + entry = widget.NewMultiLineEntry() + entry.Wrapping = fyne.TextWrapWord + entry.SetText("Line\n2b\n") + down := &fyne.KeyEvent{Name: fyne.KeyDown} + entry.TypedKey(down) + entry.TypedKey(right) + assert.Equal(t, 1, entry.CursorRow) + assert.Equal(t, 1, entry.CursorColumn) + + entry.TypedKey(backspace) + assert.Equal(t, "Line\nb\n", entry.Text) + assert.Equal(t, 1, entry.CursorRow) + assert.Equal(t, 0, entry.CursorColumn) } func TestEntry_OnKeyDown_BackspaceBeyondText(t *testing.T) {