summaryrefslogtreecommitdiff
path: root/new-structs.go
diff options
context:
space:
mode:
Diffstat (limited to 'new-structs.go')
-rw-r--r--new-structs.go318
1 files changed, 318 insertions, 0 deletions
diff --git a/new-structs.go b/new-structs.go
new file mode 100644
index 0000000..f806696
--- /dev/null
+++ b/new-structs.go
@@ -0,0 +1,318 @@
+package gui
+
+import (
+ "log"
+ "fmt"
+ "image/color"
+// "reflect"
+
+ // "github.com/davecgh/go-spew/spew"
+
+ "github.com/andlabs/ui"
+ _ "github.com/andlabs/ui/winmanifest"
+)
+
+type Element int
+
+// https://ieftimov.com/post/golang-datastructures-trees/
+const (
+ Unknown Element = iota
+ Window
+ Tab
+ Box
+ Label
+ Combo
+)
+
+func (s Element) String() string {
+ switch s {
+ case Window:
+ return "window"
+ case Tab:
+ return "tab"
+ case Box:
+ return "box"
+ case Label:
+ return "label"
+ case Combo:
+ return "combo"
+ }
+ return "unknown"
+}
+
+type Node struct {
+ id string
+ Name string
+ Width int
+ Height int
+ OnChanged func ()
+ Color color.RGBA
+
+ parent *Node
+ children []*Node
+
+ area *GuiArea
+ custom func(*Node)
+ values interface {}
+
+ uiControl *ui.Control
+ uiButton *ui.Button
+ uiFontButton *ui.FontButton
+ uiColorButton *ui.ColorButton
+ uiWindow *ui.Window
+ uiAttrstr *ui.AttributedString
+ uiTab *ui.Tab
+ uiBox *ui.Box
+ uiArea *ui.Area
+ uiText *ui.EditableCombobox
+ uiMultilineEntry *ui.MultilineEntry
+ uiGroup *ui.Group
+ uiGrid *ui.Grid
+}
+
+func (n *Node) Parent() *Node {
+ return n.parent
+}
+
+func (n *Node) Window() *Node {
+ return n.parent
+}
+
+func (n *Node) Dump() {
+ log.Println("gui.Node.Dump() id = ", n.id)
+ log.Println("gui.Node.Dump() Name = ", n.Name)
+ log.Println("gui.Node.Dump() Width = ", n.Width)
+ log.Println("gui.Node.Dump() Height = ", n.Height)
+ log.Println("gui.Node.Dump() OnChanged = ", n.OnChanged)
+
+ if (n.parent == nil) {
+ log.Println("gui.Node.Dump() parent = nil")
+ } else {
+ log.Println("gui.Node.Dump() parent = ", n.parent.id)
+ }
+ log.Println("gui.Node.Dump() children = ", n.children)
+
+ // log.Println("gui.Node.Dump() window = ", n.window)
+ // log.Println("gui.Node.Dump() box = ", n.box)
+
+ log.Println("gui.Node.Dump() uiWindow = ", n.uiWindow)
+ log.Println("gui.Node.Dump() uiTab = ", n.uiTab)
+ log.Println("gui.Node.Dump() uiBox = ", n.uiBox)
+ log.Println("gui.Node.Dump() uiControl = ", n.uiControl)
+ log.Println("gui.Node.Dump() uiButton = ", n.uiButton)
+ log.Println("gui.Node.Dump() uiText = ", n.uiText)
+ if (n.id == "") {
+ log.Println("THIS SHOULD NOT HAPPEN: gui.Node.Dump() id == nil")
+ }
+}
+
+func (n *Node) SetName(name string) {
+ // n.uiType.SetName(name)
+ if (n.uiWindow != nil) {
+ log.Println("node is a window. setting title =", name)
+ n.uiWindow.SetTitle(name)
+ return
+ }
+ log.Println("*ui.Control =", n.uiControl)
+ return
+}
+
+func (n *Node) Append(child *Node) {
+ // if (n.UiBox == nil) {
+ // return
+ // }
+ n.children = append(n.children, child)
+ if (Config.Debug) {
+ log.Println("child node:")
+ child.Dump()
+ log.Println("parent node:")
+ n.Dump()
+ }
+ // time.Sleep(3 * time.Second)
+}
+
+func (n *Node) List() {
+ findByIdDFS(n, "test")
+}
+
+var listChildrenParent *Node
+var listChildrenDepth int = 0
+
+// var indent string = "\t"
+var indent string = " "
+
+func indentPrintln(depth int, format string, a ...interface{}) {
+ var space string
+ for i := 0; i < depth; i++ {
+ space = space + indent
+ }
+
+ // newFormat := tabs + strconv.Itoa(depth) + " " + format
+ newFormat := space + format
+ log.Println(newFormat, a)
+}
+
+func (n *Node) ListChildren(dump bool) {
+ indentPrintln(listChildrenDepth, "", n.id, n.Width, n.Height, n.Name)
+
+ if (dump == true) {
+ n.Dump()
+ }
+ if len(n.children) == 0 {
+ if (n.parent == nil) {
+ } else {
+ if (Config.DebugNode) {
+ log.Println("\t\t\tparent =",n.parent.id)
+ }
+ if (listChildrenParent != nil) {
+ if (Config.DebugNode) {
+ log.Println("\t\t\tlistChildrenParent =",listChildrenParent.id)
+ }
+ if (listChildrenParent.id != n.parent.id) {
+ log.Println("parent.child does not match child.parent")
+ panic("parent.child does not match child.parent")
+ }
+ }
+ }
+ if (Config.DebugNode) {
+ log.Println("\t\t", n.id, "has no children")
+ }
+ return
+ }
+ for _, child := range n.children {
+ // log.Println("\t\t", child.id, child.Width, child.Height, child.Name)
+ if (child.parent != nil) {
+ if (Config.DebugNode) {
+ log.Println("\t\t\tparent =",child.parent.id)
+ }
+ } else {
+ log.Println("\t\t\tno parent")
+ panic("no parent")
+ }
+ if (dump == true) {
+ child.Dump()
+ }
+ if (Config.DebugNode) {
+ if (child.children == nil) {
+ log.Println("\t\t", child.id, "has no children")
+ } else {
+ log.Println("\t\t\tHas children:", child.children)
+ }
+ }
+ listChildrenParent = n
+ listChildrenDepth += 1
+ child.ListChildren(dump)
+ listChildrenDepth -= 1
+ }
+ return
+}
+
+// The parent Node needs to be the raw Window
+// The 'stuff' Node needs to be the contents of the tab
+//
+// This function should make a new node with the parent and
+// the 'stuff' Node as a child
+func (n *Node) AddTabNode(title string) *Node {
+ var newNode *Node
+ parent := n
+
+ newNode = parent.makeNode(title, 444, 400 + Config.counter)
+ newNode.uiTab = parent.uiTab
+ // newNode.box = b
+
+ if (Config.DebugNode) {
+ fmt.Println("")
+ log.Println("parent:")
+ parent.Dump()
+
+ fmt.Println("")
+ log.Println("newNode:")
+ newNode.Dump()
+ }
+
+ if (newNode.uiTab != nil) {
+ log.Println("ERROR: wit/gui/ AddTabNode() Something went wrong tab == nil")
+ // TODO: try to find the tab or window and make them if need be
+ // newNode.uiTab.Append(title, b.UiBox)
+ }
+
+ return newNode
+}
+
+func (n *Node) AddHorizontalBreak() *Node {
+ log.Println("AddHorizontalBreak added to node =", n.Name)
+ if (n.uiBox != nil) {
+ tmp := ui.NewHorizontalSeparator()
+ n.uiBox.Append(tmp, Config.Stretchy)
+ } else {
+ n.Dump()
+ return nil
+ }
+ return n
+}
+
+func (n *Node) AddVerticalBreak() *Node {
+ log.Println("AddVerticalBreak added to node =", n.Name)
+ if (n.uiBox != nil) {
+ tmp := ui.NewVerticalSeparator()
+ n.uiBox.Append(tmp, Config.Stretchy)
+ } else {
+ n.Dump()
+ return nil
+ }
+ return n
+}
+
+func (n *Node) AddHorizontalBox(title string) *Node {
+ hbox := ui.NewHorizontalBox()
+ hbox.SetPadded(true)
+ if (n.uiBox != nil) {
+ log.Println("add new hbox to uiBox =", n.uiBox)
+ n.uiBox.Append(hbox, Config.Stretchy)
+ newNode := n.makeNode(title, 333, 333 + Config.counter)
+ newNode.parent = n
+ newNode.uiBox = hbox
+ // newNode.uiControl = hbox
+ return newNode
+ }
+ if (n.uiTab != nil) {
+ log.Println("add new hbox to uiTab =", n.uiTab)
+ n.uiTab.Append(title, hbox)
+ newNode := n.makeNode(title, 333, 333 + Config.counter)
+ newNode.parent = n
+ newNode.uiBox = hbox
+ // newNode.uiControl = hbox
+ return newNode
+ }
+ return n
+}
+func (n *Node) AddTab(title string, uiC *ui.Box) *Node {
+ parent := n
+ log.Println("gui.Node.AddTab() START name =", title)
+ if parent.uiWindow == nil {
+ parent.Dump()
+ log.Println("gui.Node.AddTab() ERROR ui.Window == nil")
+ return nil
+ }
+ if parent.uiTab == nil {
+ inittab := ui.NewTab() // no, not that 'inittab'
+ parent.uiWindow.SetChild(inittab)
+ parent.uiWindow.SetMargined(true)
+ parent.uiTab = inittab
+ }
+ tab := parent.uiTab
+ parent.uiWindow.SetMargined(true)
+
+ if (uiC == nil) {
+ hbox := ui.NewHorizontalBox()
+ hbox.SetPadded(true)
+ uiC = hbox
+ }
+ tab.Append(title, uiC)
+
+ newNode := parent.makeNode(title, 555, 600 + Config.counter)
+ newNode.uiTab = tab
+ newNode.uiBox = uiC
+ tabSetMargined(newNode.uiTab)
+ return newNode
+}