Closed ddkwork closed 7 months ago
Stable reproduction method: Run it a few more times, only observe the situation that it is not working normally, and start over after it is running
I will work on fixing this.
You should only start updating the data in the table once the scene is shown. For example, this code should work:
package main
import (
"cogentcore.org/core/events"
"cogentcore.org/core/gi"
"cogentcore.org/core/giv"
"cogentcore.org/core/icons"
)
type TableStruct struct { //gti:add
Icon icons.Icon
IntField int `default:"2"`
FloatField float32
StrField string
File gi.Filename
}
func main() {
table := make([]*TableStruct, 0, 100000)
b := gi.NewBody("leak")
tv := giv.NewTableView(b, "tv")
tv.SetReadOnly(true)
tv.SetSlice(&table)
b.OnShow(func(e events.Event) {
go func() {
for i := 0; i < 100000; i++ {
table = append(table, &TableStruct{IntField: i, FloatField: float32(i) / 10.0})
updt := tv.UpdateStartAsync()
tv.UpdateWidgets()
tv.UpdateEndAsyncLayout(updt)
if len(table) > 0 {
tv.ScrollToIdx(len(table) - 1)
}
}
}()
})
b.RunMainWindow()
}
You should only start updating the data in the table once the scene is shown. For example, this code should work:
package main import ( "cogentcore.org/core/events" "cogentcore.org/core/gi" "cogentcore.org/core/giv" "cogentcore.org/core/icons" ) type TableStruct struct { //gti:add Icon icons.Icon IntField int `default:"2"` FloatField float32 StrField string File gi.Filename } func main() { table := make([]*TableStruct, 0, 100000) b := gi.NewBody("leak") tv := giv.NewTableView(b, "tv") tv.SetReadOnly(true) tv.SetSlice(&table) b.OnShow(func(e events.Event) { go func() { for i := 0; i < 100000; i++ { table = append(table, &TableStruct{IntField: i, FloatField: float32(i) / 10.0}) updt := tv.UpdateStartAsync() tv.UpdateWidgets() tv.UpdateEndAsyncLayout(updt) if len(table) > 0 { tv.ScrollToIdx(len(table) - 1) } } }() }) b.RunMainWindow() }
Thanks!
Describe the bug
see title
How to reproduce
Run multiple times
Example code
Relevant output
Platform
Windows