diff --git a/widget/textgrid.go b/widget/textgrid.go index c4ae3a5699..0e28c9e94e 100644 --- a/widget/textgrid.go +++ b/widget/textgrid.go @@ -337,6 +337,7 @@ type textGridRenderer struct { cellSize fyne.Size objects []fyne.CanvasObject + current fyne.Canvas } func (t *textGridRenderer) appendTextCell(str rune) { @@ -369,9 +370,12 @@ func (t *textGridRenderer) setCellRune(str rune, pos int, style, rowStyle TextGr } else if rowStyle != nil && rowStyle.TextColor() != nil { fg = rowStyle.TextColor() } - text.Text = string(str) - text.Color = fg - canvas.Refresh(text) + newStr := string(str) + if text.Text != newStr || text.Color != fg { + text.Text = newStr + text.Color = fg + t.refresh(text) + } rect := t.objects[pos*2].(*canvas.Rectangle) bg := color.Color(color.Transparent) @@ -380,8 +384,10 @@ func (t *textGridRenderer) setCellRune(str rune, pos int, style, rowStyle TextGr } else if rowStyle != nil && rowStyle.BackgroundColor() != nil { bg = rowStyle.BackgroundColor() } - rect.FillColor = bg - canvas.Refresh(rect) + if rect.FillColor != bg { + rect.FillColor = bg + t.refresh(rect) + } } func (t *textGridRenderer) addCellsIfRequired() { @@ -521,6 +527,11 @@ func (t *textGridRenderer) MinSize() fyne.Size { } func (t *textGridRenderer) Refresh() { + // we may be on a new canvas, so just update it to be sure + if fyne.CurrentApp() != nil && fyne.CurrentApp().Driver() != nil { + t.current = fyne.CurrentApp().Driver().CanvasForObject(t.text) + } + // theme could change text size t.updateCellSize() @@ -539,6 +550,21 @@ func (t *textGridRenderer) Objects() []fyne.CanvasObject { func (t *textGridRenderer) Destroy() { } +func (t *textGridRenderer) refresh(obj fyne.CanvasObject) { + if t.current == nil { + if fyne.CurrentApp() != nil && fyne.CurrentApp().Driver() != nil { + // cache canvas for this widget, so we don't look it up many times for every cell/row refresh! + t.current = fyne.CurrentApp().Driver().CanvasForObject(t.text) + } + + if t.current == nil { + return // not yet set up perhaps? + } + } + + t.current.Refresh(obj) +} + func (t *textGridRenderer) updateCellSize() { size := fyne.MeasureText("M", theme.TextSize(), fyne.TextStyle{Monospace: true})