cogentcore / core

A free and open source framework for building powerful, fast, elegant 2D and 3D apps that run on macOS, Windows, Linux, iOS, Android, and the web with a single Go codebase, allowing you to Code Once, Run Everywhere.
http://cogentcore.org/core
BSD 3-Clause "New" or "Revised" License
1.7k stars 79 forks source link

PositionScroll sb is nil point #787

Closed ddkwork closed 8 months ago

ddkwork commented 8 months ago

test codes

package main

import (
    _ "embed"
    "fmt"
    "goki.dev/colors"
    "goki.dev/gi"
    "goki.dev/giv"
    "goki.dev/icons"
    "goki.dev/ki"
    "goki.dev/states"
    "goki.dev/styles"
    "goki.dev/units"
)

////go:embed Fleet.ico
//var icon []byte

//go:generate goki generate
//go:generate goki build -v -t android/arm64
//go:generate goki build -v -t windows/amd64

func main() {
    b := gi.NewAppBody("debugger")
    //b.App().SetIconBytes(icon)
    //todo add main menu and tooBar
    b.AddAppBar(func(tb *gi.Toolbar) {
        //o := gi.NewButton(tb).SetText("open").SetIcon(icons.FolderOpen)
        //o.On(events.MouseEnter, func(e events.Event) {
        //  println("MouseEnter")
        //  o.Styles.Font.Face.Size += 3 //todo放大字体和刷新
        //  o.ApplyStylePrefs()
        //})
        //o.On(events.MouseLeave, func(e events.Event) {
        //  println("MouseLeave")
        //  o.Styles.Font.Face.Size -= 3
        //  o.ApplyStylePrefs()
        //})

        o := gi.NewButton(tb).SetText("open").SetIcon(icons.FolderOpen)
        o.OnWidgetAdded(func(w gi.Widget) {
            if lb, ok := w.(*gi.Label); ok {
                lb.Style(func(s *styles.Style) {
                    if o.StateIs(states.Hovered) {
                        s.Font.Size = units.Dp(17)
                    } else {
                        s.Font.Size = units.Dp(14)
                    }
                })
            }
        })

        gi.NewButton(tb).SetText("reload").SetIcon(icons.FrameReload)
        gi.NewButton(tb).SetText("stop").SetIcon(icons.StopCircle)
        gi.NewButton(tb).SetText("f7")
        gi.NewButton(tb).SetText("f8")
        gi.NewButton(tb).SetText("f9")
        gi.NewButton(tb).SetText("scylla")
        gi.NewButton(tb).SetText("path")
        gi.NewButton(tb).SetText("calc")
        gi.NewButton(tb).SetText("setting").SetIcon(icons.Settings)
        gi.NewButton(tb).SetText("about")
    })

    tabs := gi.NewTabs(b)
    cpu := tabs.NewTab("cpu") //todo add svg,设计寄存器垂直拆分布局,
    // 反汇编和立即数的垂直拆分布局以及cpu页面的嵌套垂直拆分布局,底部的命令栏和状态栏
    tabs.NewTab("log")
    tabs.NewTab("notes")
    tabs.NewTab("break")
    tabs.NewTab("memory")
    tabs.NewTab("stack")
    tabs.NewTab("seh")
    tabs.NewTab("script")
    tabs.NewTab("symbol")
    tabs.NewTab("source")
    tabs.NewTab("references")
    tabs.NewTab("thread")
    tabs.NewTab("handle")
    tabs.NewTab("trace")

    vSplits := NewVSplits(cpu) //有垂直布局的情况需要先垂直,水平的父级是垂直就合理了
    topSplits := NewHSplits(vSplits)
    downSplits := NewHSplits(vSplits)
    vSplits.SetSplits(.7, .3)

    dismFrame := gi.NewFrame(topSplits)
    dismFrame.Style(func(s *styles.Style) {
        //s.Direction = styles.Row
        s.Background = colors.C(colors.Scheme.SurfaceContainerLow)
    })
    dismTable(dismFrame)

    regFrame := gi.NewFrame(topSplits)
    regFrame.Style(func(s *styles.Style) {
        //s.Direction = styles.Row
        s.Background = colors.C(colors.Scheme.SurfaceContainerLow)
    })
    topSplits.SetSplits(.7, .3)

    hexEditFrame := gi.NewFrame(downSplits)
    hexEditFrame.Style(func(s *styles.Style) {
        //s.Direction = styles.Row
        s.Background = colors.C(colors.Scheme.SurfaceContainerLow)
    })
    stackFrame := gi.NewFrame(downSplits)
    stackTable(stackFrame) //stack
    downSplits.SetSplits(.6, .4)

    c := gi.NewTextField(b).SetPlaceholder("command")
    c.Style(func(s *styles.Style) {
        s.Min.X.Pw(300)
        //s.Max.X.Pw(300)//todo 取屏幕宽度为最大宽度
        //s.Display = styles.Grid
    })

    b.NewWindow().Run().Wait()
}

func NewHSplits(par ki.Ki) *gi.Splits {
    splits := gi.NewSplits(par)
    splits.Style(func(s *styles.Style) {
        s.Direction = styles.Row
        s.Background = colors.C(colors.Scheme.SurfaceContainerLow)
    })
    return splits
}

func NewVSplits(par ki.Ki) *gi.Splits {
    splits := gi.NewSplits(par)
    splits.Style(func(s *styles.Style) {
        s.Direction = styles.Column
        s.Background = colors.C(colors.Scheme.SurfaceContainerLow)
    })
    return splits
}

type Dism struct {
    Icon        string
    Address     int
    Opcode      []byte
    Instruction string
    Comment     string
}

func dismTable(frame *gi.Frame) *giv.TableView {
    tsttable := make([]*Dism, 100)

    for i := range tsttable {
        ts := &Dism{
            Icon:        "",
            Address:     0x00007FF838E51030 + i,
            Opcode:      []byte{1, 2, 3},
            Instruction: "mov qword ptr ss:[rsp+0x18], rsi",
            Comment:     "comment " + fmt.Sprint(i),
        }
        tsttable[i] = ts
    }
    tv := giv.NewTableView(frame, "tv")
    // tv.SetState(true, states.ReadOnly)
    tv.SetSlice(&tsttable)
    return tv
}

type Stack struct {
    Address int
    Data    int
    Context string
}

func stackTable(frame *gi.Frame) *giv.TableView {
    tsttable := make([]*Stack, 100)

    for i := range tsttable {
        ts := &Stack{
            Address: 0x00007FF838E51030 + i,
            Data:    0x00007FF838E51030 + i,
            Context: "返回到 ntdll.RtlGetImageFileMachines+4D9 自 ntdll.RtlAllocateHeap",
        }
        tsttable[i] = ts
    }
    tv := giv.NewTableView(frame, "tv")
    // tv.SetState(true, states.ReadOnly)
    tv.SetSlice(&tsttable)
    return tv
}
ddkwork commented 8 months ago

{4213F201-1BE0-4313-861B-8C93D0BC32A4}

ddkwork commented 8 months ago
GOROOT=C:\Users\Admin\go\pkg\mod\golang.org\toolchain@v0.0.1-go1.21.4.windows-amd64 #gosetup
GOPATH=C:\Users\Admin\go #gosetup
C:\Users\Admin\go\pkg\mod\golang.org\toolchain@v0.0.1-go1.21.4.windows-amd64\bin\go.exe build -o C:\Users\Admin\AppData\Local\JetBrains\GoLand2023.3\tmp\GoLand\___11go_build_github_com_ddkwork_workspace_demo_debugger.exe -gcflags "all=-N -l" github.com/ddkwork/workspace/demo/debugger #gosetup
"C:\Program Files\JetBrains\GoLand 2023.3.2\plugins\go-plugin\lib\dlv\windows\dlv.exe" --listen=127.0.0.1:29604 --headless=true --api-version=2 --check-go-version=false --only-same-user=false exec C:\Users\Admin\AppData\Local\JetBrains\GoLand2023.3\tmp\GoLand\___11go_build_github_com_ddkwork_workspace_demo_debugger.exe --
API server listening at: 127.0.0.1:29604
panic: runtime error: invalid memory address or nil pointer dereference

----- START OF STACK TRACE: -----
goroutine 23 [running]:
runtime/debug.Stack()
        C:/Users/Admin/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.21.4.windows-amd64/src/runtime/debug/stack.go:24 +0x6b
goki.dev/goosi.HandleRecoverBase({0x7ff635e86340, 0x7ff635da8a40})
        D:/workspace/workspace/goki/goosi/recover.go:50 +0x3c
goki.dev/goosi.glob..func1({0x7ff635e86340, 0x7ff635da8a40})
        D:/workspace/workspace/goki/goosi/recover.go:33 +0x1d
goki.dev/gi.(*RenderWin).EventLoop.func1()
        D:/workspace/workspace/goki/gi/renderwin.go:567 +0x2e
panic({0x7ff635e86340?, 0x7ff635da8a40?})
        C:/Users/Admin/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.21.4.windows-amd64/src/runtime/panic.go:920 +0x290
goki.dev/gi.(*Layout).PositionScroll(0xc00062b600, 0x1)
        D:/workspace/workspace/goki/gi/scroll.go:139 +0x1bd
goki.dev/gi.(*Layout).PositionScrolls(0xc00062b600)
        D:/workspace/workspace/goki/gi/scroll.go:130 +0x5a
goki.dev/gi.(*Layout).ScenePosLay(0xc00062b600)
        D:/workspace/workspace/goki/gi/layimpl.go:1851 +0xbb
goki.dev/gi.(*Layout).ScenePos(0xc00062b600)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosParts(0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1813 +0x35
goki.dev/gi.(*WidgetBase).SetBBoxes(0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1806 +0xa48
goki.dev/gi.(*WidgetBase).ScenePosWidget(0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1749 +0x25
goki.dev/gi.(*Layout).ScenePosLay(0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1849 +0xa7
goki.dev/gi.(*Layout).ScenePos(0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x1, {0x260e5063240, 0xc000247200}, 0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc000246000, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc000246000)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc000246000)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc000246000)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc000246000)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x0, {0x260e5063240, 0xc000246000}, 0xc000246000)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc0003f6900, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc0003f6900)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc0003f6900)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc0003f6900)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc0003f6900)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x0, {0x7ff6365560d0, 0xc0003f6900}, 0xc0003f6900)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc0003f6000, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc0003f6000)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc0003f6000)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc0003f6000)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc0003f6000)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x1, {0x7ff6365560d0, 0xc0003f6000}, 0xc0003f6000)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc000396d00, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc000396d00)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc000396d00)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc000396d00)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc000396d00)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x0, {0x7ff636555aa0, 0xc000396d00}, 0xc000396d00)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc000395200, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc000395200)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc000395200)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc000395200)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc000395200)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x1, {0x260e4efb070, 0xc000395200}, 0xc000395200)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc000398000, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc000398000)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc000398000)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc000398000)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc000398000)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*Scene).LayoutScene(0xc000398000)
        D:/workspace/workspace/goki/gi/render.go:384 +0x625
goki.dev/gi.(*Scene).LayoutRenderScene(0xc000398000)
        D:/workspace/workspace/goki/gi/render.go:390 +0x18
goki.dev/gi.(*Scene).DoUpdate(0xc000398000)
        D:/workspace/workspace/goki/gi/render.go:452 +0x4c5
goki.dev/gi.(*Stage).DoUpdate(0xc000379680)
        D:/workspace/workspace/goki/gi/stage.go:330 +0xbe
goki.dev/gi.(*StageMgr).UpdateAll(0xc00069e578)
        D:/workspace/workspace/goki/gi/stagemgr.go:238 +0x1d7
goki.dev/gi.(*RenderWin).RenderWindow(0xc00069e540)
        D:/workspace/workspace/goki/gi/renderwin.go:964 +0xca
goki.dev/gi.(*RenderWin).HandleWindowEvents(0xc00069e540, {0x7ff63653e818, 0xc00075e2a0})
        D:/workspace/workspace/goki/gi/renderwin.go:623 +0x7f2
goki.dev/gi.(*RenderWin).HandleEvent(0xc00069e540, {0x7ff63653e818, 0xc00075e2a0})
        D:/workspace/workspace/goki/gi/renderwin.go:608 +0x1cc
goki.dev/gi.(*RenderWin).EventLoop(0xc00069e540)
        D:/workspace/workspace/goki/gi/renderwin.go:579 +0x314
created by goki.dev/gi.(*RenderWin).GoStartEventLoop in goroutine 1
        D:/workspace/workspace/goki/gi/renderwin.go:535 +0xe6

----- END OF STACK TRACE -----
2024/01/11 22:57:52 INFO SAVED CRASH LOG TO C:\Users\Admin\AppData\Roaming\Goki\crash-logs\debugger\crash_2024-01-11_22-57-52
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
        panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x7ff6358f655d]

goroutine 23 [running]:
goki.dev/goosi.HandleRecoverPanic({0x7ff635e86340, 0x7ff635da8a40})
        D:/workspace/workspace/goki/goosi/recover.go:85 +0xab
goki.dev/goosi.glob..func1({0x7ff635e86340, 0x7ff635da8a40})
        D:/workspace/workspace/goki/goosi/recover.go:34 +0x2c
goki.dev/gi.(*RenderWin).EventLoop.func1()
        D:/workspace/workspace/goki/gi/renderwin.go:567 +0x2e
panic({0x7ff635e86340?, 0x7ff635da8a40?})
        C:/Users/Admin/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.21.4.windows-amd64/src/runtime/panic.go:920 +0x290
goki.dev/gi.(*Layout).PositionScroll(0xc00062b600, 0x1)
        D:/workspace/workspace/goki/gi/scroll.go:139 +0x1bd
goki.dev/gi.(*Layout).PositionScrolls(0xc00062b600)
        D:/workspace/workspace/goki/gi/scroll.go:130 +0x5a
goki.dev/gi.(*Layout).ScenePosLay(0xc00062b600)
        D:/workspace/workspace/goki/gi/layimpl.go:1851 +0xbb
goki.dev/gi.(*Layout).ScenePos(0xc00062b600)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosParts(0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1813 +0x35
goki.dev/gi.(*WidgetBase).SetBBoxes(0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1806 +0xa48
goki.dev/gi.(*WidgetBase).ScenePosWidget(0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1749 +0x25
goki.dev/gi.(*Layout).ScenePosLay(0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1849 +0xa7
goki.dev/gi.(*Layout).ScenePos(0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x1, {0x260e5063240, 0xc000247200}, 0xc000247200)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc000246000, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc000246000)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc000246000)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc000246000)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc000246000)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x0, {0x260e5063240, 0xc000246000}, 0xc000246000)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc0003f6900, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc0003f6900)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc0003f6900)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc0003f6900)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc0003f6900)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x0, {0x7ff6365560d0, 0xc0003f6900}, 0xc0003f6900)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc0003f6000, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc0003f6000)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc0003f6000)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc0003f6000)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc0003f6000)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x1, {0x7ff6365560d0, 0xc0003f6000}, 0xc0003f6000)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc000396d00, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc000396d00)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc000396d00)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc000396d00)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc000396d00)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x0, {0x7ff636555aa0, 0xc000396d00}, 0xc000396d00)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc000395200, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc000395200)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc000395200)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc000395200)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc000395200)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*WidgetBase).ScenePosChildren.func1(0x1, {0x260e4efb070, 0xc000395200}, 0xc000395200)
        D:/workspace/workspace/goki/gi/layimpl.go:1819 +0x3c
goki.dev/gi.(*WidgetBase).VisibleKidsIter(0xc000398000, 0x7ff6364afa50)
        D:/workspace/workspace/goki/gi/widget.go:508 +0x209
goki.dev/gi.(*WidgetBase).ScenePosChildren(0xc000398000)
        D:/workspace/workspace/goki/gi/layimpl.go:1818 +0x1f
goki.dev/gi.(*Layout).ScenePosChildren(0xc000398000)
        D:/workspace/workspace/goki/gi/layimpl.go:1833 +0x92
goki.dev/gi.(*Layout).ScenePosLay(0xc000398000)
        D:/workspace/workspace/goki/gi/layimpl.go:1850 +0xb1
goki.dev/gi.(*Layout).ScenePos(0xc000398000)
        D:/workspace/workspace/goki/gi/layimpl.go:1840 +0x18
goki.dev/gi.(*Scene).LayoutScene(0xc000398000)
        D:/workspace/workspace/goki/gi/render.go:384 +0x625
goki.dev/gi.(*Scene).LayoutRenderScene(0xc000398000)
        D:/workspace/workspace/goki/gi/render.go:390 +0x18
goki.dev/gi.(*Scene).DoUpdate(0xc000398000)
        D:/workspace/workspace/goki/gi/render.go:452 +0x4c5
goki.dev/gi.(*Stage).DoUpdate(0xc000379680)
        D:/workspace/workspace/goki/gi/stage.go:330 +0xbe
goki.dev/gi.(*StageMgr).UpdateAll(0xc00069e578)
        D:/workspace/workspace/goki/gi/stagemgr.go:238 +0x1d7
goki.dev/gi.(*RenderWin).RenderWindow(0xc00069e540)
        D:/workspace/workspace/goki/gi/renderwin.go:964 +0xca
goki.dev/gi.(*RenderWin).HandleWindowEvents(0xc00069e540, {0x7ff63653e818, 0xc00075e2a0})
        D:/workspace/workspace/goki/gi/renderwin.go:623 +0x7f2
goki.dev/gi.(*RenderWin).HandleEvent(0xc00069e540, {0x7ff63653e818, 0xc00075e2a0})
        D:/workspace/workspace/goki/gi/renderwin.go:608 +0x1cc
goki.dev/gi.(*RenderWin).EventLoop(0xc00069e540)
        D:/workspace/workspace/goki/gi/renderwin.go:579 +0x314
created by goki.dev/gi.(*RenderWin).GoStartEventLoop in goroutine 1
        D:/workspace/workspace/goki/gi/renderwin.go:535 +0xe6

Debugger finished with the exit code 0
rcoreilly commented 8 months ago

Thanks!

rcoreilly commented 8 months ago

ps. I just pushed an update with the nil check everywhere else too just in case, and moved up to parent call for consistency.