From a817e5fa21550d00d722c8bf6d9c1dda83646061 Mon Sep 17 00:00:00 2001 From: mappu Date: Sun, 23 Jun 2024 15:12:26 +1200 Subject: [PATCH] main: recursively load all nav state at connection time --- main.go | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 04364ac..f06e038 100644 --- a/main.go +++ b/main.go @@ -311,31 +311,41 @@ func (f *TMainForm) OnNavExpanding(sender vcl.IObject, node *vcl.TTreeNode, allo ndata := (*navData)(node.Data()) - if ndata.childrenLoaded { + err := f.NavLoadChildren(node, ndata) + if err != nil { + vcl.ShowMessage(err.Error()) + *allowExpansion = false // Permanently block return } + *allowExpansion = node.HasChildren() +} + +func (f *TMainForm) NavLoadChildren(node *vcl.TTreeNode, ndata *navData) error { + + if ndata.childrenLoaded { + return nil // Nothing to do + } + // Find the child buckets from this point under the element nextBucketNames, err := ndata.ld.NavChildren(ndata) if err != nil { - vcl.ShowMessage(fmt.Sprintf("Failed to find child buckets under %q: %s", strings.Join(ndata.bucketPath, `/`), err.Error())) - *allowExpansion = false - return + return fmt.Errorf("Failed to find child buckets under %q: %w", strings.Join(ndata.bucketPath, `/`), err) } ndata.childrenLoaded = true // don't repeat this work if len(nextBucketNames) == 0 { node.SetHasChildren(false) - *allowExpansion = false } else { + node.SetHasChildren(true) // Populate LCL child nodes for _, bucketName := range nextBucketNames { node := f.Buckets.Items().AddChild(node, formatUtf8([]byte(bucketName))) - node.SetHasChildren(true) // dynamically populate in OnNavExpanding + // node.SetHasChildren(true) // dynamically populate in OnNavExpanding node.SetImageIndex(imgTable) node.SetSelectedIndex(imgTable) navData := &navData{ @@ -348,8 +358,11 @@ func (f *TMainForm) OnNavExpanding(sender vcl.IObject, node *vcl.TTreeNode, allo node.SetData(unsafe.Pointer(navData)) ndata.ld.Keepalive(navData) - } - *allowExpansion = true + // Recurse to see if it has any children of its own + f.NavLoadChildren(node, ndata) + } } + + return nil }