diff --git a/widget/table.go b/widget/table.go index eeeec9df16..984872a983 100644 --- a/widget/table.go +++ b/widget/table.go @@ -437,12 +437,17 @@ func (r *tableCellsRenderer) Refresh() { minRow := offY / (r.cells.cellSize.Height + tableDividerThickness) maxRow := fyne.Min(minRow+rows, dataRows) + updateCell := r.cells.t.UpdateCell + if updateCell == nil { + fyne.LogError("Missing UpdateCell callback required for Table", nil) + } + wasVisible := r.visible r.visible = make(map[TableCellID]fyne.CanvasObject) var cells []fyne.CanvasObject - for y := minRow; y < maxRow; y++ { - for x := minCol; x < maxCol; x++ { - id := TableCellID{x, y} + for row := minRow; row < maxRow; row++ { + for col := minCol; col < maxCol; col++ { + id := TableCellID{row, col} c, ok := wasVisible[id] if !ok { c = r.pool.Obtain() @@ -454,16 +459,13 @@ func (r *tableCellsRenderer) Refresh() { continue } - c.Move(fyne.NewPos(theme.Padding()+x*r.cells.cellSize.Width+(x-1)*tableDividerThickness, - theme.Padding()+y*r.cells.cellSize.Height+(y-1)*tableDividerThickness)) - - if f := r.cells.t.UpdateCell; f != nil { - f(TableCellID{y, x}, c) - } else { - fyne.LogError("Missing UpdateCell callback required for Table", nil) - } + c.Move(fyne.NewPos(theme.Padding()+col*r.cells.cellSize.Width+(col-1)*tableDividerThickness, + theme.Padding()+row*r.cells.cellSize.Height+(row-1)*tableDividerThickness)) } + if updateCell != nil { + updateCell(TableCellID{row, col}, c) + } r.visible[id] = c cells = append(cells, c) } diff --git a/widget/table_test.go b/widget/table_test.go index 5bcdb8142c..9e54d51324 100644 --- a/widget/table_test.go +++ b/widget/table_test.go @@ -142,6 +142,27 @@ func TestTable_Hovered(t *testing.T) { test.AssertImageMatches(t, "table/hovered.png", w.Canvas().Capture()) } +func TestTable_Refresh(t *testing.T) { + displayText := "placeholder" + table := NewTable( + func() (int, int) { return 5, 5 }, + func() fyne.CanvasObject { + return NewLabel("template") + }, + func(_ TableCellID, obj fyne.CanvasObject) { + obj.(*Label).SetText(displayText) + }) + table.Resize(fyne.NewSize(120, 120)) + + renderer := test.WidgetRenderer(table).(*tableRenderer) + cellRenderer := test.WidgetRenderer(renderer.scroll.Content.(*tableCells)) + assert.Equal(t, "placeholder", cellRenderer.(*tableCellsRenderer).Objects()[7].(*Label).Text) + + displayText = "replaced" + table.Refresh() + assert.Equal(t, "replaced", cellRenderer.(*tableCellsRenderer).Objects()[7].(*Label).Text) +} + func TestTable_Selection(t *testing.T) { app := test.NewApp() defer test.NewApp()