diff --git a/widget/entry.go b/widget/entry.go index 826f6e91ca..3e8614030f 100644 --- a/widget/entry.go +++ b/widget/entry.go @@ -820,6 +820,9 @@ func (e *Entry) rowColFromTextPos(pos int) (row int, col int) { row++ } col = pos - b[0] + if e.Wrapping != fyne.TextWrapOff && b[0] == pos && col == 0 && pos != 0 { + row++ + } } else { break } diff --git a/widget/entry_test.go b/widget/entry_test.go index 49bc1a34e3..42686ec2d5 100644 --- a/widget/entry_test.go +++ b/widget/entry_test.go @@ -109,6 +109,22 @@ func TestEntry_CursorColumn_Wrap(t *testing.T) { assert.Equal(t, 1, entry.CursorColumn) } +func TestEntry_CursorColumn_Wrap2(t *testing.T) { + entry := widget.NewMultiLineEntry() + entry.Wrapping = fyne.TextWrapWord + entry.Resize(fyne.NewSize(64, 64)) + entry.SetText("1234") + entry.CursorColumn = 3 + test.Type(entry, "a") + test.Type(entry, "b") + test.Type(entry, "c") + assert.Equal(t, 1, entry.CursorColumn) + assert.Equal(t, 1, entry.CursorRow) + w := test.NewWindow(entry) + w.Resize(fyne.NewSize(70, 70)) + test.AssertImageMatches(t, "entry/wrap_multi_line_cursor.png", w.Canvas().Capture()) +} + func TestEntry_CursorPasswordRevealer(t *testing.T) { pr := widget.NewPasswordEntry().ActionItem.(desktop.Cursorable) assert.Equal(t, desktop.DefaultCursor, pr.Cursor()) diff --git a/widget/testdata/entry/wrap_multi_line_cursor.png b/widget/testdata/entry/wrap_multi_line_cursor.png new file mode 100644 index 0000000000..2989c1b7c1 Binary files /dev/null and b/widget/testdata/entry/wrap_multi_line_cursor.png differ