diff options
Diffstat (limited to 'andlabs')
| -rw-r--r-- | andlabs/action.go | 146 | ||||
| -rw-r--r-- | andlabs/add.go | 58 | ||||
| -rw-r--r-- | andlabs/addText.go | 34 | ||||
| -rw-r--r-- | andlabs/box.go | 15 | ||||
| -rw-r--r-- | andlabs/button.go | 19 | ||||
| -rw-r--r-- | andlabs/checkbox.go | 15 | ||||
| -rw-r--r-- | andlabs/combobox.go | 54 | ||||
| -rw-r--r--[l---------] | andlabs/common.go | 62 | ||||
| -rw-r--r-- | andlabs/debug.go | 4 | ||||
| -rw-r--r-- | andlabs/dropdown.go | 72 | ||||
| -rw-r--r-- | andlabs/grid.go | 10 | ||||
| -rw-r--r-- | andlabs/group.go | 12 | ||||
| -rw-r--r-- | andlabs/image.go | 2 | ||||
| -rw-r--r-- | andlabs/label.go | 11 | ||||
| -rw-r--r-- | andlabs/main.go | 49 | ||||
| -rw-r--r-- | andlabs/place.go | 87 | ||||
| -rw-r--r-- | andlabs/setText.go | 43 | ||||
| -rw-r--r-- | andlabs/slider.go | 19 | ||||
| -rw-r--r-- | andlabs/spinner.go | 15 | ||||
| -rw-r--r-- | andlabs/structs.go | 12 | ||||
| -rw-r--r-- | andlabs/textbox.go | 19 | ||||
| -rw-r--r-- | andlabs/tree.go | 31 | ||||
| -rw-r--r-- | andlabs/widget.go | 6 | ||||
| -rw-r--r-- | andlabs/window.go | 12 |
24 files changed, 529 insertions, 278 deletions
diff --git a/andlabs/action.go b/andlabs/action.go index b1046ba..28c78d5 100644 --- a/andlabs/action.go +++ b/andlabs/action.go @@ -1,47 +1,99 @@ package main import ( - "strconv" - "go.wit.com/dev/andlabs/ui" + "errors" "go.wit.com/log" "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" ) +// this will check to make sure that the node +// is valid for making a New TK andlabs widget +// Basically, it makes sure there is a parent ID +// and that there already a widget created +func notNew(n *tree.Node) bool { + if n == nil { + log.Warn("ready() n = nil") + return true + } + if n.TK != nil { + log.Warn("ready() n.TK = nil", n.WidgetId, n.GetProgName()) + return true + } + if n.Parent == nil { + log.Warn("ready() n.Parent = nil", n.WidgetId, n.GetProgName()) + return true + } + if n.Parent.TK == nil { + log.Warn("ready() n.Parent.TK = nil", n.WidgetId, n.GetProgName()) + log.Warn("ready() n.Parent.TK = nil", n.Parent.WidgetId, n.Parent.GetProgName()) + return true + } + // this means you can add a new widgets + return false +} + +func ready(n *tree.Node) bool { + if n == nil { + log.Warn("ready() n = nil") + return false + } + if n.TK == nil { + log.Warn("ready() n.TK = nil", n.WidgetId, n.GetProgName()) + return false + } + if n.Parent == nil { + log.Warn("ready() n.Parent = nil", n.WidgetId, n.GetProgName()) + return false + } + if n.Parent.TK == nil { + log.Warn("ready() n.Parent.TK = nil", n.WidgetId, n.GetProgName()) + log.Warn("ready() n.Parent.TK = nil", n.Parent.WidgetId, n.Parent.GetProgName()) + return false + } + return true +} func (n *node) ready() bool { if n == nil { return false } if n.tk == nil { return false } return true } -func (n *node) show(b bool) { - if n.tk == nil { +func show(n *tree.Node, b bool) { + var tk *guiWidget + tk = n.TK.(*guiWidget) + // tk = getTK(n) + + if tk == nil { return } - if n.tk.uiControl == nil { + if tk.uiControl == nil { return } if (b) { - n.tk.uiControl.Show() + tk.uiControl.Show() } else { - n.tk.uiControl.Hide() + tk.uiControl.Hide() } } -func (n *node) enable(b bool) { +func enable(n *tree.Node, b bool) { + var tk *guiWidget + tk = n.TK.(*guiWidget) if n == nil { panic("WHAT? enable was passed nil. How does this even happen?") } - if n.tk == nil { + if tk == nil { return } - if n.tk.uiControl == nil { + if tk.uiControl == nil { return } if (b) { - n.tk.uiControl.Enable() + tk.uiControl.Enable() } else { - n.tk.uiControl.Disable() + tk.uiControl.Disable() } } @@ -152,73 +204,88 @@ func (n *node) Delete() { func rawAction(a *widget.Action) { log.Log(INFO, "rawAction() START a.ActionType =", a.ActionType, "a.Value", a.Value) - if (a.ActionType == widget.InitToolkit) { - // TODO: make sure to only do this once - // go uiMain.Do(func() { - // ui.Main(demoUI) - // go catchActionChannel() - // }) - // try doing this on toolkit load in init() + if (a.ActionType == widget.ToolkitInit) { + Init() + return + } + switch a.WidgetType { + case widget.Root: + me.treeRoot = me.myTree.AddNode(a) + log.Log(INFO, "doAction() found treeRoot") return } - log.Log(INFO, "rawAction() START a.WidgetId =", a.WidgetId, "a.ParentId =", a.ParentId) + log.Warn("andlabs rawAction() START a.WidgetId =", a.WidgetId, "a.ParentId =", a.ParentId, a.ActionType) switch a.WidgetType { case widget.Flag: log.Log(ERROR, "rawAction() RE-IMPLEMENT LOG FLAGS") return } - n := me.rootNode.findWidgetId(a.WidgetId) + if me.treeRoot == nil { + panic("me.treeRoot == nil") + } + + n := me.treeRoot.FindWidgetId(a.WidgetId) if (a.ActionType == widget.Add) { - ui.QueueMain(func() { + me.treeRoot.ListWidgets() + // ui.QueueMain(func() { add(a) - }) + // }) // TODO: remove this artificial delay // sleep(.001) return } if (a.ActionType == widget.Dump) { - log.Log(NOW, "rawAction() Dump =", a.ActionType, a.WidgetType, n.progname) - me.rootNode.listChildren(true) + log.Log(NOW, "rawAction() Dump =", a.ActionType, a.WidgetType, n.State.ProgName) + // me.rootNode.listChildren(true) return } if (n == nil) { - me.rootNode.listChildren(true) - log.Log(NOW, "rawAction() ERROR findWidgetId found nil", a.ActionType, a.WidgetType) + log.Error(errors.New("andlabs rawAction() ERROR findWidgetId found nil"), a.ActionType, a.WidgetType) log.Log(NOW, "rawAction() ERROR findWidgetId found nil for id =", a.WidgetId) log.Log(NOW, "rawAction() ERROR findWidgetId found nil", a.ActionType, a.WidgetType) log.Log(NOW, "rawAction() ERROR findWidgetId found nil for id =", a.WidgetId) + me.treeRoot.ListWidgets() return - panic("findWidgetId found nil for id = " + strconv.Itoa(a.WidgetId)) + panic("findWidgetId found nil for id = " + string(a.WidgetId)) } switch a.ActionType { case widget.Show: - n.show(true) + show(n, true) + // n.show(true) case widget.Hide: - n.show(false) + show(n, false) + //n.show(false) case widget.Enable: - n.enable(true) + enable(n, true) + // n.enable(true) case widget.Disable: - log.Warn("andlabs got disable for", n.WidgetId, n.progname) - n.enable(false) + log.Warn("andlabs got disable for", n.WidgetId, n.State.ProgName) + enable(n, false) + // n.enable(false) case widget.Get: - n.setText(a) + // n.setText(a) + setText(n, a) case widget.GetText: switch a.WidgetType { case widget.Textbox: - a.Value = n.value + a.Value = n.State.Value } case widget.Set: - n.setText(a) + setText(n, a) + // n.setText(a) case widget.SetText: - n.setText(a) + setText(n, a) + // n.setText(a) case widget.AddText: - n.addText(a) + addText(n, a) + // n.addText(a) + /* case widget.Margin: n.pad(true) case widget.Unmargin: @@ -231,8 +298,7 @@ func rawAction(a *widget.Action) { n.Delete() case widget.Move: log.Log(NOW, "rawAction() attempt to move() =", a.ActionType, a.WidgetType) - newParent := me.rootNode.findWidgetId(a.ParentId) - n.move(newParent) + */ default: log.Log(ERROR, "rawAction() Unknown =", a.ActionType, a.WidgetType) } diff --git a/andlabs/add.go b/andlabs/add.go index ffe2cc4..a47d697 100644 --- a/andlabs/add.go +++ b/andlabs/add.go @@ -6,57 +6,67 @@ import ( ) func add(a *widget.Action) { + log.Warn("andlabs add()", a.WidgetId, a.State.ProgName) if (a.WidgetType == widget.Root) { - me.rootNode = addNode(a) + if me.treeRoot == nil { + me.treeRoot = me.myTree.AddNode(a) + } return } - n := addNode(a) + // n := addNode(a) + n := me.myTree.AddNode(a) - p := n.parent + p := n.Parent switch n.WidgetType { case widget.Window: - newWindow(n) + log.Warn("SPEEDY Add window", n.WidgetId, n.GetProgName()) + newWindow(p, n) return + case widget.Group: + log.Warn("SPEEDY Add Group", n.WidgetId, n.GetProgName()) + newGroup(p, n) + return + case widget.Grid: + newGrid(n) + return + case widget.Box: + newBox(n) + return + /* case widget.Tab: - p.newTab(n) + newTab(n) return + */ case widget.Label: - p.newLabel(n) + newLabel(p, n) return case widget.Button: - p.newButton(n) - return - case widget.Grid: - p.newGrid(n) + newButton(p, n) return case widget.Checkbox: - p.newCheckbox(n) + newCheckbox(p, n) return case widget.Spinner: - p.newSpinner(n) + newSpinner(p, n) return case widget.Slider: - p.newSlider(n) + newSlider(p, n) return case widget.Dropdown: - p.newDropdown(n) + newDropdown(p, n) return case widget.Combobox: - p.newCombobox(n) + newCombobox(p, n) return case widget.Textbox: - p.newTextbox(n) - return - case widget.Group: - p.newGroup(n) - return - case widget.Box: - p.newBox(n) + newTextbox(p, n) return + /* case widget.Image: - p.newImage(n) + newImage(p, n) return + */ default: - log.Log(ERROR, "add() error TODO: ", n.WidgetType, n.progname) + log.Log(ERROR, "add() error TODO: ", n.WidgetType, n.State.ProgName) } } diff --git a/andlabs/addText.go b/andlabs/addText.go index cbc9269..d335be2 100644 --- a/andlabs/addText.go +++ b/andlabs/addText.go @@ -3,22 +3,40 @@ package main import ( "go.wit.com/log" "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" ) -func (n *node) addText(a *widget.Action) { - log.Log(CHANGE, "addText() START with a.Value =", a.Value) - t := n.tk - if (t == nil) { - log.Log(ERROR, "addText error. tk == nil", n.progname, n.WidgetId) +func compareStrings(n *tree.Node, ss []string) { +} + +// func (n *node) addText(a *widget.Action) { +func addText(n *tree.Node, a *widget.Action) { + var tk *guiWidget + tk = n.TK.(*guiWidget) + log.Warn("andlabs addText() START with a.Value =", a.Value) + if (tk == nil) { + log.Log(ERROR, "addText error. tk == nil", n.State.ProgName, n.WidgetId) return } - log.Log(CHANGE, "addText() Attempt on", n.WidgetType, "with", a.Value) + log.Warn("andlabs addText() Attempt on", n.WidgetType, "with", a.Value) switch n.WidgetType { case widget.Dropdown: - n.addDropdownName(widget.GetString(a.Value)) + for i, s := range a.State.Strings { + log.Warn("andlabs a.State.Strings =", i, s) + _, ok := n.Strings[s] + // If the key exists + if ok { + log.Warn("andlabs a.State.Strings is here", i, s) + } else { + log.Warn("andlabs is not here", i, s) + addDropdownName(n, s) + // TODO: make numbers + n.Strings[s] = 21 + } + } case widget.Combobox: - n.addComboboxName(widget.GetString(a.Value)) + addComboboxName(n, widget.GetString(a.Value)) default: log.Log(ERROR, "plugin Send() Don't know how to addText on", n.WidgetType, "yet", a.ActionType) } diff --git a/andlabs/box.go b/andlabs/box.go index d06bf60..df4cfba 100644 --- a/andlabs/box.go +++ b/andlabs/box.go @@ -2,17 +2,19 @@ package main import ( "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" "go.wit.com/dev/andlabs/ui" _ "go.wit.com/dev/andlabs/ui/winmanifest" ) // make new Box here -func (p *node) newBox(n *node) { +func newBox(n *tree.Node) { + if notNew(n) { return } newt := new(guiWidget) var box *ui.Box - if n.direction == widget.Horizontal { + if n.State.Direction == widget.Horizontal { box = ui.NewHorizontalBox() } else { box = ui.NewVerticalBox() @@ -22,8 +24,8 @@ func (p *node) newBox(n *node) { newt.uiBox = box newt.uiControl = box newt.boxC = 0 - n.tk = newt - p.place(n) + n.TK = newt + place(n.Parent, n) } /* @@ -46,10 +48,11 @@ func (p *node) newBox(n *node) { TODO: handle user killing/closing a window using the OS */ -func (n *node) rawBox() *ui.Box { +// func (n *node) rawBox() *ui.Box { +func rawBox(n *tree.Node) *ui.Box { var box *ui.Box - if n.direction == widget.Horizontal { + if n.State.Direction == widget.Horizontal { box = ui.NewHorizontalBox() } else { box = ui.NewVerticalBox() diff --git a/andlabs/button.go b/andlabs/button.go index 0cc4f52..4bbc8f2 100644 --- a/andlabs/button.go +++ b/andlabs/button.go @@ -1,25 +1,28 @@ package main import ( - "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" "go.wit.com/dev/andlabs/ui" _ "go.wit.com/dev/andlabs/ui/winmanifest" ) -func (p *node) newButton(n *node) { - t := p.tk +// func (p *node) newButton(n *node) { +func newButton(p *tree.Node, n *tree.Node) { + if notNew(n) { return } + var ptk *guiWidget + ptk = p.TK.(*guiWidget) newt := new(guiWidget) - b := ui.NewButton(widget.GetString(n.value)) + b := ui.NewButton(n.GetLabel()) newt.uiButton = b newt.uiControl = b - newt.parent = t + newt.parent = ptk b.OnClicked(func(*ui.Button) { - n.doUserEvent() + me.myTree.DoUserEvent(n) }) - n.tk = newt - p.place(n) + n.TK = newt + place(p, n) } diff --git a/andlabs/checkbox.go b/andlabs/checkbox.go index d44e458..d447baf 100644 --- a/andlabs/checkbox.go +++ b/andlabs/checkbox.go @@ -1,23 +1,26 @@ package main import ( + "go.wit.com/gui/toolkits/tree" + "go.wit.com/dev/andlabs/ui" _ "go.wit.com/dev/andlabs/ui/winmanifest" ) -func (p *node) newCheckbox(n *node) { +func newCheckbox(p *tree.Node, n *tree.Node) { + if notNew(n) { return } newt := new(guiWidget) - newt.uiCheckbox = ui.NewCheckbox(n.label) + newt.uiCheckbox = ui.NewCheckbox(n.GetLabel()) newt.uiControl = newt.uiCheckbox newt.uiCheckbox.OnToggled(func(spin *ui.Checkbox) { - n.value = newt.checked() - n.doUserEvent() + n.SetValue(newt.checked()) + me.myTree.DoUserEvent(n) }) - n.tk = newt - p.place(n) + n.TK = newt + place(p, n) } func (t *guiWidget) checked() bool { diff --git a/andlabs/combobox.go b/andlabs/combobox.go index 0dd16c6..adfea36 100644 --- a/andlabs/combobox.go +++ b/andlabs/combobox.go @@ -5,10 +5,11 @@ import ( _ "go.wit.com/dev/andlabs/ui/winmanifest" "go.wit.com/log" - "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" ) -func (p *node) newCombobox(n *node) { +func newCombobox(p, n *tree.Node) { + if notNew(n) { return } newt := new(guiWidget) cb := ui.NewEditableCombobox() @@ -20,46 +21,53 @@ func (p *node) newCombobox(n *node) { newt.val = make(map[int]string) cb.OnChanged(func(spin *ui.EditableCombobox) { - n.value = spin.Text() + n.SetValue(spin.Text()) log.Warn("combobox changed =" + spin.Text() + ".") - n.doUserEvent() + me.myTree.DoUserEvent(n) }) - n.tk = newt - p.place(n) + n.TK = newt + place(p, n) + log.Warn("add combobox entries on create:", n.State.Strings) + log.Warn("add combobox entries on create:", n.State.Strings) + log.Warn("add combobox entries on create:", n.State.Strings) // add the initial combobox entries - for i, s := range n.strings { - log.Warn("add combobox entries on create", n.progname, i, s) - n.addComboboxName(s) + for i, s := range n.State.Strings { + log.Warn("add combobox entries on create", n.GetProgName(), i, s) + addComboboxName(n, s) } - cur := widget.GetString(n.value) - log.Warn("add combobox: TODO: set default value on create", n.progname, cur) - n.setComboboxName(cur) + cur := n.String() + log.Warn("add combobox: TODO: set default value on create", n.GetProgName(), cur) + setComboboxName(n, cur) } -func (n *node) addComboboxName(s string) { - if ! n.ready() { return } +func addComboboxName(n *tree.Node, s string) { + if ! ready(n) { return } + var tk *guiWidget + tk = n.TK.(*guiWidget) log.Log(INFO, "addComboboxName()", n.WidgetId, "add:", s) - n.tk.uiEditableCombobox.Append(s) - if (n.tk.val == nil) { + tk.uiEditableCombobox.Append(s) + if (tk.val == nil) { log.Log(INFO, "make map didn't work") return } - n.tk.val[n.tk.c] = s + tk.val[tk.c] = s // If this is the first menu added, set the dropdown to it - if (n.tk.c == 0) { + if (tk.c == 0) { log.Log(INFO, "THIS IS THE FIRST combobox", s) - n.tk.uiEditableCombobox.SetText(s) + tk.uiEditableCombobox.SetText(s) } - n.tk.c = n.tk.c + 1 + tk.c = tk.c + 1 } -func (n *node) setComboboxName(s string) bool { - if ! n.ready() { return false} +func setComboboxName(n *tree.Node, s string) bool { + if ! ready(n) { return false} + var tk *guiWidget + tk = n.TK.(*guiWidget) log.Log(INFO, "SetComboboxName()", n.WidgetId, ",", s) - n.tk.uiEditableCombobox.SetText(s) + tk.uiEditableCombobox.SetText(s) return false } diff --git a/andlabs/common.go b/andlabs/common.go index 35417a1..1cfac84 120000..100644 --- a/andlabs/common.go +++ b/andlabs/common.go @@ -1 +1,61 @@ -../nocui/common.go
\ No newline at end of file +package main + +import ( + "go.wit.com/gui/widget" +) + +type node struct { + parent *node + children []*node + + WidgetId int // widget ID + WidgetType widget.WidgetType + ParentId int // parent ID + + state widget.State + + // a reference name for programming and debuggign. Must be unique + progname string + + // the text used for button labesl, window titles, checkbox names, etc + label string + + // horizontal means layout widgets like books on a bookshelf + // vertical means layout widgets like books in a stack + // direction widget.Orientation + direction widget.Orientation + + // This is how the values are passed back and forth + // values from things like checkboxes & dropdown's + value any + + strings []string + + // This is used for things like a slider(0,100) + X int + Y int + + // This is for the grid size & widget position + W int + H int + AtW int + AtH int + + vals []string // dropdown menu items + + // horizontal bool `default:false` + + hasTabs bool // does the window have tabs? + currentTab bool // the visible tab + + // the internal plugin toolkit structure + // in the gtk plugin, it has gtk things like margin & border settings + // in the text console one, it has text console things like colors for menus & buttons + tk *guiWidget +} + +/* +func (n *node) doUserEvent() { + log.Log(ERROR, "doUserEvent() ERROR") +} +*/ diff --git a/andlabs/debug.go b/andlabs/debug.go index 7e6bb24..51048d5 100644 --- a/andlabs/debug.go +++ b/andlabs/debug.go @@ -1,8 +1,6 @@ package main import ( - "strconv" - "go.wit.com/log" // "go.wit.com/gui/widget" ) @@ -94,7 +92,7 @@ func (n *node) dumpWidget(b bool) { } info = n.WidgetType.String() - d = strconv.Itoa(n.WidgetId) + " " + info + " " + n.progname + d = string(n.WidgetId) + " " + info + " " + n.progname var tabs string for i := 0; i < listChildrenDepth; i++ { diff --git a/andlabs/dropdown.go b/andlabs/dropdown.go index 0795264..6a1bd64 100644 --- a/andlabs/dropdown.go +++ b/andlabs/dropdown.go @@ -5,12 +5,13 @@ import ( _ "go.wit.com/dev/andlabs/ui/winmanifest" "go.wit.com/log" - "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" ) -func (p *node) newDropdown(n *node) { +func newDropdown(p, n *tree.Node) { + if notNew(n) { return } newt := new(guiWidget) - log.Log(INFO, "gui.Toolbox.newDropdown() START", n.progname) + log.Log(INFO, "gui.Toolbox.newDropdown() START", n.GetProgName()) cb := ui.NewCombobox() newt.uiCombobox = cb @@ -24,60 +25,69 @@ func (p *node) newDropdown(n *node) { i := spin.Selected() if (newt.val == nil) { log.Log(ERROR, "make map didn't work") - n.value = "map did not work. ui.Combobox error" + n.SetValue("map did not work. ui.Combobox error") } else { - n.value = newt.val[i] + n.SetValue(newt.val[i]) } - n.doUserEvent() + me.myTree.DoUserEvent(n) }) - n.tk = newt - p.place(n) + n.TK = newt + place(p, n) - if n.strings == nil {return} + log.Warn("add dropdown entries on create:", n.State.Strings) + log.Warn("add dropdown entries on create:", n.State.Strings) + log.Warn("add dropdown entries on create:", n.State.Strings) + if n.State.Strings == nil {return} // add the initial dropdown entries - for i, s := range n.strings { - log.Warn("add dropdown: add entries on create", n.progname, i, s) - n.addDropdownName(s) + for i, s := range n.State.Strings { + log.Warn("add dropdown: add entries on create", n.GetProgName(), i, s) + addDropdownName(n, s) } - cur := widget.GetString(n.value) - log.Warn("add dropdown: set default value on create", n.progname, cur) - n.setDropdownName(cur) + cur := n.String() + log.Warn("add dropdown: set default value on create", n.GetProgName(), cur) + setDropdownName(n, cur) } -func (n *node) SetDropdownInt(i int) { - if ! n.ready() { return } - n.tk.uiCombobox.SetSelected(i) +func setDropdownInt(n *tree.Node, i int) { + if ! ready(n) { return } + var tk *guiWidget + tk = n.TK.(*guiWidget) + tk.uiCombobox.SetSelected(i) } -func (n *node) addDropdownName(s string) { - if ! n.ready() { return } +func addDropdownName(n *tree.Node, s string) { + if ! ready(n) { return } + var tk *guiWidget + tk = n.TK.(*guiWidget) log.Log(INFO, "addDropdownName()", n.WidgetId, "add:", s) - n.tk.uiCombobox.Append(s) - if (n.tk.val == nil) { + tk.uiCombobox.Append(s) + if (tk.val == nil) { log.Log(INFO, "make map didn't work") return } - n.tk.val[n.tk.c] = s + tk.val[tk.c] = s // If this is the first menu added, set the dropdown to it - if (n.tk.c == 0) { + if (tk.c == 0) { log.Log(INFO, "THIS IS THE FIRST Dropdown", s) - n.tk.uiCombobox.SetSelected(0) + tk.uiCombobox.SetSelected(0) } - n.tk.c = n.tk.c + 1 + tk.c = tk.c + 1 } -func (n *node) setDropdownName(s string) bool { - if ! n.ready() { return false} +func setDropdownName(n *tree.Node, s string) bool { + if ! ready(n) { return false} + var tk *guiWidget + tk = n.TK.(*guiWidget) log.Log(INFO, "SetDropdownName()", n.WidgetId, ",", s) - for i, tmp := range n.tk.val { + for i, tmp := range tk.val { if s == tmp { - n.value = s - n.SetDropdownInt(i) + n.SetValue(s) + setDropdownInt(n, i) log.Warn("SetDropdownInt() worked", tmp, i) return true } diff --git a/andlabs/grid.go b/andlabs/grid.go index 2561648..bbb2c8b 100644 --- a/andlabs/grid.go +++ b/andlabs/grid.go @@ -1,6 +1,8 @@ package main import ( + "go.wit.com/gui/toolkits/tree" + "go.wit.com/dev/andlabs/ui" _ "go.wit.com/dev/andlabs/ui/winmanifest" ) @@ -10,9 +12,9 @@ import ( // -- (1,1) -- (2,1) -- (3,1) -- // -- (1,2) -- (2,1) -- (3,1) -- // ----------------------------- -func (p *node) newGrid(n *node) { +func newGrid(n *tree.Node) { + if notNew(n) { return } var newt *guiWidget - newt = new(guiWidget) c := ui.NewGrid() @@ -20,6 +22,6 @@ func (p *node) newGrid(n *node) { newt.uiControl = c c.SetPadded(true) - n.tk = newt - p.place(n) + n.TK = newt + place(n.Parent, n) } diff --git a/andlabs/group.go b/andlabs/group.go index 8faa6a4..efbabd9 100644 --- a/andlabs/group.go +++ b/andlabs/group.go @@ -1,20 +1,22 @@ package main import ( - "go.wit.com/gui/widget" + // "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" "go.wit.com/dev/andlabs/ui" _ "go.wit.com/dev/andlabs/ui/winmanifest" ) -func (p *node) newGroup(n *node) { +func newGroup(p, n *tree.Node) { + if notNew(n) { return } newt := new(guiWidget) - g := ui.NewGroup(widget.GetString(n.value)) + g := ui.NewGroup(n.GetLabel()) g.SetMargined(true) newt.uiGroup = g newt.uiControl = g - n.tk = newt - p.place(n) + n.TK = newt + place(p, n) } diff --git a/andlabs/image.go b/andlabs/image.go index f5cf941..badd8b4 100644 --- a/andlabs/image.go +++ b/andlabs/image.go @@ -16,7 +16,7 @@ func (p *node) newImage(n *node) { // newt.uiControl = img n.tk = newt - p.place(n) + // p.place(n) } /* if (a.Name == "image") { diff --git a/andlabs/label.go b/andlabs/label.go index bcdaf7a..12bc9c1 100644 --- a/andlabs/label.go +++ b/andlabs/label.go @@ -1,18 +1,19 @@ package main import ( - "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" "go.wit.com/dev/andlabs/ui" _ "go.wit.com/dev/andlabs/ui/winmanifest" ) -func (p *node) newLabel(n *node) { +func newLabel(p, n *tree.Node) { + if notNew(n) { return } newt := new(guiWidget) - c := ui.NewLabel(widget.GetString(n.value)) + c := ui.NewLabel(n.GetLabel()) newt.uiLabel = c newt.uiControl = c - n.tk = newt - p.place(n) + n.TK = newt + place(p, n) } diff --git a/andlabs/main.go b/andlabs/main.go index 5a6d383..b1e0e47 100644 --- a/andlabs/main.go +++ b/andlabs/main.go @@ -2,8 +2,11 @@ package main import ( "sync" + "runtime/debug" + "go.wit.com/log" "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" "go.wit.com/dev/andlabs/ui" // the _ means we only need this for the init() @@ -17,7 +20,11 @@ var muAction sync.Mutex func queueMain(currentA widget.Action) { defer func() { if r := recover(); r != nil { - log.Warn("YAHOOOO Recovered in main application:", r) + log.Warn("YAHOOOO Recovered in queueMain() application:", r) + log.Println("Recovered from panic:", r) + log.Println("Stack trace:") + debug.PrintStack() + me.myTree.DoToolkitPanic() } }() ui.QueueMain( func() { @@ -25,29 +32,14 @@ func queueMain(currentA widget.Action) { }) } -func catchActionChannel() { - log.Log(INFO, "catchActionChannel() START") - for { - log.Log(INFO, "catchActionChannel() for loop") - select { - case a := <-pluginChan: - log.Log(INFO, "catchActionChannel() SELECT widget id =", a.WidgetId, a.ProgName) - log.Log(INFO, "catchActionChannel() STUFF", a.WidgetId, a.ActionType, a.WidgetType) - muAction.Lock() - // TODO ui.QueueMain(f) - // TODO ui.QueueMain( func() {rawAction(a)} ) - // rawAction(a) - queueMain(a) - muAction.Unlock() - log.Log(INFO, "catchActionChannel() STUFF END", a.WidgetId, a.ActionType, a.WidgetType) - } - } -} - func guiMain() { defer func() { if r := recover(); r != nil { - log.Warn("YAHOOOO Recovered in main application:", r) + log.Warn("YAHOOOO Recovered in guiMain application:", r) + log.Println("Recovered from panic:", r) + log.Println("Stack trace:") + debug.PrintStack() + me.myTree.DoToolkitPanic() } }() ui.Main(func() { @@ -55,6 +47,10 @@ func guiMain() { }) } +func Init() { + log.Warn("Init() TODO: move init() to here") +} + // This is important. This sets the defaults for the gui. Without this, there isn't correct padding, etc func init() { log.Log(INFO, "Init() START") @@ -63,15 +59,12 @@ func init() { // log.Log(INFO, "init() Setting defaultBehavior = true") setDefaultBehavior(true) + me.myTree = tree.New() + me.myTree.PluginName = "andlabs" + me.myTree.ActionFromChannel = queueMain + // TODO: this is messed up. run ui.Main() from the first add? Initialize it with an empty thing first? // fake out the OS toolkit by making a fake window. This is probably needed for macos & windows // actually, this probably breaks the macos build go guiMain() - - // andlabs = make(map[int]*andlabsT) - pluginChan = make(chan widget.Action, 1) - - log.Log(INFO, "Init() start channel reciever") - go catchActionChannel() - log.Log(INFO, "Init() END") } diff --git a/andlabs/place.go b/andlabs/place.go index 94a16b2..25672e7 100644 --- a/andlabs/place.go +++ b/andlabs/place.go @@ -1,12 +1,15 @@ package main import ( + // "os" "go.wit.com/dev/andlabs/ui" _ "go.wit.com/dev/andlabs/ui/winmanifest" "go.wit.com/log" "go.wit.com/gui/widget" + + "go.wit.com/gui/toolkits/tree" ) // This routine is very specific to this toolkit @@ -33,62 +36,78 @@ import ( // -- (0,0) -- (1,0) -- (1,0) -- // -- (0,1) -- (1,1) -- (1,1) -- // ----------------------------- -func (p *node) place(n *node) bool { - log.Log(INFO, "place() START", n.WidgetType, n.progname) - if (p.tk == nil) { - log.Log(ERROR, "p.tk == nil", p.progname, p.ParentId, p.WidgetType, p.tk) - log.Log(ERROR, "n = ", n.progname, n.ParentId, n.WidgetType, n.tk) - panic("p.tk == nil") +func place(p *tree.Node, n *tree.Node) bool { + log.Warn("SPEEDY newplace() 1 START", n.WidgetId, n.GetProgName(), n.GetLabel(), n.String()) + log.Warn("SPEEDY newplace() n.State.Strings =", n.State.Strings) + log.Log(INFO, "place() 1 START", n.WidgetType, n.GetProgName(), n.GetLabel()) + if ! ready(n) { + log.Warn("place() 1 START not ready()") + return false + } + log.Log(INFO, "place() 1 START ready()") + var tk, ptk *guiWidget + tk = n.TK.(*guiWidget) + ptk = p.TK.(*guiWidget) + log.Warn("SPEEDY newplace() 2 START", n.WidgetId, n.GetProgName(), n.GetLabel()) + + if (ptk == nil) { + log.Log(ERROR, "ptk == nil", p.GetProgName(), p.ParentId, p.WidgetType, ptk) + log.Log(ERROR, "n = ", n.GetProgName(), n.ParentId, n.WidgetType, tk) + log.Warn("SPEEDY ptk == nil", n.WidgetId, n.GetProgName()) + log.Sleep(1) + panic("ptk == nil") } log.Log(INFO, "place() switch", p.WidgetType) + log.Warn("SPEEDY newplace() before switch", n.WidgetId, n.GetProgName()) switch p.WidgetType { case widget.Grid: - log.Log(INFO, "place() Grid try at Parent X,Y =", n.X, n.Y) - n.tk.gridX = n.AtW - 1 - n.tk.gridY = n.AtH - 1 - log.Log(INFO, "place() Grid try at gridX,gridY", n.tk.gridX, n.tk.gridY) - // at the very end, subtract 1 from X & Y since andlabs/ui starts counting at zero - p.tk.uiGrid.Append(n.tk.uiControl, - n.tk.gridX, n.tk.gridY, 1, 1, + tk.gridX = n.State.GridOffset.X - 1 + tk.gridY = n.State.GridOffset.Y - 1 + log.Warn("place() on Grid at gridX,gridY", tk.gridX, tk.gridY) + ptk.uiGrid.Append(tk.uiControl, + tk.gridX, tk.gridY, 1, 1, false, ui.AlignFill, false, ui.AlignFill) return true case widget.Group: - if (p.tk.uiBox == nil) { - log.Log(WARN, "place() andlabs hack group to use add a box", n.progname, n.WidgetType) - p.tk.uiBox = n.rawBox() - p.tk.uiGroup.SetChild(p.tk.uiBox) + if (ptk.uiBox == nil) { + log.Log(WARN, "place() andlabs hack group to use add a box", n.GetProgName(), n.WidgetType) + ptk.uiBox = rawBox(n) + ptk.uiGroup.SetChild(ptk.uiBox) } - p.tk.uiBox.Append(n.tk.uiControl, stretchy) + ptk.uiBox.Append(tk.uiControl, stretchy) return true case widget.Tab: - if (p.tk.uiTab == nil) { - log.Log(ERROR, "p.tk.uiTab == nil for n.WidgetId =", n.WidgetId, "p.tk =", p.tk) - panic("p.tk.uiTab == nil") + if (ptk.uiTab == nil) { + log.Log(ERROR, "ptk.uiTab == nil for n.WidgetId =", n.WidgetId, "ptk =", ptk) + panic("ptk.uiTab == nil") } - if (n.tk.uiControl == nil) { - log.Log(ERROR, "n.tk.uiControl == nil for n.WidgetId =", n.WidgetId, "n.tk =", n.tk) - panic("n.tk.uiControl == nil") + if (tk.uiControl == nil) { + log.Log(ERROR, "tk.uiControl == nil for n.WidgetId =", n.WidgetId, "tk =", tk) + panic("tk.uiControl == nil") } log.Log(ERROR, "CHECK LOGIC ON THIS. APPENDING directly into a window without a tab") - // log.Log(ERROR, "THIS SHOULD NEVER HAPPEN ??????? trying to place() node=", n.WidgetId, n.progname, n.Text, n.WidgetType) - // log.Log(ERROR, "THIS SHOULD NEVER HAPPEN ??????? trying to place() on parent=", p.WidgetId, p.progname, p.Text, p.WidgetType) - // panic("n.tk.uiControl == nil") - p.tk.uiTab.Append(widget.GetString(n.value), n.tk.uiControl) - p.tk.boxC += 1 + // log.Log(ERROR, "THIS SHOULD NEVER HAPPEN ??????? trying to place() node=", n.WidgetId, n.GetProgName(), n.Text, n.WidgetType) + // log.Log(ERROR, "THIS SHOULD NEVER HAPPEN ??????? trying to place() on parent=", p.WidgetId, p.GetProgName(), p.Text, p.WidgetType) + // panic("tk.uiControl == nil") + ptk.uiTab.Append(widget.GetString(n.State.Value), tk.uiControl) + ptk.boxC += 1 return true case widget.Box: - log.Log(INFO, "place() uiBox =", p.tk.uiBox) - log.Log(INFO, "place() uiControl =", n.tk.uiControl) - p.tk.uiBox.Append(n.tk.uiControl, stretchy) - p.tk.boxC += 1 + log.Warn("SPEEDY Add Something to Box", n.WidgetId, n.GetProgName()) + log.Log(INFO, "place() uiBox =", ptk.uiBox) + log.Log(INFO, "place() uiControl =", tk.uiControl) + ptk.uiBox.Append(tk.uiControl, stretchy) + ptk.boxC += 1 return true case widget.Window: - p.tk.uiWindow.SetChild(n.tk.uiControl) + log.Warn("SPEEDY Add Something to Window", n.WidgetId, n.GetProgName()) + ptk.uiWindow.SetChild(tk.uiControl) return true default: log.Log(ERROR, "place() how? Parent =", p.WidgetId, p.WidgetType) } + log.Warn("SPEEDY newplace() return", n.WidgetId, n.GetProgName()) return false } diff --git a/andlabs/setText.go b/andlabs/setText.go index 77beb5c..c5453db 100644 --- a/andlabs/setText.go +++ b/andlabs/setText.go @@ -3,15 +3,18 @@ package main import ( "go.wit.com/log" "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" ) -func (n *node) setText(a *widget.Action) { +// func (n *node) setText(a *widget.Action) { +func setText(n *tree.Node, a *widget.Action) { name := widget.GetString(a.Value) + var tk *guiWidget + tk = n.TK.(*guiWidget) log.Log(CHANGE, "setText() START with text =", name) - t := n.tk - if (t == nil) { - log.Log(ERROR, "setText error. tk == nil", n.progname, n.WidgetId) + if (tk == nil) { + log.Log(ERROR, "setText error. tk == nil", n.GetProgName(), n.WidgetId) return } log.Log(CHANGE, "setText() Attempt on", n.WidgetType, "with", name) @@ -19,38 +22,38 @@ func (n *node) setText(a *widget.Action) { switch n.WidgetType { case widget.Window: log.Warn("setText() Attempt to set the title to", name) - t.uiWindow.SetTitle(name) + tk.uiWindow.SetTitle(name) case widget.Tab: case widget.Group: - t.uiGroup.SetTitle(name) + tk.uiGroup.SetTitle(name) case widget.Checkbox: - t.uiCheckbox.SetText(name) + tk.uiCheckbox.SetText(name) case widget.Textbox: - if (t.uiEntry != nil) { - t.uiEntry.SetText(name) + if (tk.uiEntry != nil) { + tk.uiEntry.SetText(name) } - if (t.uiMultilineEntry != nil) { - t.uiMultilineEntry.SetText(name) + if (tk.uiMultilineEntry != nil) { + tk.uiMultilineEntry.SetText(name) } case widget.Label: - t.uiLabel.SetText(name) + tk.uiLabel.SetText(name) case widget.Button: - t.uiButton.SetText(name) + tk.uiButton.SetText(name) case widget.Slider: - log.Log(ERROR, "setText() on slider unknown", a.ActionType, "on checkbox", n.progname) + log.Log(ERROR, "setText() on slider unknown", a.ActionType, "on checkbox", n.GetProgName()) case widget.Spinner: - log.Log(ERROR, "setText() on spinner unknown", a.ActionType, "on checkbox", n.progname) + log.Log(ERROR, "setText() on spinner unknown", a.ActionType, "on checkbox", n.GetProgName()) case widget.Dropdown: var orig int var i int = -1 var s string - orig = t.uiCombobox.Selected() + orig = tk.uiCombobox.Selected() log.Log(CHANGE, "try to set the Dropdown to", name, "from", orig) // try to find the string - for i, s = range t.val { + for i, s = range tk.val { log.Log(CHANGE, "i, s", i, s) if (name == s) { - t.uiCombobox.SetSelected(i) + tk.uiCombobox.SetSelected(i) log.Log(CHANGE, "setText() Dropdown worked.", name) return } @@ -62,10 +65,10 @@ func (n *node) setText(a *widget.Action) { } // if the string was never set, then set the dropdown to the last thing added to the menu if (orig == -1) { - t.uiCombobox.SetSelected(i) + tk.uiCombobox.SetSelected(i) } case widget.Combobox: - t.uiEditableCombobox.SetText(name) + tk.uiEditableCombobox.SetText(name) default: log.Log(ERROR, "plugin Send() Don't know how to setText on", n.WidgetType, "yet", a.ActionType) } diff --git a/andlabs/slider.go b/andlabs/slider.go index 0da06f3..5ce393a 100644 --- a/andlabs/slider.go +++ b/andlabs/slider.go @@ -1,22 +1,29 @@ package main import ( + "go.wit.com/gui/toolkits/tree" + "go.wit.com/dev/andlabs/ui" _ "go.wit.com/dev/andlabs/ui/winmanifest" ) -func (p *node) newSlider(n *node) { +func newSlider(p, n *tree.Node) { + if notNew(n) { return } newt := new(guiWidget) - s := ui.NewSlider(n.X, n.Y) + var x, y int + x = n.State.Range.Low + y = n.State.Range.High + + s := ui.NewSlider(x, y) newt.uiSlider = s newt.uiControl = s s.OnChanged(func(spin *ui.Slider) { - n.value = newt.uiSlider.Value() - n.doUserEvent() + n.SetValue(newt.uiSlider.Value()) + me.myTree.DoUserEvent(n) }) - n.tk = newt - p.place(n) + n.TK = newt + place(p, n) } diff --git a/andlabs/spinner.go b/andlabs/spinner.go index 01d3b26..65bd7db 100644 --- a/andlabs/spinner.go +++ b/andlabs/spinner.go @@ -1,22 +1,25 @@ package main import ( + "go.wit.com/gui/toolkits/tree" + "go.wit.com/dev/andlabs/ui" _ "go.wit.com/dev/andlabs/ui/winmanifest" ) -func (p *node) newSpinner(n *node) { +func newSpinner(p, n *tree.Node) { + if notNew(n) { return } newt := new(guiWidget) - s := ui.NewSpinbox(n.X, n.Y) + s := ui.NewSpinbox(n.State.Range.Low,n.State.Range.High) newt.uiSpinbox = s newt.uiControl = s s.OnChanged(func(s *ui.Spinbox) { - n.value = newt.uiSpinbox.Value() - n.doUserEvent() + n.SetValue(newt.uiSpinbox.Value()) + me.myTree.DoUserEvent(n) }) - n.tk = newt - p.place(n) + n.TK = newt + place(p, n) } diff --git a/andlabs/structs.go b/andlabs/structs.go index 87e88e1..e39cbe7 100644 --- a/andlabs/structs.go +++ b/andlabs/structs.go @@ -1,7 +1,11 @@ package main -import "go.wit.com/dev/andlabs/ui" -import _ "go.wit.com/dev/andlabs/ui/winmanifest" +import ( + "go.wit.com/gui/toolkits/tree" + + "go.wit.com/dev/andlabs/ui" + _ "go.wit.com/dev/andlabs/ui/winmanifest" +) // var andlabs map[int]*andlabsT // var callback func(int) bool @@ -11,7 +15,9 @@ import _ "go.wit.com/dev/andlabs/ui/winmanifest" var me config type config struct { - rootNode *node // the base of the binary tree. it should have id == 0 + rootNode *tree.Node // the base of the binary tree. it should have id == 0 + treeRoot *tree.Node // the base of the binary tree. it should have id == 0 + myTree *tree.TreeInfo } // stores the raw toolkit internals diff --git a/andlabs/textbox.go b/andlabs/textbox.go index 30671cd..3748a14 100644 --- a/andlabs/textbox.go +++ b/andlabs/textbox.go @@ -1,21 +1,24 @@ package main import ( + "go.wit.com/gui/toolkits/tree" + "go.wit.com/dev/andlabs/ui" _ "go.wit.com/dev/andlabs/ui/winmanifest" ) -func (p *node) newTextbox(n *node) { +func newTextbox(p, n *tree.Node) { + if notNew(n) { return } newt := new(guiWidget) - if (n.X == 1) { + if (n.State.Range.Low == 1) { e := ui.NewEntry() newt.uiEntry = e newt.uiControl = e e.OnChanged(func(spin *ui.Entry) { - n.value = spin.Text() - n.doUserEvent() + n.SetValue(spin.Text()) + me.myTree.DoUserEvent(n) }) } else { e := ui.NewNonWrappingMultilineEntry() @@ -23,10 +26,10 @@ func (p *node) newTextbox(n *node) { newt.uiControl = e e.OnChanged(func(spin *ui.MultilineEntry) { - n.value = spin.Text() - n.doUserEvent() + n.SetValue(spin.Text()) + me.myTree.DoUserEvent(n) }) } - n.tk = newt - p.place(n) + n.TK = newt + place(p, n) } diff --git a/andlabs/tree.go b/andlabs/tree.go new file mode 100644 index 0000000..400bee4 --- /dev/null +++ b/andlabs/tree.go @@ -0,0 +1,31 @@ +package main + +/* + This code should be common to all gui plugins + + There are some helper functions that are probably going to be + the same everywhere. Mostly due to handling the binary tree structure + and the channel communication + + For now, it's just a symlink to the 'master' version in + ./toolkit/nocui/common.go +*/ + +import ( + "go.wit.com/gui/widget" +) + +// Other goroutines must use this to access the GUI +// +// You can not acess / process the GUI thread directly from +// other goroutines. This is due to the nature of how +// Linux, MacOS and Windows work (they all work differently. suprise. surprise.) +// +// this sets the channel to send user events back from the plugin +func Callback(guiCallback chan widget.Action) { + me.myTree.Callback(guiCallback) +} + +func PluginChannel() chan widget.Action { + return me.myTree.PluginChannel() +} diff --git a/andlabs/widget.go b/andlabs/widget.go index 414ca3d..d6d89ba 100644 --- a/andlabs/widget.go +++ b/andlabs/widget.go @@ -2,16 +2,16 @@ package main import ( "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" ) -// this is specific to the nocui toolkit -func initWidget(n *node) *guiWidget { +func initWidget(n *tree.Node) *guiWidget { var w *guiWidget w = new(guiWidget) if n.WidgetType == widget.Root { n.WidgetId = 0 - me.rootNode = n + me.treeRoot = n return w } return w diff --git a/andlabs/window.go b/andlabs/window.go index d52648e..d517f86 100644 --- a/andlabs/window.go +++ b/andlabs/window.go @@ -6,6 +6,7 @@ import ( "go.wit.com/log" "go.wit.com/gui/widget" + "go.wit.com/gui/toolkits/tree" ) func (t *guiWidget) MessageWindow(msg1 string, msg2 string) { @@ -16,23 +17,24 @@ func (t *guiWidget) ErrorWindow(msg1 string, msg2 string) { ui.MsgBoxError(t.uiWindow, msg1, msg2) } -func newWindow(n *node) { +func newWindow(p, n *tree.Node) { var newt *guiWidget newt = new(guiWidget) // menubar bool is if the OS defined border on the window should be used - win := ui.NewWindow(n.progname, n.X, n.Y, menubar) + win := ui.NewWindow(n.GetProgName(), 640, 480, menubar) win.SetBorderless(canvas) win.SetMargined(margin) win.OnClosing(func(*ui.Window) bool { - n.show(false) - n.doUserEvent() + // show(n, false) + me.myTree.DoWindowCloseEvent(n) return false }) newt.uiWindow = win newt.uiControl = win - n.tk = newt + n.TK = newt + place(p, n) win.Show() return } |
