Skip to content

Commit ed7a25e

Browse files
typenoobandydotxyz
authored andcommitted
Fix Wide Character's width caculation in TextGrid (#6143)
* use ”stride“ approach for wide character handling * Add a test
1 parent 2532124 commit ed7a25e

4 files changed

Lines changed: 32 additions & 5 deletions

File tree

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ require (
2323
github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade
2424
github.com/josephspurrier/goversioninfo v1.4.0
2525
github.com/lucor/goinfo v0.9.0
26+
github.com/mattn/go-runewidth v0.0.17
2627
github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2
2728
github.com/natefinch/atomic v1.0.1
2829
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
@@ -49,6 +50,7 @@ require (
4950
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
5051
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
5152
github.com/pmezard/go-difflib v1.0.0 // indirect
53+
github.com/rivo/uniseg v0.2.0 // indirect
5254
github.com/russross/blackfriday/v2 v2.1.0 // indirect
5355
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect
5456
golang.org/x/net v0.35.0 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
5858
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
5959
github.com/lucor/goinfo v0.9.0 h1:EdsMzmY5TZujA4xb9xMLIdlp2+zvF7miNYkVXvqqgOQ=
6060
github.com/lucor/goinfo v0.9.0/go.mod h1:L6m6tN5Rlova5Z83h1ZaKsMP1iiaoZ9vGTNzu5QKOD4=
61+
github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkENfrjQ=
62+
github.com/mattn/go-runewidth v0.0.17/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
6163
github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 h1:YocNLcTBdEdvY3iDK6jfWXvEaM5OCKkjxPKoJRdB3Gg=
6264
github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo=
6365
github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A=
@@ -71,6 +73,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA
7173
github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA=
7274
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
7375
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
76+
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
77+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
7478
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
7579
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
7680
github.com/rymdport/portal v0.4.2 h1:7jKRSemwlTyVHHrTGgQg7gmNPJs88xkbKcIL3NlcmSU=

widget/textgrid.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"fyne.io/fyne/v2/internal/painter"
1313
"fyne.io/fyne/v2/internal/widget"
1414
"fyne.io/fyne/v2/theme"
15+
16+
"github.com/mattn/go-runewidth"
1517
)
1618

1719
const (
@@ -209,6 +211,8 @@ func (t *TextGrid) Text() string {
209211
runes = append(runes, cell.Rune)
210212
if cell.Rune == '\t' {
211213
next = nextTab(col, t.tabWidth())
214+
} else {
215+
next = col + runewidth.StringWidth(string(cell.Rune))
212216
}
213217
}
214218
if i < len(t.Rows)-1 {
@@ -249,6 +253,8 @@ func (t *TextGrid) RowText(row int) string {
249253
runes = append(runes, cell.Rune)
250254
if cell.Rune == '\t' {
251255
next = nextTab(col, t.tabWidth())
256+
} else {
257+
next = col + runewidth.StringWidth(string(cell.Rune))
252258
}
253259
}
254260
return string(runes)
@@ -399,14 +405,18 @@ func (t *TextGrid) parseRows(text string) []TextGridRow {
399405
rows := make([]TextGridRow, len(lines))
400406
for i, line := range lines {
401407
cells := make([]TextGridCell, 0, len(line))
408+
next := 0
409+
col := 0
402410
for _, r := range line {
403411
cells = append(cells, TextGridCell{Rune: r})
404412
if r == '\t' {
405-
col := len(cells)
406-
next := nextTab(col-1, t.tabWidth())
407-
for i := col; i < next; i++ {
408-
cells = append(cells, TextGridCell{Rune: ' '})
409-
}
413+
col = len(cells)
414+
next = nextTab(col-1, t.tabWidth())
415+
} else {
416+
next = col - 1 + runewidth.StringWidth(string(r))
417+
}
418+
for i := col; i < next; i++ {
419+
cells = append(cells, TextGridCell{Rune: ' '})
410420
}
411421
}
412422
rows[i] = TextGridRow{Cells: cells}

widget/textgrid_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,17 @@ func TestTextGrid_Text(t *testing.T) {
274274
assert.Equal(t, input, grid.Text())
275275
}
276276

277+
func TestTextGrid_Size(t *testing.T) {
278+
grid := NewTextGrid()
279+
singleWidthRunes := []rune{'a', 'b', 'c'}
280+
doubleWidthRunes := []rune{'一', '二', '三'}
281+
grid.SetText(string(append(singleWidthRunes, doubleWidthRunes...)))
282+
grid.Resize(grid.MinSize())
283+
size := grid.content.cellSize
284+
size.Width *= float32(len(singleWidthRunes) + 2*len(doubleWidthRunes))
285+
assert.Equal(t, size, grid.Size())
286+
}
287+
277288
func TestTextGridRenderer_Resize(t *testing.T) {
278289
grid := NewTextGridFromString("1\n2")
279290
grid.ShowLineNumbers = true

0 commit comments

Comments
 (0)