package gui // old debugging things. probably deprecate // everything should be moved to "go.wit.com/gui/debugger" // A function dump out the binary tree import ( "errors" "strconv" "go.wit.com/log" "go.wit.com/widget" ) // for printing out the binary tree var listChildrenParent *Node var listChildrenDepth int = 0 var defaultPadding = " " func (n *Node) Dump() { b := true Indent(b, "NODE DUMP START") Indent(b, "id = ", n.id) Indent(b, "progname = ", n.progname) Indent(b, "(X,Y) = ", n.X, n.Y) Indent(b, "Next (W,H) = ", n.NextW, n.NextH) if n.parent == nil { Indent(b, "parent = nil") } else { Indent(b, "parent.id =", n.parent.id) } if n.children != nil { Indent(b, "children = ", n.children) } if n.Custom != nil { Indent(b, "Custom = ", n.Custom) } Indent(b, "NODE DUMP END") n.changed = true sendAction(n, widget.Dump) } func Indent(b bool, a ...interface{}) { logindent(b, listChildrenDepth, defaultPadding, a...) } func (n *Node) dumpWidget(b bool) string { var info, d string if n == nil { log.Error(errors.New("dumpWidget() node == nil")) return "" } info = n.WidgetType.String() var tabs string for i := 0; i < listChildrenDepth; i++ { tabs = tabs + defaultPadding } d = strconv.Itoa(n.id) + " " + info + " " + n.GetProgName() logindent(b, listChildrenDepth, defaultPadding, d) if b { switch n.WidgetType { case widget.Combobox: logindent(b, listChildrenDepth, defaultPadding, " Dropdown", n.value) logindent(b, listChildrenDepth, defaultPadding, " Dropdown", n.strings) case widget.Dropdown: logindent(b, listChildrenDepth, defaultPadding, " Dropdown", n.value) logindent(b, listChildrenDepth, defaultPadding, " Dropdown", n.strings) case widget.Grid: logindent(b, listChildrenDepth, defaultPadding, " GridSize =", n.X, n.Y) case widget.Box: logindent(b, listChildrenDepth, defaultPadding, " Direction =", n.direction) default: } } return tabs + d } func (n *Node) Children() []*Node { return n.children } // func (n *Node) ListChildren(dump bool, dropdown *Node, mapNodes map[string]*Node) { func (n *Node) ListChildren(dump bool) { if n == nil { return } n.dumpWidget(dump) if len(n.children) == 0 { if n.parent == nil { return } log.Log(NODE, "\t\t\tparent =", n.parent.id) if listChildrenParent != nil { log.Log(NODE, "\t\t\tlistChildrenParent =", listChildrenParent.id) if listChildrenParent.id != n.parent.id { log.Log(INFO, "parent =", n.parent.id, n.parent.progname) log.Log(INFO, "listChildrenParent =", listChildrenParent.id, listChildrenParent.progname) log.Log(INFO, listChildrenParent.id, "!=", n.parent.id) log.Exit("parent.child does not match child.parent") } } log.Log(NODE, "\t\t", n.id, "has no children") return } for _, child := range n.children { if child.parent != nil { log.Log(NODE, "\t\t\tparent =", child.parent.id) } else { log.Log(GUI, "\t\t\tno parent") // memory corruption? non-threadsafe access? // can all binary tree changes to Node.parent & Node.child be forced into a singular goroutine? panic("something is wrong with the wit golang gui logic and the binary tree is broken. child has no parent") } if child.children == nil { log.Log(NODE, "\t\t", child.id, "has no children") } else { log.Log(NODE, "\t\t\tHas children:", child.children) } listChildrenParent = n listChildrenDepth += 1 // child.ListChildren(dump, dropdown, mapNodes) child.ListChildren(dump) listChildrenDepth -= 1 } return } // b bool, print if true func logindent(b bool, depth int, format string, a ...any) { var tabs string for i := 0; i < depth; i++ { tabs = tabs + format } // newFormat := tabs + strconv.Itoa(depth) + " " + format newFormat := tabs + format // array prepend(). Why isn't this a standard function. It should be: // a.prepend(debugGui, newFormat) a = append([]any{b, newFormat}, a...) log.Log(NOW, a...) }