summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2023-03-01 11:35:36 -0600
committerJeff Carr <[email protected]>2023-03-01 11:35:36 -0600
commit8dbf5a09097b7868e9218bf98716c57eac998a10 (patch)
treeab3bdfeaf5a59a55de9d2a6661d2d824090491e5
parentf3bb68396afa7452ecf1c8d4744c825a9d81057c (diff)
lots cleaner code between the pluginv0.6.1
Queue() around SetText is helping userspace crashing merge forceDump(bool) into Dump() debugging output configuration is pretty clean keep cutting down duplicate things --gui-verbose flag works make label "standard" code add debug.FreeOSMemory() move the GO language internals to display in the GUI update push to do tags and go to github.com/wit-go/ remove the other license file it might be confusing golang.org and github proper WidgetType added a Quit() button Signed-off-by: Jeff Carr <[email protected]>
-rw-r--r--LICENSE.md8
-rw-r--r--Makefile14
-rw-r--r--README-goreadme.md44
-rw-r--r--button.go24
-rw-r--r--checkbox.go55
-rw-r--r--cmds/buttonplugin/Makefile4
-rw-r--r--cmds/buttonplugin/main.go6
-rw-r--r--cmds/textbox/main.go26
-rw-r--r--common.go44
-rw-r--r--debug.go57
-rw-r--r--debug_flags.go84
-rw-r--r--debug_golang.go168
-rw-r--r--debug_widget.go115
-rw-r--r--debug_window.go140
-rw-r--r--direct.go (renamed from andlabs.go)0
-rw-r--r--dropdown.go51
-rw-r--r--example_window_golang_debug.go104
-rw-r--r--group.go20
-rw-r--r--label.go19
-rw-r--r--log.go5
-rw-r--r--main.go43
-rw-r--r--node.go37
-rw-r--r--plugin.go54
-rw-r--r--slider.go26
-rw-r--r--spinner.go26
-rw-r--r--structs.go15
-rw-r--r--tab.go13
-rw-r--r--textbox.go22
-rw-r--r--toolkit/andlabs/box.go4
-rw-r--r--toolkit/andlabs/button.go54
-rw-r--r--toolkit/andlabs/checkbox.go90
-rw-r--r--toolkit/andlabs/common.go79
-rw-r--r--toolkit/andlabs/debug.go97
-rw-r--r--toolkit/andlabs/dropdown.go50
-rw-r--r--toolkit/andlabs/group.go20
-rw-r--r--toolkit/andlabs/label.go102
-rw-r--r--toolkit/andlabs/log.go9
-rw-r--r--toolkit/andlabs/main.go9
-rw-r--r--toolkit/andlabs/plugin.go129
-rw-r--r--toolkit/andlabs/slider.go15
-rw-r--r--toolkit/andlabs/spinner.go32
-rw-r--r--toolkit/andlabs/structs.go14
-rw-r--r--toolkit/andlabs/tab.go10
-rw-r--r--toolkit/andlabs/textbox.go93
-rw-r--r--toolkit/andlabs/widget.go67
-rw-r--r--toolkit/andlabs/window.go31
-rw-r--r--toolkit/widget.go71
-rw-r--r--window.go45
48 files changed, 1331 insertions, 914 deletions
diff --git a/LICENSE.md b/LICENSE.md
deleted file mode 100644
index 63f8dce..0000000
--- a/LICENSE.md
+++ /dev/null
@@ -1,8 +0,0 @@
-GNU Lesser General Public License (LGPL)
-
-I don't want it to be possible to make closed source forks of this.
-If you need to use this in a proprietary GO application, then
-compile this as a plugin. The BSD license is bad for core GO libraries.
-
-(GO now supports plugins as of version 1.8)
-https://medium.com/@henvic/opensource-and-go-what-license-f6b36c201854
diff --git a/Makefile b/Makefile
index 95b9d29..d262786 100644
--- a/Makefile
+++ b/Makefile
@@ -19,11 +19,12 @@ deb:
-wit mirrors
examples: \
+ all \
cmds-buttonplugin \
cmds-console-ui-helloworld \
cmds-helloworld \
- cmds-debug \
- cmds-textbox
+ cmds-textbox \
+ cmds-debug
cmds-buttonplugin:
make -C cmds/buttonplugin
@@ -35,20 +36,21 @@ cmds-helloworld:
make -C cmds/helloworld
cmds-debug:
- make -C cmds/debug
+ -make -C cmds/debug
cmds-textbox:
make -C cmds/textbox
# sync repo to the github backup
# git remote add github [email protected]:witorg/gui.git
+# git remote add github2 [email protected]:wit-go/gui.git
github:
git push origin master
+ git push github2 master
+ git push github2 --tags
git push github master
- git push github devel
- git push github jcarr
@echo
- @echo check https://github.com/witorg/gui
+ @echo check https://github.com/wit-go/gui
@echo
doc:
diff --git a/README-goreadme.md b/README-goreadme.md
index f21e4fe..a051b8a 100644
--- a/README-goreadme.md
+++ b/README-goreadme.md
@@ -145,41 +145,41 @@ var WARN bool
## Functions
+### func [DebugWidgetWindow](/debug_widget.go#L7)
+
+`func DebugWidgetWindow(w *Node)`
+
### func [DebugWindow](/debug_window.go#L9)
`func DebugWindow()`
Creates a window helpful for debugging this package
-### func [GetDebug](/debug.go#L20)
-
-`func GetDebug() bool`
-
-### func [GolangDebugWindow](/example_window_golang_debug.go#L10)
+### func [Delete](/common.go#L66)
-`func GolangDebugWindow()`
+`func Delete(c *Node)`
-### func [Indent](/debug.go#L120)
+### func [Indent](/debug.go#L123)
`func Indent(a ...interface{})`
-### func [InitPlugins](/main.go#L35)
+### func [InitPlugins](/main.go#L46)
`func InitPlugins(names []string)`
-### func [LoadToolkit](/plugin.go#L53)
+### func [LoadToolkit](/plugin.go#L56)
`func LoadToolkit(name string) bool`
loads and initializes a toolkit (andlabs/ui, gocui, etc)
-### func [Main](/main.go#L76)
+### func [Main](/main.go#L87)
`func Main(f func())`
This should not pass a function
-### func [Queue](/main.go#L106)
+### func [Queue](/main.go#L117)
`func Queue(f func())`
@@ -194,31 +194,25 @@ For example: gui.Queue(NewWindow())
`func SetDebug(s bool)`
-### func [SetDebugChange](/debug.go#L52)
+### func [SetDebugChange](/debug.go#L58)
`func SetDebugChange(s bool)`
This passes the debugChange flag to the toolkit plugin
-### func [SetDebugToolkit](/debug.go#L37)
+### func [SetDebugToolkit](/debug.go#L43)
`func SetDebugToolkit(s bool)`
This passes the debugToolkit flag to the toolkit plugin
-### func [ShowDebugValues](/debug.go#L66)
+### func [ShowDebugValues](/debug.go#L72)
`func ShowDebugValues()`
-### func [StandardClose](/main.go#L119)
-
-`func StandardClose(n *Node)`
-
-The window is destroyed but the application does not quit
-
-### func [StandardExit](/main.go#L125)
+### func [StandardExit](/main.go#L136)
-`func StandardExit(n *Node)`
+`func StandardExit()`
The window is destroyed but the application does not quit
@@ -239,7 +233,7 @@ This goroutine can be used like a watchdog timer
This struct can be used with the go-arg package
-### type [GuiConfig](/structs.go#L30)
+### type [GuiConfig](/structs.go#L33)
`type GuiConfig struct { ... }`
@@ -249,14 +243,14 @@ This struct can be used with the go-arg package
var Config GuiConfig
```
-### type [Node](/structs.go#L48)
+### type [Node](/structs.go#L54)
`type Node struct { ... }`
The Node is a binary tree. This is how all GUI elements are stored
simply the name and the size of whatever GUI element exists
-#### func [NewWindow](/window.go#L14)
+#### func [NewWindow](/window.go#L15)
`func NewWindow() *Node`
diff --git a/button.go b/button.go
index dd93721..35e252d 100644
--- a/button.go
+++ b/button.go
@@ -1,25 +1,9 @@
package gui
-func (n *Node) NewButton(name string, custom func()) *Node {
- newNode := n.New(name, "Button")
-
- newNode.Widget.Custom = func() {
- log(debugGui, "even newer clicker() name", newNode.Widget)
- if (custom != nil) {
- custom()
- } else {
- log(debugGui, "wit/gui No callback function is defined for button name =", name)
- }
- }
-
- for _, aplug := range allPlugins {
- log(debugGui, "gui.NewButton() aplug =", aplug.name, "name =", newNode.Widget.Name)
- if (aplug.NewButton == nil) {
- log(debugGui, "\tgui.NewButton() aplug.NewButton = nil", aplug.name)
- continue
- }
- aplug.NewButton(&n.Widget, &newNode.Widget)
- }
+import "git.wit.org/wit/gui/toolkit"
+func (n *Node) NewButton(name string, custom func()) *Node {
+ newNode := n.New(name, toolkit.Button, custom)
+ send(n, newNode)
return newNode
}
diff --git a/checkbox.go b/checkbox.go
index 0372a50..068be7b 100644
--- a/checkbox.go
+++ b/checkbox.go
@@ -1,55 +1,20 @@
package gui
+import "git.wit.org/wit/gui/toolkit"
+
func (n *Node) Checked() bool {
n.Dump()
- return n.checked
+ return n.widget.B
}
-/*
-This was the old code
- newt.Custom = func () {
- println("AM IN CALLBACK. SETTING NODE.checked START")
- if newt.Checked() {
- println("is checked")
- c.checked = true
- } else {
- println("is not checked")
- c.checked = false
- }
- commonCallback(c)
- println("AM IN CALLBACK. SETTING NODE.checked END")
- }
-*/
-
-
func (n *Node) NewCheckbox(name string) *Node {
- newNode := n.New(name, "Checkbox")
- newNode.custom = n.custom
-
- newNode.Widget.Custom = func() {
- log(debugChange, "wit go gui checkbox", newNode.Widget)
- if (n.custom != nil) {
- log(debugChange, "trying parent.custom() callback() name =", name)
- n.custom()
- } else {
- log(debugChange, "wit/gui No parent.custom() function is defined for button name =", name)
- }
- if (newNode.custom != nil) {
- log(debugChange, "trying newNode.custom() callback name =", name)
- newNode.custom()
- } else {
- log(debugChange, "wit/gui No newNode.custom() function is defined for button name =", name)
- }
- }
-
- for _, aplug := range allPlugins {
- log(debugGui, "gui.NewCheckbox() aplug =", aplug.name, "name =", newNode.Widget.Name)
- if (aplug.NewCheckbox == nil) {
- log(debugGui, "\tgui.NewCheckbox() aplug.NewCheckbox = nil", aplug.name)
- continue
- }
- aplug.NewCheckbox(&n.Widget, &newNode.Widget)
- }
+ newNode := n.New(name, toolkit.Checkbox, nil)
+ send(n, newNode)
+ return newNode
+}
+func (n *Node) NewThing(name string) *Node {
+ newNode := n.New(name, toolkit.Button, nil)
+ send(n, newNode)
return newNode
}
diff --git a/cmds/buttonplugin/Makefile b/cmds/buttonplugin/Makefile
index faa8882..49d190c 100644
--- a/cmds/buttonplugin/Makefile
+++ b/cmds/buttonplugin/Makefile
@@ -7,8 +7,8 @@
#
run: build
- ./buttonplugin >/tmp/buttonplugin.log 2>&1
- # ./buttonplugin
+ # ./buttonplugin >/tmp/buttonplugin.log 2>&1
+ ./buttonplugin
build-release:
go get -v -u -x .
diff --git a/cmds/buttonplugin/main.go b/cmds/buttonplugin/main.go
index 6132ed6..9ed47fa 100644
--- a/cmds/buttonplugin/main.go
+++ b/cmds/buttonplugin/main.go
@@ -42,7 +42,7 @@ func main() {
log.Println("Main() END")
time.Sleep(1 * time.Second)
gui.Watchdog()
- gui.StandardExit(nil)
+ gui.StandardExit()
}
var counter int = 5
@@ -82,7 +82,9 @@ func buttonWindow() {
})
g.NewButton("gui.GolangDebugWindow()", func () {
- gui.GolangDebugWindow()
+ // make a seperate window out of this
+ // w.GolangDebugWindow(false)
+ w.GolangDebugWindow(true)
})
g.NewButton("LoadToolkit(andlabs)", func () {
diff --git a/cmds/textbox/main.go b/cmds/textbox/main.go
index b260681..44431b7 100644
--- a/cmds/textbox/main.go
+++ b/cmds/textbox/main.go
@@ -11,8 +11,6 @@ import (
type LogOptions struct {
LogFile string
Verbose bool
- // GuiDebug bool `help:"open up the wit/gui Debugging Window"`
- // GuiDemo bool `help:"open the wit/gui Demo Window"`
User string `arg:"env:USER"`
}
@@ -45,11 +43,15 @@ func main() {
func initGUI() {
var w *gui.Node
gui.Config.Title = "Hello World"
- gui.Config.Width = 640
- gui.Config.Height = 480
+ gui.Config.Width = 642
+ gui.Config.Height = 481
gui.Config.Exit = myDefaultExit
w = gui.NewWindow()
+ w.Custom = func () {
+ log.Println("myDefaultExit(w)")
+ myDefaultExit(w)
+ }
w.Dump()
addDemoTab(w, "A Simple Tab Demo")
addDemoTab(w, "A Second Tab")
@@ -57,6 +59,9 @@ func initGUI() {
if (args.GuiDebug) {
gui.DebugWindow()
}
+ if (args.GuiVerbose) {
+ gui.SetDebug(true)
+ }
}
func addDemoTab(window *gui.Node, title string) {
@@ -71,18 +76,19 @@ func addDemoTab(window *gui.Node, title string) {
dd.AddDropdownName("more 1")
dd.AddDropdownName("more 2")
dd.AddDropdownName("more 3")
- dd.OnChanged = func(*gui.Node) {
- s := dd.GetText()
- tb.SetText("hello world " + args.User + "\n" + s)
- }
-
g2 = newNode.NewGroup("group 2")
tb = g2.NewTextbox("tb")
log.Println("tb =", tb.GetText())
- tb.OnChanged = func(*gui.Node) {
+ tb.Custom = func() {
s := tb.GetText()
log.Println("text =", s)
}
+
+ dd.Custom = func() {
+ s := dd.GetText()
+ log.Println("hello world " + args.User + "\n" + s + "\n")
+ tb.SetText("hello world " + args.User + "\n" + s + "\n")
+ }
}
func myDefaultExit(n *gui.Node) {
diff --git a/common.go b/common.go
index 5dc098d..22e4319 100644
--- a/common.go
+++ b/common.go
@@ -1,17 +1,32 @@
package gui
-// import "errors"
-import "regexp"
+import (
+ "regexp"
+ // "errors"
+ // "git.wit.org/wit/gui/toolkit"
+)
// functions for handling text related GUI elements
func (n *Node) SetText(str string) bool {
- log(debugChange, "gui.SetText() value = FIXME. NOT DOING ANYTHING", str)
+ log(debugChange, "gui.SetText() value =", str)
+ n.widget.Action = "Set"
+ n.widget.S = str
+ send(n.parent, n)
+ return true
+}
+
+func (n *Node) AppendText(str string) bool {
+ n.widget.Action = "Set"
+ tmp := n.widget.S + str
+ log(debugChange, "gui.AppendText() value =", tmp)
+ n.widget.S = tmp
+ send(n.parent, n)
return true
}
func (n *Node) GetText() string {
- return "TODO: GetText() = {}"
+ return n.widget.S
}
/*
@@ -48,19 +63,18 @@ func normalizeInt(s string) string {
return clean
}
+func Delete(c *Node) {
+ c.widget.Action = "Delete"
+ send(c.parent, c)
+}
+
func commonCallback(n *Node) {
// TODO: make all of this common code to all the widgets
- if (n.OnChanged == nil) {
- log(debugChange, "Not Running n.OnChanged(n) == nil")
- } else {
- log(debugChange, "Running n.OnChanged(n)")
- n.OnChanged(n)
- }
-
- if (n.custom == nil) {
- log(debugChange, "Not Running n.custom(n) == nil")
+ // This might be common everywhere finally (2023/03/01)
+ if (n.Custom == nil) {
+ log(debugChange, "Not Running n.Custom(n) == nil")
} else {
- log(debugChange, "Running n.custom()")
- n.custom()
+ log(debugChange, "Running n.Custom(n)")
+ n.Custom()
}
}
diff --git a/debug.go b/debug.go
index f2be829..7fe9a6a 100644
--- a/debug.go
+++ b/debug.go
@@ -4,8 +4,8 @@ package gui
// A function dump out the binary tree
import (
- // "fmt"
- "reflect"
+ "strconv"
+ "git.wit.org/wit/gui/toolkit"
)
// various debugging flags
@@ -17,14 +17,20 @@ var debugChange bool = false // shows user events like mouse and keyboard
var debugPlugin bool = false
var debugToolkit bool = false
-func GetDebug () bool {
- return debugGui
-}
+// func GetDebug () bool {
+// return debugGui
+// }
func SetDebug (s bool) {
- debugGui = s
- // debugDump = s
- // debugNode = s
+ debugGui = s
+ debugChange = s
+ debugDump = s
+ debugTabs = s
+ debugPlugin = s
+ debugNode = s
+ debugToolkit = s
+ SetDebugChange(s)
+ SetDebugToolkit(s)
}
/*
@@ -64,12 +70,14 @@ func SetDebugChange (s bool) {
}
func ShowDebugValues() {
- log(true, "Debug =", debugGui)
- log(true, "DebugDump =", debugDump)
- log(true, "DebugNode =", debugNode)
- log(true, "DebugTabs =", debugTabs)
- log(true, "DebugPlugin =", debugPlugin)
- log(true, "DebugChange =", debugChange)
+ // The order here should match the order in the GUI
+ // TODO: get the order from the node binary tree
+ log(true, "Debug =", debugGui)
+ log(true, "DebugChange =", debugChange)
+ log(true, "DebugDump =", debugDump)
+ log(true, "DebugTabs =", debugTabs)
+ log(true, "DebugPlugin =", debugPlugin)
+ log(true, "DebugNode =", debugNode)
log(true, "DebugToolkit =", debugToolkit)
// dump out the debugging flags for the plugins
@@ -102,14 +110,9 @@ func (n *Node) Dump() {
if (n.children != nil) {
Indent("children = ", n.children)
}
- if (n.custom != nil) {
- Indent("custom = ", n.custom)
- }
- Indent("checked = ", n.checked)
- if (n.OnChanged != nil) {
- Indent("OnChanged = ", n.OnChanged)
+ if (n.Custom != nil) {
+ Indent("Custom = ", n.Custom)
}
- Indent("text = ", reflect.ValueOf(n.text).Kind(), n.text)
Indent("NODE DUMP END")
}
@@ -124,15 +127,15 @@ func Indent(a ...interface{}) {
func (n *Node) dumpWidget() {
var info string
- if (n.Widget.Type == "") {
- n.Widget.Type = "UNDEF"
- }
- info = n.Widget.Type
+ info = n.widget.Type.String()
- info += ", " + n.Widget.Name
- if (n.Name != n.Widget.Name) {
+ info += ", " + n.widget.Name
+ if (n.Name != n.widget.Name) {
info += " NAME MISMATCH"
}
+ if (n.widget.Type == toolkit.Checkbox) {
+ info += " = " + strconv.FormatBool(n.widget.B)
+ }
logindent(listChildrenDepth, defaultPadding, n.id, info)
}
diff --git a/debug_flags.go b/debug_flags.go
new file mode 100644
index 0000000..ea535c4
--- /dev/null
+++ b/debug_flags.go
@@ -0,0 +1,84 @@
+package gui
+
+// Let's you toggle on and off the various types of debugging output
+// These checkboxes should be in the same order as the are printed
+func (n *Node) debugFlags(makeWindow bool) {
+ var w, g *Node
+
+ // Either:
+ // make a new window
+ // make a new tab in the existing window
+ if (makeWindow) {
+ Config.Title = "Debug Flags"
+ Config.Width = 300
+ Config.Height = 400
+ w = NewWindow()
+ w.Custom = w.StandardClose
+ } else {
+ w = n.NewTab("Debug Flags")
+ }
+ w.Dump()
+
+ g = w.NewGroup("Debug Flags")
+
+ g.NewButton("Turn on all Debug Flags", func () {
+ SetDebug(true)
+ })
+
+ g.NewButton("Turn off all Debug Flags", func () {
+ SetDebug(false)
+ })
+
+ // generally useful debugging
+ cb1 := g.NewCheckbox("debugGui")
+ cb1.Custom = func() {
+ debugGui = cb1.widget.B
+ log(debugGui, "Custom() n.widget =", cb1.widget.Name, cb1.widget.B)
+ }
+
+ // debugging that will show you things like mouse clicks, user inputing text, etc
+ // also set toolkit.DebugChange
+ cb2 := g.NewCheckbox("debugChange")
+ cb2.Custom = func() {
+ debugChange = cb2.widget.B
+ SetDebugChange(cb2.widget.B)
+ log(debugGui, "Custom() n.widget =", cb2.widget.Name, cb2.widget.B)
+ }
+
+ // supposed to tell if you are going to dump full variable output
+ cb3 := g.NewCheckbox("debugDump")
+ cb3.Custom = func() {
+ debugDump = cb3.widget.B
+ log(debugGui, "Custom() n.widget =", cb3.widget.Name, cb3.widget.B)
+ }
+
+ cb4 := g.NewCheckbox("debugTabs")
+ cb4.Custom = func() {
+ debugTabs = cb4.widget.B
+ log(debugGui, "Custom() n.widget =", cb4.widget.Name, cb4.widget.B)
+ }
+
+ // should show you when things go into or come back from the plugin
+ cb5 := g.NewCheckbox("debugPlugin")
+ cb5.Custom = func() {
+ debugPlugin = cb5.widget.B
+ log(debugGui, "Custom() n.widget =", cb5.widget.Name, cb5.widget.B)
+ }
+
+ cb6 := g.NewCheckbox("debugNode")
+ cb6.Custom = func() {
+ debugNode = cb6.widget.B
+ log(debugGui, "Custom() n.widget =", cb6.widget.Name, cb6.widget.B)
+ }
+
+ // turns on debugging inside the plugin toolkit
+ cb7 := g.NewCheckbox("debugToolkit")
+ cb7.Custom = func() {
+ SetDebugToolkit(cb7.widget.B)
+ log(debugGui, "Custom() n.widget =", cb7.widget.Name, cb7.widget.B)
+ }
+
+ g.NewButton("Dump Debug Flags", func () {
+ ShowDebugValues()
+ })
+}
diff --git a/debug_golang.go b/debug_golang.go
new file mode 100644
index 0000000..87ccdb5
--- /dev/null
+++ b/debug_golang.go
@@ -0,0 +1,168 @@
+package gui
+
+import (
+ "fmt"
+ "bytes"
+ // "os"
+ "runtime"
+ "runtime/debug"
+ "runtime/pprof"
+)
+
+func (n *Node) GolangDebugWindow(makeWindow bool) {
+ var w, g, og, outputTextbox *Node
+
+ // Either:
+ // make a new window
+ // make a new tab in the existing window
+ if (makeWindow) {
+ Config.Title = "GO"
+ Config.Width = 300
+ Config.Height = 400
+ w = NewWindow()
+ w.Custom = w.StandardClose
+ } else {
+ w = n.NewTab("GO")
+ }
+ w.Dump()
+
+ g = w.NewGroup("Language Internals")
+
+ g.NewButton("ReadModuleInfo()", func () {
+ tmp, _ := debug.ReadBuildInfo()
+ outputTextbox.SetText(tmp.String())
+ })
+ g.NewButton("debug.PrintStack()", func () {
+ outputTextbox.SetText(string(debug.Stack()))
+ })
+ g.NewButton("pprof.Lookup(goroutine)", func () {
+ buf := new(bytes.Buffer)
+ pprof.Lookup("goroutine").WriteTo(buf, 1)
+ outputTextbox.SetText(buf.String())
+ })
+ g.NewButton("pprof.Lookup(heap)", func () {
+ buf := new(bytes.Buffer)
+ pprof.Lookup("heap").WriteTo(buf, 1)
+ outputTextbox.SetText(buf.String())
+ })
+ g.NewButton("pprof.Lookup(block)", func () {
+ buf := new(bytes.Buffer)
+ pprof.Lookup("block").WriteTo(buf, 1)
+ outputTextbox.SetText(buf.String())
+ })
+ g.NewButton("pprof.Lookup threadcreate", func () {
+ buf := new(bytes.Buffer)
+ pprof.Lookup("threadcreate").WriteTo(buf, 1)
+ outputTextbox.SetText(buf.String())
+ })
+
+ g.NewButton("runtime.ReadMemStats()", func () {
+ outputTextbox.SetText(runtimeReadMemStats())
+ })
+
+ g.NewButton("debug.FreeOSMemory()", func () {
+ var out string = "Before debug.FreeOSMemory():\n\n"
+ out += runtimeReadMemStats()
+ debug.FreeOSMemory()
+ out += "\n\nAfter debug.FreeOSMemory():\n\n"
+ out += runtimeReadMemStats()
+ outputTextbox.SetText(out)
+ })
+
+ g.NewButton("debug.ReadGCStats()", func () {
+ var tmp debug.GCStats
+ var out string
+ debug.ReadGCStats(&tmp)
+ log(tmp)
+ out += fmt.Sprintln("LastGC:", tmp.LastGC, "// time.Time time of last collection")
+ out += fmt.Sprintln("NumGC:", tmp.NumGC, "// number of garbage collections")
+ out += fmt.Sprintln("PauseTotal:", tmp.PauseTotal, "// total pause for all collections")
+ out += fmt.Sprintln("Pause:", tmp.Pause, "// []time.Duration pause history, most recent first")
+ out += fmt.Sprintln("PauseEnd:", tmp.Pause, "// []time.Time pause history, most recent first")
+ out += fmt.Sprintln("PauseQuantiles:", tmp.PauseQuantiles, "// []time.Duration")
+ outputTextbox.SetText(out)
+ })
+
+ g.NewButton("debug.SetTraceback('all')", func () {
+ debug.SetTraceback("all")
+ })
+
+ g.NewButton("panic()", func () {
+ panic("test")
+ })
+
+ g.NewLabel("TODO:")
+
+ g.NewButton("debug.SetMemoryLimit(int)", func () {
+ // TODO:
+ //debug.SetMemoryLimit(1024 * 1024 * 100)
+ })
+
+ g.NewButton("debug.SetMaxStack(int bytes)", func () {
+ // default is apparently 1GB
+ })
+
+ g.NewButton("debug.SetMaxThreads(int)", func () {
+ // default is apparently 10,000
+ })
+
+ g.NewButton("debug.SetTraceback('all')", func () {
+ debug.SetTraceback("all")
+ })
+
+ // deprecated (probably) by String() implementation within golang
+ g.NewButton("dumpModuleInfo() (deprecate)", func () {
+ outputTextbox.SetText(dumpModuleInfo())
+ })
+
+ og = w.NewGroup("output")
+ outputTextbox = og.NewTextbox("outputBox")
+ outputTextbox.Custom = func () {
+ log("custom TextBox() for golang output a =", outputTextbox.widget.S, outputTextbox.id)
+ }
+}
+
+func runtimeReadMemStats() string {
+ var s runtime.MemStats
+ var out string
+ runtime.ReadMemStats(&s)
+ out += fmt.Sprintln("alloc:", s.Alloc, "bytes")
+ out += fmt.Sprintln("total-alloc:", s.TotalAlloc, "bytes")
+ out += fmt.Sprintln("sys:", s.Sys, "bytes")
+ out += fmt.Sprintln("lookups:", s.Lookups)
+ out += fmt.Sprintln("mallocs:", s.Mallocs)
+ out += fmt.Sprintln("frees:", s.Frees)
+ out += fmt.Sprintln("heap-alloc:", s.HeapAlloc, "bytes")
+ out += fmt.Sprintln("heap-sys:", s.HeapSys, "bytes")
+ out += fmt.Sprintln("heap-idle:", s.HeapIdle,"bytes")
+ out += fmt.Sprintln("heap-in-use:", s.HeapInuse, "bytes")
+ out += fmt.Sprintln("heap-released:", s.HeapReleased, "bytes")
+ out += fmt.Sprintln("heap-objects:", s.HeapObjects)
+ out += fmt.Sprintln("stack-in-use:", s.StackInuse, "bytes")
+ out += fmt.Sprintln("stack-sys", s.StackSys, "bytes")
+ out += fmt.Sprintln("next-gc: when heap-alloc >=", s.NextGC, "bytes")
+ out += fmt.Sprintln("last-gc:", s.LastGC, "ns")
+ out += fmt.Sprintln("gc-pause:", s.PauseTotalNs, "ns")
+ out += fmt.Sprintln("num-gc:", s.NumGC)
+ out += fmt.Sprintln("enable-gc:", s.EnableGC)
+ out += fmt.Sprintln("debug-gc:", s.DebugGC)
+ return out
+}
+
+func dumpModuleInfo() string {
+ var out string
+ tmp, _ := debug.ReadBuildInfo()
+ if tmp == nil {
+ out += fmt.Sprintln("This wasn't compiled with go module support")
+ return ""
+ }
+ out += fmt.Sprintln("mod.Path = ", tmp.Path)
+ out += fmt.Sprintln("mod.Main.Path = ", tmp.Main.Path)
+ out += fmt.Sprintln("mod.Main.Version = ", tmp.Main.Version)
+ out += fmt.Sprintln("mod.Main.Sum = ", tmp.Main.Sum)
+ for _, value := range tmp.Deps {
+ out += fmt.Sprintln("\tmod.Path = ", value.Path)
+ out += fmt.Sprintln("\tmod.Version = ", value.Version)
+ }
+ return out
+}
diff --git a/debug_widget.go b/debug_widget.go
new file mode 100644
index 0000000..da15706
--- /dev/null
+++ b/debug_widget.go
@@ -0,0 +1,115 @@
+package gui
+
+import (
+ "strconv"
+)
+
+func DebugWidgetWindow(w *Node) {
+ var win, g *Node
+
+ title := "ID =" + strconv.Itoa(w.id) + " " + w.widget.Name
+
+ Config.Title = title
+ Config.Width = 300
+ Config.Height = 400
+ win = NewWindow()
+ win.Custom = w.StandardClose
+
+ g = win.NewGroup("Actions")
+
+ g.NewLabel(title)
+ g.NewButton("Dump()", func () {
+ w.Dump()
+ })
+ g.NewButton("Disable()", func () {
+ w.widget.Action = "Disable"
+ send(w.parent, w)
+ })
+ g.NewButton("Enable()", func () {
+ w.widget.Action = "Enable"
+ send(w.parent, w)
+ })
+ g.NewButton("Show()", func () {
+ w.widget.Action = "Show"
+ send(w.parent, w)
+ })
+ g.NewButton("Hide()", func () {
+ w.widget.Action = "Hide"
+ send(w.parent, w)
+ })
+ g.NewButton("Value()", func () {
+ log("w.B =", w.widget.B)
+ log("w.I =", w.widget.I)
+ log("w.S =", w.widget.S)
+ })
+ g.NewButton("Set Value(20)", func () {
+ w.widget.Action = "Set"
+ w.widget.B = true
+ w.widget.I = 20
+ w.widget.S = "Set Value(20)"
+ send(w.parent, w)
+ })
+ g.NewButton("Delete()", func () {
+ Delete(w)
+ })
+}
+
+func (n *Node) debugWidgets(makeWindow bool) {
+ var w, gList, gShow *Node
+
+ // Either:
+ // make a new window
+ // make a new tab in the existing window
+ if (makeWindow) {
+ Config.Title = "Widgets"
+ Config.Width = 300
+ Config.Height = 400
+ w = NewWindow()
+ w.Custom = w.StandardClose
+ } else {
+ w = n.NewTab("Widgets")
+ }
+ w.Dump()
+
+ gList = w.NewGroup("Pick a widget to debug")
+ gShow = w.NewGroup("Added Widgets go here")
+
+ gList.NewButton("Button", func () {
+ a := gShow.NewButton("myButton", func () {
+ log("this code is more better")
+ })
+ DebugWidgetWindow(a)
+ })
+ gList.NewButton("Checkbox", func () {
+ a := gShow.NewCheckbox("myCheckbox")
+ a.Custom = func () {
+ log("custom checkox func a =", a.widget.B, a.id)
+ }
+ DebugWidgetWindow(a)
+ })
+ gList.NewButton("Label", func () {
+ a := gShow.NewLabel("mylabel")
+ DebugWidgetWindow(a)
+ })
+ gList.NewButton("Textbox", func () {
+ a := gShow.NewTextbox("mytext")
+ a.Custom = func () {
+ log("custom TextBox() a =", a.widget.S, a.id)
+ }
+ DebugWidgetWindow(a)
+ })
+ gList.NewButton("Slider", func () {
+ a := gShow.NewSlider("tmp slider", 10, 55)
+ a.Custom = func () {
+ log("custom slider() a =", a.widget.S, a.id)
+ }
+ DebugWidgetWindow(a)
+ })
+ gList.NewButton("Spinner", func () {
+ a := gShow.NewSpinner("tmp spinner", 6, 32)
+ a.Custom = func () {
+ log("custom spinner() a =", a.widget.S, a.id)
+ }
+ DebugWidgetWindow(a)
+ })
+}
diff --git a/debug_window.go b/debug_window.go
index 82d7557..0ee2271 100644
--- a/debug_window.go
+++ b/debug_window.go
@@ -10,88 +10,16 @@ func DebugWindow() {
Config.Title = "go.wit.org/gui debug window"
Config.Width = 300
Config.Height = 200
- Config.Exit = StandardClose
bugWin = NewWindow()
+ bugWin.Custom = bugWin.StandardClose
bugWin.DebugTab("Debug Tab")
}
-var checkd, checkdn, checkdt, checkdtk *Node
-
-//////////////////////// debug flags //////////////////////////////////
-func debugFlags(n *Node) {
- var df, checkdn, checkdd, changeCheckbox *Node
- df = n.NewGroup("Debug Flags")
- df.NewLabel("flags to control debugging output")
-
- cb := df.NewCheckbox("debugGui")
- cb.custom = func() {
- log(true, "custom ran correctly for =", n.Name)
- debugGui = true
- }
-
- checkdd = df.NewCheckbox("debugDump")
- checkdd.custom = func() {
- log(true, "debugDump() custom ran correctly for =", n.Name)
- debugDump = true
- }
-
- checkdn = df.NewCheckbox("debugNode")
- checkdn.custom = func() {
- log(true, "debugNode() custom ran correctly for =", n.Name)
- debugNode = true
- }
-
-
- cb = df.NewCheckbox("debugChange")
- cb.custom = func() {
- log(true, "checkbox: custom() ran correctly for =", cb.Name)
- log(true, "START debugChange =", debugChange)
- if (debugChange) {
- debugChange = false
- SetDebugChange(false)
- log(true, "debugToolkitChange turned off node.Name =", cb.Name)
- } else {
- debugChange = true
- SetDebugChange(true)
- log(true, "debugToolkitChange turned on Name =", cb.Name)
- }
- log(true, "END debugChange =", debugChange)
- }
-
- cb = df.NewCheckbox("debugTabs")
- cb.custom = func() {
- log(true, "debugTabs() custom ran correctly for =", n.Name)
- debugTabs = true
- }
-
- cb = df.NewCheckbox("debugPlugin")
- cb.custom = func() {
- log(true, "debugPlugin() custom ran correctly for =", n.Name)
- debugPlugin = true
- }
-
- changeCheckbox = df.NewCheckbox("debugToolkit")
- changeCheckbox.custom = func() {
- SetDebugToolkit(true)
- }
-
- df.NewButton("Debug Toolkit", func() {
- if (debugToolkit) {
- SetDebugToolkit(false)
- log(true, "debugToolkit turned off node.Name =", n.Name)
- } else {
- SetDebugToolkit(true)
- log(true, "debugToolkit turned on Name =", n.Name)
- }
- })
-
- df.NewButton("Dump Debug Flags", func () {
- ShowDebugValues()
- })
-}
+var checkd, checkdn, checkdt, checkdtk, lb1, lb2 *Node
+var myButton *Node
func (n *Node) DebugTab(title string) *Node {
- var newN, gog, g1, g2, g3, dd *Node
+ var newN, gog, g1, g2, g3, dd, junk, newThing *Node
// time.Sleep(1 * time.Second)
newN = n.NewTab(title)
@@ -101,7 +29,13 @@ func (n *Node) DebugTab(title string) *Node {
gog = newN.NewGroup("GOLANG")
gog.NewLabel("go language")
gog.NewButton("GO Language Debug", func () {
- GolangDebugWindow()
+ newN.GolangDebugWindow(false)
+ })
+ gog.NewButton("Debug Flags", func () {
+ newN.debugFlags(false)
+ })
+ gog.NewButton("Debug Widgets", func () {
+ newN.debugWidgets(false)
})
gog.NewLabel("wit/gui package")
@@ -109,11 +43,21 @@ func (n *Node) DebugTab(title string) *Node {
// DemoToolkitWindow()
})
- debugFlags(newN)
+ junk = gog.NewButton("junk", func () {
+ log("click junk, get junk")
+ })
+
+ gog.NewLabel("tmp label")
+
//////////////////////// window debugging things //////////////////////////////////
g1 = newN.NewGroup("Current Windows")
dd = g1.NewDropdown("Window Dropdown")
+ dd.Custom = func() {
+ name := dd.widget.S
+ bugWin = mapWindows[name]
+ log("The Window was set to", name)
+ }
log(debugGui, "dd =", dd)
// initialize the windows map if it hasn't been
@@ -122,6 +66,7 @@ func (n *Node) DebugTab(title string) *Node {
}
var dump = false
+ var last = ""
for _, child := range Config.master.children {
log(debugGui, "\t\t", child.id, child.Width, child.Height, child.Name)
if (child.parent != nil) {
@@ -134,16 +79,44 @@ func (n *Node) DebugTab(title string) *Node {
child.Dump()
}
dd.AddDropdownName(child.Name)
+ last = child.Name
mapWindows[child.Name] = child
}
-
- dd.SetDropdown(0)
+ dd.SetDropdownName(last)
+ dd.NewButton("Delete(junk)", func () {
+ Delete(junk)
+ })
+ dd.NewButton("myButton", func () {
+ gog.NewButton("myButton", func () {
+ log("this code is better")
+ })
+ })
+ dd.NewButton("add Hope", func () {
+ var i int = 1
+ log("add hope?", i)
+ gog.NewButton("hope", func () {
+ i += 1
+ log("write better code", i)
+ })
+ })
+ dd.NewButton("add newThing", func () {
+ var i, j int = 1, 1
+ newThing = gog.NewThing("NewThing")
+ newThing.Custom = func() {
+ f := i + j
+ log("newThing!!! n.widget =", newThing.widget.Name, newThing.widget.B, f)
+ j = i
+ i = f
+ }
+ log("newThing!!! n.widget")
+ })
g2 = newN.NewGroup("Debug Window")
g2.NewButton("SetMargined(tab)", func () {
log(debugChange, "START SetMargined(tab)", g2.Name)
// name := dd.GetText()
- name := dd.Widget.S
+ name := dd.widget.S
+ log(true, "name =", name)
log(debugChange, "name =", name)
log(debugChange, "mapWindows[name] =", mapWindows[name])
/*
@@ -154,7 +127,7 @@ func (n *Node) DebugTab(title string) *Node {
}
*/
bugWin = mapWindows[name]
- log(debugChange, "END dd.Widget.S =", dd.Widget.S)
+ log(debugChange, "END dd.widget.S =", dd.widget.S)
// gw.UiTab.SetMargined(*gw.TabNumber, true)
})
g2.NewButton("Hide(tab)", func () {
@@ -170,6 +143,9 @@ func (n *Node) DebugTab(title string) *Node {
g2.NewButton("change Title", func () {
// mainWindow.SetText("hello world")
})
+ g2.NewButton("Quit", func () {
+ exit()
+ })
/////////////////////////////////////////////////////
g3 = newN.NewGroup("Node Debug")
diff --git a/andlabs.go b/direct.go
index 95c1ad8..95c1ad8 100644
--- a/andlabs.go
+++ b/direct.go
diff --git a/dropdown.go b/dropdown.go
index e999f7e..214cc5a 100644
--- a/dropdown.go
+++ b/dropdown.go
@@ -1,53 +1,46 @@
package gui
+import (
+ "git.wit.org/wit/gui/toolkit"
+)
+
+// add a new entry to the dropdown name
func (n *Node) AddDropdownName(name string) {
for _, aplug := range allPlugins {
- log(debugGui, "gui.AddDropdownName() aplug =", aplug.name, "name =", name)
+ log(debugPlugin, "AddDropdownName() aplug =", aplug.name, "name =", name)
if (aplug.AddDropdownName == nil) {
- log(debugGui, "\tgui.AddDropdownName() aplug.NewDropdown = nil", aplug.name)
+ log(debugPlugin, "\taplug.AddDropdownName() = nil")
continue
}
- aplug.AddDropdownName(&n.Widget, name)
- }
-
- if (n.Widget.Custom == nil) {
- n.SetDropdownChange( func() {
- log(debugChange, "gui.Dropdown change() REAL Custom() name =", name)
- log(debugChange, "gui.Dropdown change() REAL n.Widget.S =", n.Widget.S)
- })
+ aplug.AddDropdownName(&n.widget, name)
}
- // TODO, this makes functions over and over for each dropdown menu
- /*
- n.Widget.Custom = func() {
- log(debugChange, "gui.Dropdown change() START Custom() name =", name)
- log(debugChange, "gui.Dropdown change() START n.Widget.S =", n.Widget.S)
- }
- */
-}
-
-func (n *Node) SetDropdown(s any) {
- log(debugGui, "gui.SetDropdown() TODO: make this work. s =", s)
}
-func (n *Node) SetDropdownChange(f func()) {
- n.Widget.Custom = f
+// Set the dropdown menu to 'name'
+func (n *Node) SetDropdownName(name string) {
+ log(debugGui, "SetDropdownName() work. name =", name)
+ for _, aplug := range allPlugins {
+ log(debugPlugin, "SetDropdownName() aplug =", aplug.name, "name =", name)
+ if (aplug.SetDropdownName == nil) {
+ log(true, "\taplug.SetDropdownName() aplug = nil")
+ continue
+ }
+ aplug.SetDropdownName(&n.widget, name)
+ }
}
func (n *Node) NewDropdown(name string) *Node {
- newNode := n.New(name, "Dropdown")
+ newNode := n.New(name, toolkit.Dropdown, nil)
for _, aplug := range allPlugins {
- log(debugGui, "gui.NewDropdown() aplug =", aplug.name, "name =", newNode.Widget.Name)
+ log(debugGui, "gui.NewDropdown() aplug =", aplug.name, "name =", newNode.widget.Name)
if (aplug.NewDropdown == nil) {
log(debugGui, "\tgui.NewDropdown() aplug.NewDropdown = nil", aplug.name)
continue
}
- aplug.NewDropdown(&n.Widget, &newNode.Widget)
+ aplug.NewDropdown(&n.widget, &newNode.widget)
}
// TODO, this doesn't work for some reason (over-written by plugin?)
- newNode.Widget.Custom = func() {
- log(true, "gui.NewDropdown() START Custom()")
- }
return newNode
}
diff --git a/example_window_golang_debug.go b/example_window_golang_debug.go
deleted file mode 100644
index 466654a..0000000
--- a/example_window_golang_debug.go
+++ /dev/null
@@ -1,104 +0,0 @@
-package gui
-
-import (
- "os"
- "runtime"
- "runtime/debug"
- "runtime/pprof"
-)
-
-func GolangDebugWindow() {
- var w, t *Node
-
- Config.Title = "Go Language Debug Window"
- Config.Width = 400
- Config.Height = 400
- Config.Exit = StandardClose
- w = NewWindow()
-
- t = w.NewTab("Debug Tab")
- log("debugWindow() START")
-
-
- /////////////////////////////// Column DEBUG GOLANG //////////////////////
- g := t.NewGroup("GO Language")
-
- g.NewButton("runtime.Stack()", func () {
- log("\tSTART")
- buf := make([]byte, 1<<16)
- runtime.Stack(buf, true)
- log("\t %s", buf)
- log("\tEND")
- })
- g.NewButton("dumpModuleInfo()", func () {
- log("\tSTART")
- dumpModuleInfo()
- log("\tEND")
- })
- g.NewButton("debug.PrintStack()", func () {
- log("\tSTART")
- debug.PrintStack()
- log("\tEND")
- })
- g.NewButton("pprof.Lookup(goroutine)", func () {
- log("\tSTART")
- pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
- log("\tEND")
- })
- g.NewButton("pprof.Lookup(heap)", func () {
- log("\tSTART")
- pprof.Lookup("heap").WriteTo(os.Stdout, 1)
- log("\tEND")
- })
- g.NewButton("pprof.Lookup(block)", func () {
- log("\tSTART")
- pprof.Lookup("block").WriteTo(os.Stdout, 1)
- log("\tEND")
- })
- g.NewButton("pprof.Lookup threadcreate", func () {
- log("\tSTART")
- pprof.Lookup("threadcreate").WriteTo(os.Stdout, 1)
- log("\tEND")
- })
- g.NewButton("runtime.ReadMemStats", func () {
- var s runtime.MemStats
- runtime.ReadMemStats(&s)
- log("alloc: %v bytes\n", s.Alloc)
- log("total-alloc: %v bytes\n", s.TotalAlloc)
- log("sys: %v bytes\n", s.Sys)
- log("lookups: %v\n", s.Lookups)
- log("mallocs: %v\n", s.Mallocs)
- log("frees: %v\n", s.Frees)
- log("heap-alloc: %v bytes\n", s.HeapAlloc)
- log("heap-sys: %v bytes\n", s.HeapSys)
- log("heap-idle: %v bytes\n", s.HeapIdle)
- log("heap-in-use: %v bytes\n", s.HeapInuse)
- log("heap-released: %v bytes\n", s.HeapReleased)
- log("heap-objects: %v\n", s.HeapObjects)
- log("stack-in-use: %v bytes\n", s.StackInuse)
- log("stack-sys: %v bytes\n", s.StackSys)
- log("next-gc: when heap-alloc >= %v bytes\n", s.NextGC)
- log("last-gc: %v ns\n", s.LastGC)
- log("gc-pause: %v ns\n", s.PauseTotalNs)
- log("num-gc: %v\n", s.NumGC)
- log("enable-gc: %v\n", s.EnableGC)
- log("debug-gc: %v\n", s.DebugGC)
- })
-}
-
-func dumpModuleInfo() {
- tmp, _ := debug.ReadBuildInfo()
- if tmp == nil {
- log("This wasn't compiled with go module support")
- return
- }
- log("mod.Path = ", tmp.Path)
- log("mod.Main.Path = ", tmp.Main.Path)
- log("mod.Main.Version = ", tmp.Main.Version)
- log("mod.Main.Sum = ", tmp.Main.Sum)
- for _, value := range tmp.Deps {
- log("\tmod.Path = ", value.Path)
- log("\tmod.Version = ", value.Version)
- }
-}
-
diff --git a/group.go b/group.go
index 2037861..fb7ee47 100644
--- a/group.go
+++ b/group.go
@@ -1,22 +1,14 @@
package gui
+import (
+ "git.wit.org/wit/gui/toolkit"
+)
+
// TODO: which name is better. AddGroup or NewGroup ?
// first reaction is NewGroup
func (n *Node) NewGroup(name string) *Node {
var newNode *Node
- newNode = n.New(name, "Group")
-
- log(debugGui, "toolkit.NewGroup() START", name)
-
-
- log(debugGui, "gui.Node.NewGroup()", name)
- for _, aplug := range allPlugins {
- log(debugGui, "gui.Node.NewGroup() toolkit plugin =", aplug.name)
- if (aplug.NewGroup == nil) {
- continue
- }
- aplug.NewGroup(&n.Widget, &newNode.Widget)
- }
-
+ newNode = n.New(name, toolkit.Group, nil)
+ send(n, newNode)
return newNode
}
diff --git a/label.go b/label.go
index f51ce66..1e40fcd 100644
--- a/label.go
+++ b/label.go
@@ -1,19 +1,14 @@
package gui
-// import "errors"
-// import "regexp"
+import (
+ "git.wit.org/wit/gui/toolkit"
+)
func (n *Node) NewLabel(text string) *Node {
- newNode := n.New(text, "Label")
-
- for _, aplug := range allPlugins {
- log(debugGui, "gui.NewLabel() aplug =", aplug.name, "name =", newNode.Widget.Name)
- if (aplug.NewLabel == nil) {
- log(debugGui, "\tgui.NewLabel() aplug.NewLabel = nil", aplug.name)
- continue
- }
- aplug.NewLabel(&n.Widget, &newNode.Widget)
- }
+ newNode := n.New(text, toolkit.Label, func() {
+ log(debugChange, "TextBox changed", text)
+ })
+ send(n, newNode)
return newNode
}
diff --git a/log.go b/log.go
index 71e22f6..e808944 100644
--- a/log.go
+++ b/log.go
@@ -98,8 +98,9 @@ func log(a ...any) {
if (a == nil) {
return
}
- var blah bool
- if (reflect.TypeOf(a[0]) == reflect.TypeOf(blah)) {
+
+ var tbool bool
+ if (reflect.TypeOf(a[0]) == reflect.TypeOf(tbool)) {
// golog.Println("\t a[0] = bool")
if (a[0] == false) {
return
diff --git a/main.go b/main.go
index 01e15b6..d05f334 100644
--- a/main.go
+++ b/main.go
@@ -16,20 +16,31 @@ const Yaxis = 1 // stack things vertically
var res embed.FS
func init() {
- debugGui = true
- log(debugGui, "gui.init() has been run")
+ log("init() has been run")
Config.counter = 0
Config.prefix = "wit"
-
- title := "guiBinaryTree"
- w := 640
- h := 480
+ Config.Width = 640
+ Config.Height = 480
// Populates the top of the binary tree
- Config.master = addNode(title, w, h)
- // Config.master.Dump()
- debugGui = false
+ Config.master = addNode("guiBinaryTree")
+
+ go doGuiChan()
+}
+
+func doGuiChan() {
+ for {
+ select {
+ case <-Config.ActionCh1:
+ log(true, "CHANNEL ACTION 1 !!!!!")
+ return
+ case <-Config.ActionCh2:
+ log(true, "CHANNEL ACTION 2 !!!!!")
+ return
+ default:
+ }
+ }
}
func InitPlugins(names []string) {
@@ -116,21 +127,21 @@ func Queue(f func()) {
}
// The window is destroyed but the application does not quit
-func StandardClose(n *Node) {
+func (n *Node) StandardClose() {
log(debugGui, "wit/gui Standard Window Close. name =", n.Name)
- log(debugGui, "wit/gui Standard Window Close. n.custom exit =", n.custom)
+ log(debugGui, "wit/gui Standard Window Close. n.Custom exit =", n.Custom)
}
// The window is destroyed but the application does not quit
-func StandardExit(n *Node) {
- log(debugGui, "wit/gui Standard Window Exit. running os.Exit()")
- log(debugGui, "gui.Node.StandardExit() attempt to exit each toolkit plugin")
+func StandardExit() {
+ log("wit/gui Standard Window Exit. running os.Exit()")
+ log("gui.Node.StandardExit() attempt to exit each toolkit plugin")
for i, aplug := range allPlugins {
- log(debugGui, "gui.Node.NewButton()", i, aplug)
+ log("gui.Node.NewButton()", i, aplug)
if (aplug.Quit != nil) {
aplug.Quit()
}
}
- exit("StandardExit")
+ exit(0)
}
diff --git a/node.go b/node.go
index f143771..b237c78 100644
--- a/node.go
+++ b/node.go
@@ -1,15 +1,30 @@
package gui
-// import "git.wit.org/wit/gui/toolkit"
+import "git.wit.org/wit/gui/toolkit"
/*
generic function to create a new node on the binary tree
*/
-func (n *Node) New(title string, t string) *Node {
+func (n *Node) New(title string, t toolkit.WidgetType, custom func()) *Node {
var newN *Node
- newN = addNode(title, n.Width, n.Height)
- newN.Widget.Type = t
+ newN = addNode(title)
+ newN.widget.Type = t
+ newN.widget.Action = "New"
+ newN.Custom = custom
+
+ // TODO: This should not be defined for each widget. This has to be stupid
+ // or wait a second, is this where I send something to a channel?
+ newN.widget.Custom = func() {
+ if (newN.Custom == nil) {
+ log(debugChange, "newT.Custom() == nil. Not doing anything. SEND SOMETHING TO THE CHANNEL")
+ return
+ }
+ log(debugChange, "newT.Custom() START SEND SOMETHING TO THE CHANNEL widget.Name =", newN.widget.Name)
+ // send something to the channel here????
+ newN.Custom()
+ log(debugChange, "newT.Custom() END SEND SOMETHING TO THE CHANNEL widget.Name =", newN.widget.Name)
+ }
n.Append(newN)
newN.parent = n
@@ -19,20 +34,10 @@ func (n *Node) New(title string, t string) *Node {
/*
raw create function for a new node struct
*/
-func addNode(title string, width int, height int) *Node {
+func addNode(title string) *Node {
n := new(Node)
-
n.Name = title
- n.Width = width
- n.Height = height
-
- n.Widget.Name = title
- n.Widget.Width = width
- n.Widget.Height = height
-
- // no longer a string
- // id := Config.prefix + strconv.Itoa(Config.counter)
- // n.id = id
+ n.widget.Name = title
n.id = Config.counter
Config.counter += 1
diff --git a/plugin.go b/plugin.go
index a4e007a..3b558f5 100644
--- a/plugin.go
+++ b/plugin.go
@@ -26,21 +26,24 @@ type aplug struct {
MainOk bool
Init func()
- Main func(func ())
- Queue func(func ())
+ // TODO: make Main() main() and never allow the user to call it
+ // run plugin.Main() when the plugin is loaded
+ Main func(func ()) // this never returns. Each plugin must have it's own goroutine
+ Queue func(func ()) // Should this return right away? Should it wait (can it wait?)
Quit func()
- NewWindow func(*toolkit.Widget)
+ // NewWindow func(*toolkit.Widget)
+
+ // simplifies passing to the plugin
+ Send func(*toolkit.Widget, *toolkit.Widget)
+
NewButton func(*toolkit.Widget, *toolkit.Widget)
NewGroup func(*toolkit.Widget, *toolkit.Widget)
NewCheckbox func(*toolkit.Widget, *toolkit.Widget)
NewTab func(*toolkit.Widget, *toolkit.Widget)
- NewLabel func(*toolkit.Widget, *toolkit.Widget)
- NewTextbox func(*toolkit.Widget, *toolkit.Widget)
- NewSlider func(*toolkit.Widget, *toolkit.Widget)
- NewSpinner func(*toolkit.Widget, *toolkit.Widget)
NewDropdown func(*toolkit.Widget, *toolkit.Widget)
AddDropdownName func(*toolkit.Widget, string)
+ SetDropdownName func(*toolkit.Widget, string)
SetDebugToolkit func(bool)
SetDebugChange func(bool)
@@ -73,27 +76,27 @@ func LoadToolkit(name string) bool {
// newPlug.Ok = true
newPlug.name = name
- // map all the functions
+ // deprecate Init(?)
newPlug.Init = loadFuncE(&newPlug, "Init")
- newPlug.Quit = loadFuncE(&newPlug, "Quit")
- // this should be laodFuncE()
+ // should make a goroutine that never exits
newPlug.Main = loadFuncF(&newPlug, "Main")
+
+ // should send things to the goroutine above
newPlug.Queue = loadFuncF(&newPlug, "Queue")
- newPlug.NewWindow = loadFunc1(&newPlug, "NewWindow")
+ // unload the plugin and restore state
+ newPlug.Quit = loadFuncE(&newPlug, "Quit")
+
+ // Sends a widget (button, checkbox, etc) and it's parent widget
+ // This includes instructions like "Add", "Delete", "Disable", etc
+ newPlug.Send = loadFunc2(&newPlug, "Send")
- newPlug.NewButton = loadFunc2(&newPlug, "NewButton")
- newPlug.NewGroup = loadFunc2(&newPlug, "NewGroup")
- newPlug.NewCheckbox = loadFunc2(&newPlug, "NewCheckbox")
- newPlug.NewTab = loadFunc2(&newPlug, "NewTab")
- newPlug.NewLabel = loadFunc2(&newPlug, "NewLabel")
- newPlug.NewTextbox = loadFunc2(&newPlug, "NewTextbox")
- newPlug.NewSlider = loadFunc2(&newPlug, "NewSlider")
- newPlug.NewSpinner = loadFunc2(&newPlug, "NewSpinner")
+ // newPlug.NewGroup = loadFunc2(&newPlug, "NewGroup")
newPlug.NewDropdown = loadFunc2(&newPlug, "NewDropdown")
newPlug.AddDropdownName = loadFuncS(&newPlug, "AddDropdownName")
+ newPlug.SetDropdownName = loadFuncS(&newPlug, "SetDropdownName")
newPlug.SetDebugToolkit = loadFuncB(&newPlug, "SetDebugToolkit")
newPlug.SetDebugChange = loadFuncB(&newPlug, "SetDebugChange")
@@ -275,3 +278,16 @@ func loadfile(filename string) *plugin.Plugin {
log(debugGui, "plugin WORKED =", filename)
return plug
}
+
+// Sends a widget and what to do with it to the plugin
+// parent = n, child = c
+func send(p *Node, c *Node) {
+ for _, aplug := range allPlugins {
+ log(debugPlugin, "Send() aplug =", aplug.name, "name =", c.widget.Name)
+ if (aplug.Send == nil) {
+ log(debugPlugin, "\tSend() failed (aplug.Selete = nil) for", aplug.name)
+ continue
+ }
+ aplug.Send(&c.parent.widget, &c.widget)
+ }
+}
diff --git a/slider.go b/slider.go
index 35867a3..300fc8f 100644
--- a/slider.go
+++ b/slider.go
@@ -1,22 +1,16 @@
package gui
-func (n *Node) NewSlider(name string, x int, y int) *Node {
- newNode := n.New(name, "Slider")
- newNode.Widget.X = x
- newNode.Widget.Y = y
-
- newNode.Widget.Custom = func() {
- log(debugGui, "even newer clicker() name in NewSlider", newNode.Widget)
- }
+import (
+ "git.wit.org/wit/gui/toolkit"
+)
- for _, aplug := range allPlugins {
- log(debugGui, "gui.NewSlider() aplug =", aplug.name, "name =", newNode.Widget.Name)
- if (aplug.NewSlider == nil) {
- log(debugGui, "\tgui.NewSlider() aplug.NewSlider = nil", aplug.name)
- continue
- }
- aplug.NewSlider(&n.Widget, &newNode.Widget)
- }
+func (n *Node) NewSlider(name string, x int, y int) *Node {
+ newNode := n.New(name, toolkit.Slider, func() {
+ log(debugGui, "even newer clicker() name in NewSlider name =", name)
+ })
+ newNode.widget.X = x
+ newNode.widget.Y = y
+ send(n, newNode)
return newNode
}
diff --git a/spinner.go b/spinner.go
index c554701..169894d 100644
--- a/spinner.go
+++ b/spinner.go
@@ -1,22 +1,16 @@
package gui
-func (n *Node) NewSpinner(name string, x int, y int) *Node {
- newNode := n.New(name, "Spinner")
- newNode.Widget.X = x
- newNode.Widget.Y = y
-
- newNode.Widget.Custom = func() {
- log(debugGui, "even newer clicker() name in NewSpinner", newNode.Widget)
- }
+import (
+ "git.wit.org/wit/gui/toolkit"
+)
- for _, aplug := range allPlugins {
- log(debugGui, "gui.NewSpinner() aplug =", aplug.name, "name =", newNode.Widget.Name)
- if (aplug.NewSpinner == nil) {
- log(debugGui, "\tgui.NewSpinner() aplug.NewSpinner = nil", aplug.name)
- continue
- }
- aplug.NewSpinner(&n.Widget, &newNode.Widget)
- }
+func (n *Node) NewSpinner(name string, x int, y int) *Node {
+ newNode := n.New(name, toolkit.Spinner, func() {
+ log(debugGui, "even newer clicker() name in NewSpinner name =", name)
+ })
+ newNode.widget.X = x
+ newNode.widget.Y = y
+ send(n, newNode)
return newNode
}
diff --git a/structs.go b/structs.go
index 271bc0b..b3589af 100644
--- a/structs.go
+++ b/structs.go
@@ -25,8 +25,11 @@ var Config GuiConfig
type GuiArgs struct {
Toolkit []string `arg:"--toolkit" help:"The order to attempt loading plugins [gocui,andlabs,gtk,qt]"`
GuiDebug bool `arg:"--gui-debug" help:"debug the GUI"`
+ GuiVerbose bool `arg:"--gui-verbose" help:"enable all GUI flags"`
}
+// var verbose GuiArgs.GuiDebug
+
type GuiConfig struct {
// This is the master node. The Binary Tree starts here
master *Node
@@ -41,6 +44,9 @@ type GuiConfig struct {
depth int
counter int // used to make unique ID's
prefix string
+
+ ActionCh1 chan int
+ ActionCh2 chan int
}
// The Node is a binary tree. This is how all GUI elements are stored
@@ -48,7 +54,7 @@ type GuiConfig struct {
type Node struct {
id int
- Widget toolkit.Widget
+ widget toolkit.Widget
// deprecate these and use toolkit.Widget
Name string
@@ -56,16 +62,15 @@ type Node struct {
Height int
// this function is run when there are mouse or keyboard events
- OnChanged func(*Node)
+ Custom func()
parent *Node
children []*Node
// is keeping
// deprecate these things if they don't really need to exist
- custom func()
- checked bool
- text string
+ // checked bool
+ // text string
}
func (n *Node) Parent() *Node {
diff --git a/tab.go b/tab.go
index 6e2e47e..ce840b5 100644
--- a/tab.go
+++ b/tab.go
@@ -1,22 +1,15 @@
package gui
import (
+ "git.wit.org/wit/gui/toolkit"
)
// This function should make a new node with the parent and
// the 'tab' as a child
func (n *Node) NewTab(text string) *Node {
- newNode := n.New(text, "Tab")
-
- for _, aplug := range allPlugins {
- log(debugGui, "gui.NewTab() aplug =", aplug.name, "name =", newNode.Widget.Name)
- if (aplug.NewTab == nil) {
- log(debugGui, "\tgui.NewTab() aplug.NewTab = nil", aplug.name)
- continue
- }
- aplug.NewTab(&n.Widget, &newNode.Widget)
- }
+ newNode := n.New(text, toolkit.Tab, nil)
+ send(n, newNode)
return newNode
}
diff --git a/textbox.go b/textbox.go
index 376b75d..123244c 100644
--- a/textbox.go
+++ b/textbox.go
@@ -1,20 +1,14 @@
package gui
-func (n *Node) NewTextbox(name string) *Node {
- newNode := n.New(name, "Textbox")
-
- newNode.Widget.Custom = func() {
- log(debugGui, "wit/gui clicker()NewTextBox BUT IS EMPTY. FIXME", newNode.Widget)
- }
+import (
+ "git.wit.org/wit/gui/toolkit"
+)
- for _, aplug := range allPlugins {
- log(debugGui, "gui.NewTextbox() aplug =", aplug.name, "name =", newNode.Widget.Name)
- if (aplug.NewTextbox == nil) {
- log(debugGui, "\tgui.NewTextbox() aplug.NewTextbox = nil", aplug.name)
- continue
- }
- aplug.NewTextbox(&n.Widget, &newNode.Widget)
- }
+func (n *Node) NewTextbox(name string) *Node {
+ newNode := n.New(name, toolkit.Textbox, func() {
+ log(debugGui, "wit/gui clicker()NewTextBox BUT IS EMPTY. FIXME name =", name)
+ })
+ send(n, newNode)
return newNode
}
diff --git a/toolkit/andlabs/box.go b/toolkit/andlabs/box.go
index 463b89a..430e78e 100644
--- a/toolkit/andlabs/box.go
+++ b/toolkit/andlabs/box.go
@@ -11,7 +11,7 @@ func (t *andlabsT) GetBox() *ui.Box {
// create a new box
func (t *andlabsT) NewBox() *andlabsT {
log(debugToolkit, "gui.Toolbox.NewBox() START create default")
- t.Dump()
+ t.Dump(debugToolkit)
if (t.uiGroup != nil) {
log(debugToolkit, "\tgui.Toolbox.NewBox() is a Group")
var newTK andlabsT
@@ -49,6 +49,6 @@ func (t *andlabsT) NewBox() *andlabsT {
return &newT
}
log(debugToolkit, "\tgui.Toolbox.NewBox() FAILED. Couldn't figure out where to make a box")
- t.Dump()
+ t.Dump(debugToolkit)
return nil
}
diff --git a/toolkit/andlabs/button.go b/toolkit/andlabs/button.go
index 9933e1f..deb34fa 100644
--- a/toolkit/andlabs/button.go
+++ b/toolkit/andlabs/button.go
@@ -7,7 +7,7 @@ import (
"git.wit.org/wit/gui/toolkit"
)
-func NewButton(parentW *toolkit.Widget, w *toolkit.Widget) {
+func newButton(parentW *toolkit.Widget, w *toolkit.Widget) {
var t, newt *andlabsT
var b *ui.Button
log(debugToolkit, "gui.andlabs.NewButton()", w.Name)
@@ -25,19 +25,11 @@ func NewButton(parentW *toolkit.Widget, w *toolkit.Widget) {
b = ui.NewButton(w.Name)
newt.uiButton = b
+ newt.tw = w
+ newt.parent = t
b.OnClicked(func(*ui.Button) {
- log(debugChange, "TODO: SHOULD LEAVE Button click HERE VIA channels. button name =", w.Name)
- log(debugChange, "FOUND WIDGET =", w)
- if (w.Custom == nil) {
- log(debugChange, "WIDGET DOES NOT have Custom()")
- log(debugChange, "TODO: NOTHING TO DO button name =", w.Name)
- return
- }
- // t.Dump()
- // newt.Dump()
- log(debugChange, "Running w.Custom()")
- w.Custom()
+ newt.commonChange(newt.tw)
})
log(debugToolkit, "gui.Toolbox.NewButton() about to append to Box parent t:", w.Name)
@@ -55,3 +47,41 @@ func NewButton(parentW *toolkit.Widget, w *toolkit.Widget) {
mapWidgetsToolkits(w, newt)
}
+
+func doButton(p *toolkit.Widget, c *toolkit.Widget) {
+ if broken(c) {
+ return
+ }
+ if (c.Action == "New") {
+ newButton(p, c)
+ return
+ }
+ ct := mapToolkits[c]
+ if (ct == nil) {
+ log(true, "Trying to do something on a widget that doesn't work or doesn't exist or something", c)
+ return
+ }
+ if ct.broken() {
+ log(true, "Button() ct.broken", ct)
+ return
+ }
+ if (ct.uiButton == nil) {
+ log(true, "Button() uiButton == nil", ct)
+ return
+ }
+ log(true, "Going to attempt:", c.Action)
+ switch c.Action {
+ case "Enable":
+ ct.uiButton.Enable()
+ case "Disable":
+ ct.uiButton.Disable()
+ case "Show":
+ ct.uiButton.Show()
+ case "Hide":
+ ct.uiButton.Hide()
+ case "Set":
+ ct.uiButton.SetText(c.S)
+ default:
+ log(true, "Can't do", c.Action, "to a Button")
+ }
+}
diff --git a/toolkit/andlabs/checkbox.go b/toolkit/andlabs/checkbox.go
index 5466d17..29a8e4d 100644
--- a/toolkit/andlabs/checkbox.go
+++ b/toolkit/andlabs/checkbox.go
@@ -1,36 +1,29 @@
package main
-import "git.wit.org/wit/gui/toolkit"
+import (
+ "git.wit.org/wit/gui/toolkit"
+ "github.com/andlabs/ui"
+ _ "github.com/andlabs/ui/winmanifest"
+)
-import "github.com/andlabs/ui"
-import _ "github.com/andlabs/ui/winmanifest"
-
-func (t andlabsT) NewCheckbox(name string, f func()) *andlabsT {
- log(debugToolkit, "gui.Toolkit.NewCheckbox()", name)
+func (t andlabsT) NewCheckbox(w *toolkit.Widget) *andlabsT {
+ log(debugToolkit, "NewCheckbox()", w.Name, w.Type)
var newt andlabsT
+ newt.tw = w
if t.broken() {
return nil
}
- c := ui.NewCheckbox(name)
+ c := ui.NewCheckbox(w.Name)
newt.uiCheckbox = c
newt.uiBox = t.uiBox
t.uiBox.Append(c, stretchy)
- // newt.Custom = f
c.OnToggled(func(spin *ui.Checkbox) {
- // log(debugToolkit, "gui.Toolkit.NewCheckbox() clicked", name)
- newt.commonChange("Checkbox")
- /*
- if (f != nil) {
- log(debugToolkit, "Run custom() here", f)
- log(SPEW, f)
- f()
- } else {
- log(debugToolkit, "No custom() function here")
- }
- */
+ newt.tw.B = newt.Checked()
+ log(debugChange, "val =", newt.tw.B)
+ newt.commonChange(newt.tw)
})
return &newt
@@ -45,25 +38,52 @@ func (t andlabsT) Checked() bool {
}
func NewCheckbox(parentW *toolkit.Widget, w *toolkit.Widget) {
- log(debugToolkit, "gui.andlabs.NewCheckbox()", w.Name)
+ log(debugToolkit, "NewCheckbox()", w.Name)
t := mapToolkits[parentW]
if (t == nil) {
- listMap()
- }
- newt := t.NewCheckbox(w.Name, w.Custom)
- newt.Custom = w.Custom
- /*
- if (w.Custom != nil) {
- log(true, "go.andlabs.NewCheckbox() toolkit struct == nil. name=", parentW.Name, w.Name)
- log(true, "Run custom() START here", w.Custom)
- w.Custom()
- log(true, "Run custom() END")
- // exit("ran it here")
- } else {
- log(true, "No custom() function here")
- // exit("nothing here")
+ listMap(debugError)
+ return
}
- */
+ newt := t.NewCheckbox(w)
mapWidgetsToolkits(w, newt)
}
+
+func doCheckbox(p *toolkit.Widget, c *toolkit.Widget) {
+ if broken(c) {
+ return
+ }
+ if (c.Action == "New") {
+ NewCheckbox(p, c)
+ return
+ }
+ ct := mapToolkits[c]
+ if (ct == nil) {
+ log(true, "Trying to do something on a widget that doesn't work or doesn't exist or something", c)
+ return
+ }
+ if ct.broken() {
+ log(true, "checkbox() ct.broken", ct)
+ return
+ }
+ if (ct.uiCheckbox == nil) {
+ log(true, "checkbox() uiCheckbox == nil", ct)
+ return
+ }
+ log(true, "Going to attempt:", c.Action)
+ switch c.Action {
+ case "Enable":
+ ct.uiCheckbox.Enable()
+ case "Disable":
+ ct.uiCheckbox.Disable()
+ case "Show":
+ ct.uiCheckbox.Show()
+ case "Hide":
+ ct.uiCheckbox.Hide()
+ case "Set":
+ ct.uiCheckbox.SetText(c.S)
+ ct.uiCheckbox.SetChecked(c.B)
+ default:
+ log(true, "Can't do", c.Action, "to a checkbox")
+ }
+}
diff --git a/toolkit/andlabs/common.go b/toolkit/andlabs/common.go
index 94e19e1..31b73e6 100644
--- a/toolkit/andlabs/common.go
+++ b/toolkit/andlabs/common.go
@@ -1,5 +1,9 @@
package main
+import (
+ "git.wit.org/wit/gui/toolkit"
+)
+
// This is important. This sets the defaults for the gui. Without this, there isn't correct padding, etc
func init() {
// Can you pass values to a plugin init() ? Otherwise, there is no way to safely print
@@ -7,79 +11,52 @@ func init() {
setDefaultBehavior(true)
}
-func (t andlabsT) commonChange(widget string) {
- s := t.String()
- log(debugChange, "commonChange() START widget =", widget)
- log(debugChange, "commonChange() t.String =", s)
- if (t.OnChanged != nil) {
- // log(debugChange, "commonChange() toolkit.OnChanged() START")
- // t.OnChanged(&t)
- exit("OnChanged is not implemented. TODO: FIX THIS")
- return
- }
- if (t.Custom != nil) {
- log(debugChange, "commonChange() START toolkit.Custom()")
- t.Custom()
- log(debugChange, "commonChange() END toolkit.Custom()")
- return
- }
- if (widget == "Checkbox") {
- log(debugChange, "commonChange() END Need to read the Checkbox value")
+func (t andlabsT) commonChange(tw *toolkit.Widget) {
+ log(debugChange, "commonChange() START widget =", t.Name, t.Type)
+ if (tw == nil) {
+ log(true, "commonChange() What the fuck. there is no widget t.tw == nil")
return
}
- if (widget == "Dropdown") {
- t.getDropdown()
- if (t.tw == nil) {
- log(debugChange, "commonChange() END tw.Custom == nil")
- }
- if (t.tw.Custom == nil) {
- log(debugChange, "commonChange() END Dropdown (no custom())")
- }
- t.tw.Custom()
- log(debugChange, "commonChange() END Dropdown")
+ if (tw.Custom == nil) {
+ log(debugChange, "commonChange() END Widget.Custom() = nil", t.tw.Name, t.tw.Type)
return
}
- log(debugChange, "commonChange() t.String =", s)
- log(debugChange, "commonChange() ENDED without finding any callback")
-}
-
-func (t *andlabsT) getDropdown() {
- log(debugChange, "commonChange() Need to read the dropdown menu")
- if (t.uiCombobox == nil) {
- log(debugChange, "commonChange() END BAD NEWS. t.uiCombobox == nil")
- return
- }
- i := t.uiCombobox.Selected()
- log(debugChange, "commonChange() t.uiCombobox = ", i)
- if (t.tw == nil) {
- log(debugChange, "commonChange() END tw = nil")
- return
- }
- t.tw.S = t.String()
- log(debugChange, "commonChange() END tw = ", t.tw)
- return
+ tw.Custom()
+ log(debugChange, "commonChange() END Widget.Custom()", t.tw.Name, t.tw.Type)
}
// does some sanity checks on the internal structs of the binary tree
// TODO: probably this should not panic unless it's running in devel mode (?)
+// TODO: redo this now that WidgetType is used and send() is used to package plugins
func (t *andlabsT) broken() bool {
+ if (t.parent != nil) {
+ return false
+ }
if (t.uiBox == nil) {
if (t.uiWindow != nil) {
- log(debugToolkit, "gui.Toolkit.UiBox == nil. This is an empty window. Try to add a box")
+ log(debugToolkit, "UiBox == nil. This is an empty window. Try to add a box")
t.NewBox()
return false
}
- log(debugToolkit, "gui.Toolkit.UiBox == nil. I can't add a widget without a place to put it")
+ log(true, "UiBox == nil. I can't add a widget without a place to put it")
// log(debugToolkit, "probably could just make a box here?")
// corruption or something horrible?
+ t.Dump(true)
panic("wit/gui toolkit/andlabs func broken() invalid goroutine access into this toolkit?")
panic("wit/gui toolkit/andlabs func broken() this probably should not cause the app to panic here (?)")
return true
}
if (t.uiWindow == nil) {
- log(debugToolkit, "gui.Toolkit.UiWindow == nil. I can't add a widget without a place to put it (IGNORING FOR NOW)")
- forceDump(t)
+ log(debugToolkit, "UiWindow == nil. I can't add a widget without a place to put it (IGNORING FOR NOW)")
+ t.Dump(debugToolkit)
return false
}
return false
}
+func broken(w *toolkit.Widget) bool {
+ if (w == nil) {
+ log(true, "widget == nil. I can't do anything widget")
+ return true
+ }
+ return false
+}
diff --git a/toolkit/andlabs/debug.go b/toolkit/andlabs/debug.go
index 9b7e160..befbaa0 100644
--- a/toolkit/andlabs/debug.go
+++ b/toolkit/andlabs/debug.go
@@ -1,6 +1,6 @@
package main
-// import "git.wit.org/wit/gui/toolkit"
+import "git.wit.org/wit/gui/toolkit"
import "github.com/davecgh/go-spew/spew"
@@ -15,6 +15,8 @@ var margin bool // add space around the frames of windows
var debugToolkit bool
var debugChange bool
+var debugPlugin bool
+var debugError bool = true
// var DebugToolkit bool
// This is important. This sets the defaults for the gui. Without this, there isn't correct padding, etc
@@ -59,42 +61,35 @@ func (t *andlabsT) String() string {
return t.GetText()
}
-func forceDump(t *andlabsT) {
- tmp := debugToolkit
- debugToolkit = true
- t.Dump()
- debugToolkit = tmp
-}
-
func (t *andlabsT) GetText() string {
- log(debugToolkit, "gui.Toolkit.GetText() Enter debugToolkit=", debugToolkit)
+ log(debugToolkit, "GetText() Enter debugToolkit=", debugToolkit)
if (t.uiEntry != nil) {
- log(debugToolkit, "gui.Toolkit.uiEntry.Text() =", t.uiEntry.Text())
+ log(debugToolkit, "uiEntry.Text() =", t.uiEntry.Text())
return t.uiEntry.Text()
}
if (t.uiMultilineEntry != nil) {
- log(debugToolkit, "gui.Toolkit.uiMultilineEntry.Text() =", t.uiMultilineEntry.Text())
+ log(debugToolkit, "uiMultilineEntry.Text() =", t.uiMultilineEntry.Text())
text := t.uiMultilineEntry.Text()
- log(debugToolkit, "gui.Toolkit.uiMultilineEntry.Text() =", text)
+ log(debugToolkit, "uiMultilineEntry.Text() =", text)
t.text = text
return text
}
if (t.uiCombobox != nil) {
- log(debugToolkit, "gui.Toolkit.uiCombobox() =", t.text)
+ log(debugToolkit, "uiCombobox() =", t.text)
return t.text
}
return ""
}
func (t *andlabsT) SetText(s string) bool {
- log(debugToolkit, "gui.Toolkit.Text() SetText() Enter")
+ log(debugToolkit, "Text() SetText() Enter")
if (t.uiEntry != nil) {
- log(debugToolkit, "gui.Toolkit.Value() =", t.uiEntry.Text)
+ log(debugToolkit, "Value() =", t.uiEntry.Text)
t.uiEntry.SetText(s)
return true
}
if (t.uiMultilineEntry != nil) {
- log(debugToolkit, "gui.Toolkit.Value() =", t.uiMultilineEntry.Text)
+ log(debugToolkit, "Value() =", t.uiMultilineEntry.Text)
t.uiMultilineEntry.SetText(s)
return true
}
@@ -103,91 +98,101 @@ func (t *andlabsT) SetText(s string) bool {
func sanity(t *andlabsT) bool {
if (debugToolkit) {
- log(debugToolkit, "gui.Toolkit.Value() Enter")
+ log(debugToolkit, "Value() Enter")
scs := spew.ConfigState{MaxDepth: 1}
scs.Dump(t)
}
if (t.uiEntry == nil) {
- log(debugToolkit, "gui.Toolkit.Value() =", t.uiEntry.Text)
+ log(debugToolkit, "Value() =", t.uiEntry.Text)
return false
}
return true
}
func (t *andlabsT) SetValue(i int) bool {
- log(debugToolkit, "gui.Toolkit.SetValue() START")
+ log(debugToolkit, "SetValue() START")
if (sanity(t)) {
return false
}
- t.Dump()
+ t.Dump(debugToolkit)
// panic("got to toolkit.SetValue")
return true
}
func (t *andlabsT) Value() int {
if (debugToolkit) {
- log(debugToolkit, "gui.Toolkit.Value() Enter")
+ log(debugToolkit, "Value() Enter")
scs := spew.ConfigState{MaxDepth: 1}
scs.Dump(t)
}
if (t == nil) {
- log(debugToolkit, "gui.Toolkit.Value() can not get value t == nil")
+ log(debugToolkit, "Value() can not get value t == nil")
return 0
}
if (t.uiSlider != nil) {
- log(debugToolkit, "gui.Toolkit.Value() =", t.uiSlider.Value)
+ log(debugToolkit, "Value() =", t.uiSlider.Value)
return t.uiSlider.Value()
}
if (t.uiSpinbox != nil) {
- log(debugToolkit, "gui.Toolkit.Value() =", t.uiSpinbox.Value)
+ log(debugToolkit, "Value() =", t.uiSpinbox.Value)
return t.uiSpinbox.Value()
}
- log(debugToolkit, "gui.Toolkit.Value() Could not find a ui element to get a value from")
+ log(debugToolkit, "Value() Could not find a ui element to get a value from")
return 0
}
-func (t *andlabsT) Dump() {
- if ! debugToolkit {
+func (t *andlabsT) Dump(b bool) {
+ if ! b {
return
}
- log(debugToolkit, "gui.Toolkit.Dump() Name = ", t.Name, t.Width, t.Height)
+ log(b, "Name = ", t.Name, t.Width, t.Height)
if (t.uiBox != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() uiBox =", t.uiBox)
+ log(b, "uiBox =", t.uiBox)
}
if (t.uiButton != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() uiButton =", t.uiButton)
+ log(b, "uiButton =", t.uiButton)
}
if (t.uiCombobox != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() uiCombobox =", t.uiCombobox)
+ log(b, "uiCombobox =", t.uiCombobox)
}
if (t.uiWindow != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() uiWindow =", t.uiWindow)
+ log(b, "uiWindow =", t.uiWindow)
}
if (t.uiTab != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() uiTab =", t.uiTab)
+ log(b, "uiTab =", t.uiTab)
}
if (t.uiGroup != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() uiGroup =", t.uiGroup)
+ log(b, "uiGroup =", t.uiGroup)
}
if (t.uiEntry != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() uiEntry =", t.uiEntry)
+ log(b, "uiEntry =", t.uiEntry)
}
if (t.uiMultilineEntry != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() uiMultilineEntry =", t.uiMultilineEntry)
+ log(b, "uiMultilineEntry =", t.uiMultilineEntry)
}
if (t.uiSlider != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() uiSlider =", t.uiSlider)
+ log(b, "uiSlider =", t.uiSlider)
}
if (t.uiCheckbox != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() uiCheckbox =", t.uiCheckbox)
+ log(b, "uiCheckbox =", t.uiCheckbox)
}
- if (t.OnExit != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() OnExit =", t.OnExit)
- }
- if (t.Custom != nil) {
- log(debugToolkit, "gui.Toolkit.Dump() Custom =", t.Custom)
+ widgetDump(b, t.tw)
+}
+
+func widgetDump(b bool, w *toolkit.Widget) {
+ if (w == nil) {
+ log(b, "widget = nil")
+ return
}
- log(debugToolkit, "gui.Toolkit.Dump() c =", t.c)
- log(debugToolkit, "gui.Toolkit.Dump() val =", t.val)
- log(debugToolkit, "gui.Toolkit.Dump() text =", t.text)
+
+ log(b, "widget.Name =", w.Name)
+ log(b, "widget.Action =", w.Action)
+ log(b, "widget.Type =", w.Type)
+ log(b, "widget.Custom =", w.Custom)
+ log(b, "widget.B =", w.B)
+ log(b, "widget.I =", w.I)
+ log(b, "widget.Width =", w.Width)
+ log(b, "widget.Height =", w.Height)
+ log(b, "widget.X =", w.X)
+ log(b, "widget.Y =", w.Y)
}
diff --git a/toolkit/andlabs/dropdown.go b/toolkit/andlabs/dropdown.go
index 2691a62..935741c 100644
--- a/toolkit/andlabs/dropdown.go
+++ b/toolkit/andlabs/dropdown.go
@@ -1,20 +1,20 @@
package main
-import "github.com/andlabs/ui"
-import _ "github.com/andlabs/ui/winmanifest"
+import (
+ "github.com/andlabs/ui"
+ _ "github.com/andlabs/ui/winmanifest"
+ "git.wit.org/wit/gui/toolkit"
+)
-import "git.wit.org/wit/gui/toolkit"
-
-func (t *andlabsT) NewDropdown(title string) *andlabsT {
- // make new node here
+func (t *andlabsT) NewDropdown(w *toolkit.Widget) *andlabsT {
var newt andlabsT
-
- log(debugToolkit, "gui.Toolbox.NewDropdownCombobox()", title)
+ log(debugToolkit, "gui.Toolbox.NewDropdown() START", w.Name)
if t.broken() {
return nil
}
+ newt.tw = w
s := ui.NewCombobox()
newt.uiCombobox = s
newt.uiBox = t.uiBox
@@ -27,11 +27,11 @@ func (t *andlabsT) NewDropdown(title string) *andlabsT {
s.OnSelected(func(spin *ui.Combobox) {
i := spin.Selected()
if (newt.val == nil) {
- log(debugToolkit, "make map didn't work")
+ log(debugChange, "make map didn't work")
newt.text = "error"
}
- newt.text = newt.val[i]
- newt.commonChange("Dropdown")
+ newt.tw.S = newt.val[i]
+ newt.commonChange(newt.tw)
})
return &newt
@@ -44,6 +44,12 @@ func (t *andlabsT) AddDropdownName(title string) {
return
}
t.val[t.c] = title
+
+ // If this is the first menu added, set the dropdown to it
+ if (t.c == 0) {
+ log(debugChange, "THIS IS THE FIRST Dropdown", title)
+ t.uiCombobox.SetSelected(1)
+ }
t.c = t.c + 1
}
@@ -57,11 +63,10 @@ func NewDropdown(parentW *toolkit.Widget, w *toolkit.Widget) {
t := mapToolkits[parentW]
if (t == nil) {
log(debugToolkit, "go.andlabs.NewDropdown() toolkit struct == nil. name=", parentW.Name, w.Name)
- listMap()
+ listMap(debugToolkit)
+ return
}
- newt := t.NewDropdown(w.Name)
- newt.Custom = w.Custom
- newt.tw = w
+ newt := t.NewDropdown(w)
mapWidgetsToolkits(w, newt)
}
@@ -71,18 +76,21 @@ func AddDropdownName(w *toolkit.Widget, s string) {
t := mapToolkits[w]
if (t == nil) {
log(debugToolkit, "go.andlabs.AddDropdownName() toolkit struct == nil. name=", w.Name, s)
- listMap()
+ listMap(debugToolkit)
+ return
}
t.AddDropdownName(s)
}
-func SetDropdown(w *toolkit.Widget, i int) {
- log(debugToolkit, "gui.andlabs.SetDropdown()", i)
+func SetDropdownName(w *toolkit.Widget, s string) {
+ log(debugChange, "gui.andlabs.SetDropdown()", w.Name, ",", s)
t := mapToolkits[w]
if (t == nil) {
- log(debugToolkit, "go.andlabs.SetDropdown() toolkit struct == nil. name=", w.Name, i)
- listMap()
+ log(debugError, "ERROR: SetDropdown() FAILED mapToolkits[w] == nil. name=", w.Name, s)
+ listMap(debugError)
+ return
}
- t.SetDropdown(i)
+ t.SetDropdown(1)
+ t.tw.S = s
}
diff --git a/toolkit/andlabs/group.go b/toolkit/andlabs/group.go
index 1762b7f..613efb6 100644
--- a/toolkit/andlabs/group.go
+++ b/toolkit/andlabs/group.go
@@ -7,13 +7,13 @@ import (
_ "github.com/andlabs/ui/winmanifest"
)
-func NewGroup(parentW *toolkit.Widget, w *toolkit.Widget) {
+func newGroup(parentW *toolkit.Widget, w *toolkit.Widget) {
log(debugToolkit, "gui.andlabs.NewGroup()", w.Name)
t := mapToolkits[parentW]
if (t == nil) {
log(debugToolkit, "go.andlabs.NewGroup() toolkit struct == nil. name=", parentW.Name, w.Name)
- listMap()
+ listMap(debugToolkit)
}
newt := t.NewGroup(w.Name)
mapWidgetsToolkits(w, newt)
@@ -23,18 +23,23 @@ func NewGroup(parentW *toolkit.Widget, w *toolkit.Widget) {
func (t andlabsT) NewGroup(title string) *andlabsT {
var newt andlabsT
- log(debugToolkit, "gui.Toolbox.NewGroup() create", title)
+ log(debugToolkit, "NewGroup() create", title)
g := ui.NewGroup(title)
g.SetMargined(margin)
if (t.uiBox != nil) {
- t.uiBox.Append(g, stretchy)
+ // TODO: temporary hack to make the output textbox 'fullscreen'
+ if (title == "output") {
+ t.uiBox.Append(g, true)
+ } else {
+ t.uiBox.Append(g, stretchy)
+ }
} else if (t.uiWindow != nil) {
t.uiWindow.SetChild(g)
} else {
- log(debugToolkit, "gui.ToolboxNode.NewGroup() node.UiBox == nil. I can't add a range UI element without a place to put it")
- log(debugToolkit, "probably could just make a box here?")
+ log(debugError, "NewGroup() node.UiBox == nil. I can't add a range UI element without a place to put it")
+ log(debugError, "probably could just make a box here?")
exit("internal wit/gui error")
}
@@ -47,8 +52,5 @@ func (t andlabsT) NewGroup(title string) *andlabsT {
newt.uiWindow = t.uiWindow
newt.Name = title
- t.Dump()
- newt.Dump()
- // panic("toolkit.NewGroup")
return &newt
}
diff --git a/toolkit/andlabs/label.go b/toolkit/andlabs/label.go
index e990b42..6bdd9b2 100644
--- a/toolkit/andlabs/label.go
+++ b/toolkit/andlabs/label.go
@@ -7,66 +7,74 @@ import (
"git.wit.org/wit/gui/toolkit"
)
-var pwLabel *toolkit.Widget
-var wLabel *toolkit.Widget
-var tmpNewt *andlabsT
+func newLabel(parentW *toolkit.Widget, w *toolkit.Widget) {
+ var newt *andlabsT
+ log(debugToolkit, "NewLabel()", w.Name)
-func NewLabel(parentW *toolkit.Widget, w *toolkit.Widget) {
- pwLabel = parentW
- wLabel = w
- tmpNewt = new(andlabsT)
- tmpNewt.Width = 10
- log(debugToolkit, "mapWidgets in ui.QueueMain() START newt =", tmpNewt.Width, tmpNewt)
- if (tmpNewt == nil) {
- log(debugToolkit, "mapWidgets WHY THE HELL IS THIS NIL?", tmpNewt.Width, tmpNewt)
- }
- ui.QueueMain(newLabel)
-
- log(true, "sleep(.2) HACK. TODO: wrap spinlock around andlabs.ui goroutine")
- // log(true, "sleep(.2) HACK. TODO: verify newLabel() is running inside andlabs/ui goroutine") // verified that worked
- sleep(.2)
- log(debugToolkit, "mapWidgets parentW/wLabel =", pwLabel)
- log(debugToolkit, "mapWidgets new/newt =", tmpNewt)
- mapWidgetsToolkits(w, tmpNewt)
-
- /*
t := mapToolkits[parentW]
if (t == nil) {
- log(debugToolkit, "go.andlabs.NewDropdown() toolkit struct == nil. name=", parentW.Name, w.Name)
- listMap()
- }
- newt := t.NewDropdown(w.Name)
- mapWidgetsToolkits(w, newt)
- */
-}
-
-func newLabel() {
- var t, newt *andlabsT
- log(debugToolkit, "gui.andlabs.NewButton()", wLabel.Name)
-
- t = mapToolkits[pwLabel]
- if (t == nil) {
- log(debugToolkit, "go.andlabs.NewButton() toolkit struct == nil. name=", pwLabel.Name, wLabel.Name)
+ listMap(debugError)
+ log(debugError, "ERROR newLabel() listMap()")
+ log(debugError, "ERROR FFFFFFFFFFFF listMap()")
+ log(debugError, "ERROR FFFFFFFFFFFF listMap()")
return
}
+ log(debugToolkit, "NewLabel()", w.Name)
if t.broken() {
return
}
- newt = tmpNewt
- newt.uiLabel = ui.NewLabel(wLabel.Name)
+ newt = new(andlabsT)
+
+ c := ui.NewLabel(w.Name + " FIX")
+ newt.uiLabel = c
+
newt.uiBox = t.uiBox
+ newt.tw = w
+ if (defaultBehavior) {
+ t.uiBox.Append(c, stretchy)
+ }
+
+ mapWidgetsToolkits(w, newt)
+}
- log(debugToolkit, "gui.Toolbox.NewButton() about to append to Box parent t:", wLabel.Name)
- t.Dump()
- log(debugToolkit, "gui.Toolbox.NewButton() about to append to Box new t:", wLabel.Name)
- newt.Dump()
- if (t.uiBox != nil) {
- t.uiBox.Append(newt.uiLabel, false)
- } else {
- log(debugToolkit, "ERROR: wit/gui andlabs couldn't place this label in a box")
+func doLabel(p *toolkit.Widget, c *toolkit.Widget) {
+ if broken(c) {
+ return
+ }
+ if (c.Action == "New") {
+ newLabel(p, c)
+ return
+ }
+ ct := mapToolkits[c]
+ if (ct == nil) {
+ log(true, "Trying to do something on a widget that doesn't work or doesn't exist or something", c)
+ return
+ }
+ if ct.broken() {
+ log(true, "Label() ct.broken", ct)
return
}
+ if (ct.uiLabel == nil) {
+
+ log(true, "Label() uiLabel == nil", ct)
+ return
+ }
+ log(true, "Going to attempt:", c.Action)
+ switch c.Action {
+ case "Enable":
+ ct.uiLabel.Enable()
+ case "Disable":
+ ct.uiLabel.Disable()
+ case "Show":
+ ct.uiLabel.Show()
+ case "Hide":
+ ct.uiLabel.Hide()
+ case "Set":
+ ct.uiLabel.SetText(c.S)
+ default:
+ log(true, "Can't do", c.Action, "to a Label")
+ }
}
diff --git a/toolkit/andlabs/log.go b/toolkit/andlabs/log.go
index fff5ba8..98b4e54 100644
--- a/toolkit/andlabs/log.go
+++ b/toolkit/andlabs/log.go
@@ -98,9 +98,8 @@ func log(a ...any) {
if (a == nil) {
return
}
- var blah bool
- if (reflect.TypeOf(a[0]) == reflect.TypeOf(blah)) {
- // golog.Println("\t a[0] = bool")
+ var tbool bool
+ if (reflect.TypeOf(a[0]) == reflect.TypeOf(tbool)) {
if (a[0] == false) {
return
}
@@ -111,7 +110,9 @@ func log(a ...any) {
// a = a[1:]
a[0] = "WIT/GUI/Toolkit"
if (debugToolkit) {
- spew.Dump(a)
+ scs := spew.ConfigState{MaxDepth: 1}
+ scs.Dump(a)
+ // spew.Dump(a)
}
return
}
diff --git a/toolkit/andlabs/main.go b/toolkit/andlabs/main.go
index 73aaad5..a72821a 100644
--- a/toolkit/andlabs/main.go
+++ b/toolkit/andlabs/main.go
@@ -32,20 +32,19 @@ func Main(f func()) {
// For example: Queue(NewWindow())
//
func Queue(f func()) {
- log(debugToolkit, "Sending function to ui.QueueMain() (using gtk via andlabs/ui)")
- log("THIS MIGHT BREAK")
+ log(debugToolkit, "Sending function to ui.QueueMain()")
+ log(true, "THIS DOES BREAK. TODO: wrap this")
ui.QueueMain(f)
// f()
}
func Init() {
- log(debugToolkit, "should Init() here")
+ log(debugToolkit, "Init()")
mapWidgets = make(map[*andlabsT]*toolkit.Widget)
mapToolkits = make(map[*toolkit.Widget]*andlabsT)
}
func Quit() {
- log(debugToolkit, "should Quit() here")
- // myExit(nil)
+ log(debugToolkit, "Quit() TODO: close the toolkit cleanly")
}
diff --git a/toolkit/andlabs/plugin.go b/toolkit/andlabs/plugin.go
index 5165178..5bc40a0 100644
--- a/toolkit/andlabs/plugin.go
+++ b/toolkit/andlabs/plugin.go
@@ -1,49 +1,104 @@
package main
-import (
- "git.wit.org/wit/gui/toolkit"
-)
+// if you include more than just this import
+// then your plugin might be doing something un-ideal (just a guess from 2023/02/27)
+import "git.wit.org/wit/gui/toolkit"
-// This is a map between the widgets in wit/gui and the internal structures of gocui
+// import "github.com/andlabs/ui"
+// import _ "github.com/andlabs/ui/winmanifest"
-var mapWidgets map[*andlabsT]*toolkit.Widget
-var mapToolkits map[*toolkit.Widget]*andlabsT
-
-// This lists out the know mappings
-func listMap() {
- log(debugToolkit, "listMap() HERE")
- log(debugToolkit, "listMap() HERE")
- log(debugToolkit, "listMap() HERE mapWidgets()")
- for t, w := range mapWidgets {
- log(debugToolkit, "andlabs =", t.Name, "widget =", w.Name)
+//
+// This should be called ?
+// Pass() ?
+// This handles all interaction between the wit/gui package (what golang knows about)
+// and this plugin that talks to the OS and does scary and crazy things to make
+// a GUI on whatever OS or whatever GUI toolkit you might have (GTK, QT, WASM, libcurses)
+//
+// Once you are here, you should be in a protected goroutine created by the golang wit/gui package
+//
+// TODO: make sure you can't escape this goroutine
+//
+func Send(p *toolkit.Widget, c *toolkit.Widget) {
+ if (p == nil) {
+ log(debugPlugin, "Send() parent = nil")
+ } else {
+ log(debugPlugin, "Send() parent =", p.Name, ",", p.Type)
}
- log(debugToolkit, "listMap() HERE mapToolkits()")
- for w, t := range mapToolkits {
- log(debugToolkit, "andlabs =", t, "widget =", w.Name)
- forceDump(t)
+ log(debugPlugin, "Send() child =", c.Name, ",", c.Action, ",", c.Type)
+
+ switch c.Type {
+ case toolkit.Window:
+ newWindow(c)
+ case toolkit.Tab:
+ newTab(p, c)
+ case toolkit.Group:
+ newGroup(p, c)
+ case toolkit.Button:
+ doButton(p, c)
+ case toolkit.Checkbox:
+ doCheckbox(p, c)
+ case toolkit.Label:
+ newLabel(p, c)
+ case toolkit.Textbox:
+ doTextbox(p, c)
+ case toolkit.Slider:
+ newSlider(p, c)
+ case toolkit.Spinner:
+ newSpinner(p, c)
+ default:
+ log(true, "unknown parent =", p.Name, p.Type)
+ log(true, "unknown child =", c.Name, c.Type)
+ log(true, "Don't know how to do", c.Type, "yet")
}
}
-func mapWidgetsToolkits(w *toolkit.Widget, t *andlabsT) {
- if (mapToolkits[w] == nil) {
- mapToolkits[w] = t
- } else {
- log(debugToolkit, "WTF: mapToolkits was sent nil. this should not happen w =", w)
- log(debugToolkit, "WTF: mapToolkits was sent nil. this should not happen t =", t.Width)
- log(debugToolkit, "WTF: mapToolkits map already set to ", mapToolkits[w])
- panic("WTF mapWidgetsToolkits() w == nil")
+// delete the child widget from the parent
+// p = parent, c = child
+func destroy(p *toolkit.Widget, c *toolkit.Widget) {
+ log(true, "delete()", c.Name, c.Type)
+
+ pt := mapToolkits[p]
+ ct := mapToolkits[c]
+ if (ct == nil) {
+ log(true, "delete FAILED (ct = mapToolkit[c] == nil) for c", c.Name, c.Type)
+ // this pukes out a whole universe of shit
+ // listMap()
+ return
}
- if (mapWidgets[t] == nil) {
- mapWidgets[t] = w
- } else {
- log(debugToolkit, "WTF: mapWidgets already installed. w =", w)
- log(debugToolkit, "WTF: mapWidgets already installed. t =", t.Width, t)
- log(SPEW, &t)
- log(SPEW, t)
- log(SPEW, *t)
- log(debugToolkit, "WTF: mapWidgets already mapped to", mapWidgets[t])
- log(SPEW, mapWidgets[t])
- panic("WTF. mapWidget andlabs toolkit already mapped to gui toolkit")
+ switch ct.Type {
+ case toolkit.Button:
+ log(true, "Should delete Button here:", c.Name)
+ log(true, "Parent:")
+ pt.Dump(true)
+ log(true, "Child:")
+ ct.Dump(true)
+ if (pt.uiBox == nil) {
+ log(true, "Don't know how to destroy this")
+ } else {
+ log(true, "Fuck it, destroy the whole box", pt.Name)
+ // pt.uiBox.Destroy() // You have a bug: You cannot destroy a uiControl while it still has a parent.
+ pt.uiBox.SetPadded(false)
+ pt.uiBox.Delete(4)
+ ct.uiButton.Disable()
+ // ct.uiButton.Hide()
+ ct.uiButton.Destroy()
+ }
+
+ case toolkit.Window:
+ log(true, "Should delete Window here:", c.Name)
+ default:
+ log(true, "Don't know how to delete c =", c.Type, c.Name)
+ log(true, "Don't know how to delete pt =", pt.Type, pt.Name, pt.uiButton)
+ log(true, "Don't know how to delete ct =", ct.Type, ct.Name, ct.uiButton)
+ log(true, "Parent:")
+ pt.Dump(true)
+ log(true, "Child:")
+ ct.Dump(true)
+ log(true, "Fuckit, let's destroy a button", c.Name, c.Type)
+ if (ct.uiButton != nil) {
+ pt.uiBox.Delete(4)
+ ct.uiButton.Destroy()
+ }
}
}
diff --git a/toolkit/andlabs/slider.go b/toolkit/andlabs/slider.go
index 4857935..87639ca 100644
--- a/toolkit/andlabs/slider.go
+++ b/toolkit/andlabs/slider.go
@@ -7,31 +7,32 @@ import (
_ "github.com/andlabs/ui/winmanifest"
)
-func (t andlabsT) NewSlider(title string, x int, y int) *andlabsT {
+func (t andlabsT) newSlider(w *toolkit.Widget) *andlabsT {
// make new node here
- log(debugToolkit, "gui.Toolkit.NewSpinbox()", x, y)
+ log(debugToolkit, w.Name, w.Type, w.X, w.Y)
var newt andlabsT
if (t.uiBox == nil) {
- log(debugToolkit, "gui.ToolkitNode.NewGroup() node.UiBox == nil. I can't add a range UI element without a place to put it")
+ log(debugToolkit, "node.UiBox == nil. I can't add a range UI element without a place to put it")
log(debugToolkit, "probably could just make a box here?")
exit("internal golang wit/gui/toolkit error")
return nil
}
- s := ui.NewSlider(x, y)
+ s := ui.NewSlider(w.X, w.Y)
newt.uiSlider = s
newt.uiBox = t.uiBox
+ newt.tw = w
t.uiBox.Append(s, stretchy)
s.OnChanged(func(spin *ui.Slider) {
- newt.commonChange("Slider")
+ newt.commonChange(newt.tw)
})
return &newt
}
-func NewSlider(parentW *toolkit.Widget, w *toolkit.Widget) {
+func newSlider(parentW *toolkit.Widget, w *toolkit.Widget) {
var newt *andlabsT
log(debugToolkit, "gui.andlabs.NewTab()", w.Name)
@@ -40,6 +41,6 @@ func NewSlider(parentW *toolkit.Widget, w *toolkit.Widget) {
log(debugToolkit, "go.andlabs.NewTab() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
- newt = t.NewSlider(w.Name, w.X, w.Y)
+ newt = t.newSlider(w)
mapWidgetsToolkits(w, newt)
}
diff --git a/toolkit/andlabs/spinner.go b/toolkit/andlabs/spinner.go
index b98fb0c..1a7430e 100644
--- a/toolkit/andlabs/spinner.go
+++ b/toolkit/andlabs/spinner.go
@@ -1,27 +1,43 @@
package main
-import "github.com/andlabs/ui"
-import _ "github.com/andlabs/ui/winmanifest"
+import (
+ "git.wit.org/wit/gui/toolkit"
-func (t andlabsT) NewSpinner(title string, x int, y int) *andlabsT {
+ "github.com/andlabs/ui"
+ _ "github.com/andlabs/ui/winmanifest"
+)
+
+func (t andlabsT) newSpinner(w *toolkit.Widget) *andlabsT {
// make new node here
- log(debugToolkit, "gui.Toolkit.NewSpinner()", x, y)
+ log(debugToolkit, "newSpinner()", w.X, w.Y)
var newt andlabsT
if (t.uiBox == nil) {
- log(debugToolkit, "gui.ToolkitNode.NewSpinner() node.UiBox == nil. I can't add a range UI element without a place to put it")
- exit("internal golang wit/gui error")
+ log(debugToolkit, "newSpinner() node.UiBox == nil. I can't add a range UI element without a place to put it")
return nil
}
- s := ui.NewSpinbox(x, y)
+ s := ui.NewSpinbox(w.X, w.Y)
newt.uiSpinbox = s
newt.uiBox = t.uiBox
+ newt.tw = w
t.uiBox.Append(s, stretchy)
s.OnChanged(func(s *ui.Spinbox) {
- newt.commonChange("Spinner")
+ newt.commonChange(newt.tw)
})
return &newt
}
+
+func newSpinner(parentW *toolkit.Widget, w *toolkit.Widget) {
+ var newt *andlabsT
+
+ t := mapToolkits[parentW]
+ if (t == nil) {
+ log(debugToolkit, "go.andlabs.NewTab() toolkit struct == nil. name=", parentW.Name, w.Name)
+ return
+ }
+ newt = t.newSpinner(w)
+ mapWidgetsToolkits(w, newt)
+}
diff --git a/toolkit/andlabs/structs.go b/toolkit/andlabs/structs.go
index cf3afaf..45b6d1d 100644
--- a/toolkit/andlabs/structs.go
+++ b/toolkit/andlabs/structs.go
@@ -10,31 +10,27 @@ type andlabsT struct {
id string
Name string
+ Type toolkit.WidgetType
Width int
Height int
tw *toolkit.Widget
-
- OnChanged func(*andlabsT)
- OnExit func(*andlabsT)
-
- Custom func()
+ parent *andlabsT
uiBox *ui.Box
- uiBox2 *ui.Box // temporary hack while implementing tabs
uiButton *ui.Button
uiControl *ui.Control
uiCombobox *ui.Combobox
uiCheckbox *ui.Checkbox
uiEntry *ui.Entry
- uiMultilineEntry *ui.MultilineEntry
uiGroup *ui.Group
uiLabel *ui.Label
uiSlider *ui.Slider
uiSpinbox *ui.Spinbox
uiTab *ui.Tab
- uiText *ui.EditableCombobox
uiWindow *ui.Window
- UiWindowBad *ui.Window
+ // UiWindowBad *ui.Window // erase this
+ uiMultilineEntry *ui.MultilineEntry
+ uiEditableCombobox *ui.EditableCombobox
// used as a counter to work around limitations of widgets like combobox
// this is probably fucked up and in many ways wrong because of unsafe goroutine threading
diff --git a/toolkit/andlabs/tab.go b/toolkit/andlabs/tab.go
index f9085b4..995bbbd 100644
--- a/toolkit/andlabs/tab.go
+++ b/toolkit/andlabs/tab.go
@@ -33,7 +33,7 @@ func (t *andlabsT) newTab(name string) *andlabsT {
if (t.uiTab == nil) {
// this means you have to make a new tab
log(debugToolkit, "gui.toolkit.NewTab() GOOD. This should be the first tab:", name)
- newt = newTab(t.uiWindow, name)
+ newt = rawTab(t.uiWindow, name)
t.uiTab = newt.uiTab
} else {
// this means you have to append a tab
@@ -44,9 +44,9 @@ func (t *andlabsT) newTab(name string) *andlabsT {
newt.Name = name
log(debugToolkit, "t:")
- t.Dump()
+ t.Dump(debugToolkit)
log(debugToolkit, "newt:")
- newt.Dump()
+ newt.Dump(debugToolkit)
return newt
}
@@ -62,7 +62,7 @@ func tabSetMargined(tab *ui.Tab) {
}
}
-func newTab(w *ui.Window, name string) *andlabsT {
+func rawTab(w *ui.Window, name string) *andlabsT {
var t andlabsT
log(debugToolkit, "gui.toolkit.NewTab() ADD", name)
@@ -118,7 +118,7 @@ func (t *andlabsT) appendTab(name string) *andlabsT {
return &newT
}
-func NewTab(parentW *toolkit.Widget, w *toolkit.Widget) {
+func newTab(parentW *toolkit.Widget, w *toolkit.Widget) {
var newt *andlabsT
log(debugToolkit, "gui.andlabs.NewTab()", w.Name)
diff --git a/toolkit/andlabs/textbox.go b/toolkit/andlabs/textbox.go
index cb6075d..e916fd9 100644
--- a/toolkit/andlabs/textbox.go
+++ b/toolkit/andlabs/textbox.go
@@ -5,19 +5,32 @@ import "git.wit.org/wit/gui/toolkit"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
-func (t andlabsT) NewTextbox(name string) *andlabsT {
- var newt andlabsT
+func newTextbox(parentW *toolkit.Widget, w *toolkit.Widget) {
+ log(debugToolkit, "NewTexbox()", w.Name)
- log(debugToolkit, "gui.Toolkit.NewTextbox()", name)
+ t := mapToolkits[parentW]
+ if (t == nil) {
+ listMap(debugError)
+ log(debugError, "newTextbox() listMap()")
+ log(debugError, "FFFFFFFFFFFF listMap()")
+ log(debugError, "FFFFFFFFFFFF listMap()")
+ }
+ // t.NewTextbox(w)
+// func (t andlabsT) NewTextbox(w *toolkit.Widget) *andlabsT {
+ var newt *andlabsT
+ newt = new(andlabsT)
+
+ log(debugToolkit, "gui.Toolkit.NewTextbox()", w.Name)
if t.broken() {
- return nil
+ return
}
c := ui.NewNonWrappingMultilineEntry()
newt.uiMultilineEntry = c
newt.uiBox = t.uiBox
- newt.Name = name
+ newt.Name = w.Name
+ newt.tw = w
if (defaultBehavior) {
t.uiBox.Append(c, true)
} else {
@@ -25,41 +38,59 @@ func (t andlabsT) NewTextbox(name string) *andlabsT {
}
c.OnChanged(func(spin *ui.MultilineEntry) {
- newt.commonChange("Textbox")
+ w.S = newt.uiMultilineEntry.Text()
+ // this is still dangerous
+ // newt.commonChange(newt.tw)
+ log(debugChange, "Not yet safe to trigger on change for ui.MultilineEntry")
})
-
- return &newt
+ mapWidgetsToolkits(w, newt)
}
-func NewTextbox(parentW *toolkit.Widget, w *toolkit.Widget) {
- var t, newt *andlabsT
- log(debugToolkit, "gui.andlabs.NewTextbox()", w.Name)
- t = mapToolkits[parentW]
- if (t == nil) {
- log(debugToolkit, "go.andlabs.NewTextbox() toolkit struct == nil. name=", parentW.Name, w.Name)
+func doTextbox(p *toolkit.Widget, c *toolkit.Widget) {
+ if broken(c) {
return
}
-
- if t.broken() {
+ if (c.Action == "New") {
+ newTextbox(p, c)
return
}
- newt = new(andlabsT)
-
- newt.uiLabel = ui.NewLabel(w.Name)
- newt.uiBox = t.uiBox
-
- log(debugToolkit, "gui.Toolbox.NewTextbox() about to append to Box parent t:", w.Name)
- t.Dump()
- log(debugToolkit, "gui.Toolbox.NewTextbox() about to append to Box new t:", w.Name)
- newt.Dump()
-
- if (t.uiBox != nil) {
- t.uiBox.Append(newt.uiLabel, false)
- } else {
- log(debugToolkit, "ERROR: wit/gui andlabs couldn't place this Textbox in a box")
+ ct := mapToolkits[c]
+ if (ct == nil) {
+ log(true, "Trying to do something on a widget that doesn't work or doesn't exist or something", c)
+ return
+ }
+ if ct.broken() {
+ log(true, "Textbox() ct.broken", ct)
return
}
+ if (ct.uiMultilineEntry == nil) {
+ log(debugError, "Textbox() uiMultilineEntry == nil", ct)
+ return
+ }
+ // the dns control panel isn't crashing anymore (?)
+ Queue(ct.doSimpleAction)
+}
- mapWidgetsToolkits(w, newt)
+func (t *andlabsT) doSimpleAction() {
+ if (t.tw == nil) {
+ log(true, "doSimpleAction() got an empty widget")
+ log(true, "THIS SHOULD NEVER HAPPEN")
+ panic("crap. panic. widget == nil")
+ }
+ log(debugChange, "Going to attempt:", t.tw.Action)
+ switch t.tw.Action {
+ case "Enable":
+ t.uiMultilineEntry.Enable()
+ case "Disable":
+ t.uiMultilineEntry.Disable()
+ case "Show":
+ t.uiMultilineEntry.Show()
+ case "Hide":
+ t.uiMultilineEntry.Hide()
+ case "Set":
+ t.uiMultilineEntry.SetText(t.tw.S)
+ default:
+ log(debugError, "Can't do", t.tw.Action, "to a Textbox")
+ }
}
diff --git a/toolkit/andlabs/widget.go b/toolkit/andlabs/widget.go
new file mode 100644
index 0000000..58f8514
--- /dev/null
+++ b/toolkit/andlabs/widget.go
@@ -0,0 +1,67 @@
+package main
+
+import (
+ "git.wit.org/wit/gui/toolkit"
+)
+
+// This is a map between the widgets in wit/gui and the internal structures of gocui
+
+var mapWidgets map[*andlabsT]*toolkit.Widget
+var mapToolkits map[*toolkit.Widget]*andlabsT
+
+// This lists out the know mappings
+func listMap(b bool) {
+ log(b, "listMap() HERE")
+ log(b, "listMap() HERE")
+ for t, w := range mapWidgets {
+ log(b, "andlabs =", t.Name, "widget =", w.Name)
+ }
+ log(debugToolkit, "listMap() HERE mapToolkits()")
+ for w, t := range mapToolkits {
+ log(b, "andlabs =", t, "widget =", w.Name)
+ t.Dump(b)
+ }
+ log(b, "listMap() HERE mapWidgets()")
+ log(b, "listMap() HERE FIXME. output too big")
+}
+
+func mapWidgetsToolkits(w *toolkit.Widget, t *andlabsT) {
+ if ((mapToolkits[w] == nil) && (mapWidgets[t] == nil)) {
+ log(debugToolkit, "map a new widget", w, t)
+ mapToolkits[w] = t
+ mapWidgets[t] = w
+ return
+ }
+
+ if (mapToolkits[w] != nil) {
+ tw := mapToolkits[w]
+ if (tw == nil) {
+ // logic corruption somewhere? Have you been deleting things recently?
+ log(true, "mapToolkits[w] is set, but mapWidgets[t] is nil")
+ panic("WTF mapWidgets[t] == nil")
+ }
+ log(true, "mapToolkits[w] is", tw)
+ if (tw == nil) {
+ log(true, "BAD map? mapWidgets[w] tw == nil")
+ } else {
+ log(true, "BAD map? mapWidgets[w] is", tw)
+ tw.Dump(true)
+ }
+ }
+
+ if (mapWidgets[t] != nil) {
+ wt := mapWidgets[t]
+ if (mapToolkits[w] == nil) {
+ // logic corruption somewhere? Have you been deleting things recently?
+ log(true, "mapWidgets[t] is set, but mapToolkits[w] is nil")
+ panic("WTF mapToolkits[w] == nil")
+ }
+ if (wt == nil) {
+ log(true, "BAD map? mapWidgets[t] wt == nil")
+ } else {
+ log(true, "BAD map? mapWidgets[t] is", wt)
+ widgetDump(true, wt)
+ }
+ }
+ log(debugToolkit, "map of widget worked", w.Type, ",", w.Name, ",", w.Action)
+}
diff --git a/toolkit/andlabs/window.go b/toolkit/andlabs/window.go
index 7527ac5..40cd410 100644
--- a/toolkit/andlabs/window.go
+++ b/toolkit/andlabs/window.go
@@ -15,8 +15,8 @@ func (t *andlabsT) ErrorWindow(msg1 string, msg2 string) {
ui.MsgBoxError(t.uiWindow, msg1, msg2)
}
-func NewWindow(w *toolkit.Widget) {
- var t *andlabsT
+func newWindow(w *toolkit.Widget) {
+ var newt *andlabsT
log(debugToolkit, "toolkit NewWindow", w.Name, w.Width, w.Height)
@@ -24,34 +24,23 @@ func NewWindow(w *toolkit.Widget) {
log(debugToolkit, "wit/gui plugin error. widget == nil")
return
}
- t = new(andlabsT)
- // t = NewWindow2(w.Name, w.Width, w.Height)
+ newt = new(andlabsT)
+ newt.tw = w
-// func NewWindow2(title string, x int, y int) *andlabsT {
// menubar bool is if the OS defined border on the window should be used
win := ui.NewWindow(w.Name, w.Width, w.Height, menubar)
win.SetBorderless(canvas)
win.SetMargined(margin)
win.OnClosing(func(*ui.Window) bool {
- log(debugToolkit, "ui.Window().OnExit() SHOULD ATTEMPT CALLBACK here")
- t.Dump()
- if (w.Custom != nil) {
- w.Custom()
- return true
- }
- // if (w.Event != nil) {
- // w.Event(w)
- // return true
- // }
- log(debugToolkit, "andlabs.ui.Window().OnClosing() was not defined")
- return false
+ newt.commonChange(newt.tw)
+ return true
})
win.Show()
- t.uiWindow = win
- t.UiWindowBad = win // deprecate this as soon as possible
- t.Name = w.Name
+ newt.uiWindow = win
+ // newt.UiWindowBad = win // deprecate this as soon as possible
+ newt.Name = w.Name
- mapWidgetsToolkits(w, t)
+ mapWidgetsToolkits(w, newt)
return
}
diff --git a/toolkit/widget.go b/toolkit/widget.go
index 295a598..fcb6d31 100644
--- a/toolkit/widget.go
+++ b/toolkit/widget.go
@@ -11,8 +11,19 @@ package toolkit
// Event() seems like a good name.
// Could a protobuf be used here? (Can functions be passed?)
type Widget struct {
- Name string
- Type string // after lots of back and forth, a simple string
+ Name string // "New", "Delete", "Set", aka something to do
+ Action string // "New", "Delete", "Set", aka something to do
+ // Type string // after lots of back and forth, a simple string
+ Type WidgetType
+
+ // This is how the values are passed back and forth
+ // values from things like checkboxes & dropdown's
+ // The string is also used to set the button name
+ B bool
+ I int
+ // maybe safe if there is correctly working Custom() between goroutines
+ // (still probably not, almost certainly not)
+ S string // not safe to have 'S'
// This GUI is intended for simple things
// We are not laying out PDF's here
@@ -22,49 +33,61 @@ type Widget struct {
X int
Y int
- // latest attempt
- Custom func()
+ // Put space around elements to improve look & feel
+ Margin bool
- // This might be useful to simplify retrieving
- // values from things like checkboxes & dropdown's
- B bool
- I int
- S string
+ // Make widgets fill up the space available
+ Expand bool
- // other things I've tried
- // Event func(*Widget) *Widget
-// OnChanged func(*Widget)
-// Custom func(*Widget)
-// OnExit func(*Widget)
+ // latest attempt. seems to work so far (2023/02/28)
+ // Hopefully this will be the barrier between the goroutines
+ Custom func()
}
-/*
-type Widget int
+type WidgetType int
// https://ieftimov.com/post/golang-datastructures-trees/
const (
- Unknown Widget = iota
+ Unknown WidgetType = iota
Window
Tab
+ Group
Frame
- Dropbox
- Spinner
+ Button
+ Checkbox
+ Dropdown
Label
+ Textbox
+ Slider
+ Spinner
)
-func (s Widget) String() string {
+func (s WidgetType) String() string {
switch s {
case Window:
return "Window"
case Tab:
return "Tab"
+ case Group:
+ return "Group"
case Frame:
return "Frame"
+ case Button:
+ return "Button"
+ case Checkbox:
+ return "Checkbox"
+ case Dropdown:
+ return "Dropdown"
case Label:
return "Label"
- case Dropbox:
- return "Dropbox"
+ case Textbox:
+ return "Textbox"
+ case Slider:
+ return "Slider"
+ case Spinner:
+ return "Spinner"
+ case Unknown:
+ return "Unknown"
}
- return "unknown"
+ return "GuiToolkitTUndefinedType"
}
-*/
diff --git a/window.go b/window.go
index 10af3b8..a17aa74 100644
--- a/window.go
+++ b/window.go
@@ -1,6 +1,7 @@
package gui
import (
+ "git.wit.org/wit/gui/toolkit"
)
//import toolkit "git.wit.org/wit/gui/toolkit/andlabs"
@@ -13,39 +14,33 @@ import (
// my guess).
func NewWindow() *Node {
var newNode *Node
+ var custom func()
- title := Config.Title
- // Windows are created off of the master node of the Binary Tree
- newNode = Config.master.New(title, "Window")
-
- newNode.Widget.Width = Config.Width
- newNode.Widget.Height = Config.Height
-
+ // If the user didn't set a custom Exit() use the standard exit() function
+ // This makes sure the GUI properly closes everything (GTK, QT, console ui, etc exit)
if (Config.Exit != nil) {
- log("setting a custom exit")
- newNode.custom = func() {
+ log(debugGui, "setting a custom exit")
+ custom = func() {
+ log(debugChange, "Running a custom exit()", Config.Exit)
+ log(debugChange, "Running a custom exit() Config.Title =", Config.Title)
+ log(debugChange, "Running a custom exit() Config.Width =", Config.Width)
Config.Exit(newNode)
}
} else {
- log("not setting a custom exit")
- }
-
- if (newNode.custom == nil) {
- newNode.custom = func () {StandardExit(newNode)}
+ log(debugGui, "setting the standard exit")
+ custom = func () {
+ log(debugChange, "Running StandardExit()")
+ StandardExit()
+ }
}
+ // Windows are created off of the master node of the Binary Tree
+ newNode = Config.master.New(Config.Title, toolkit.Window, custom)
- newNode.Widget.Custom = newNode.custom
-
- log(debugGui, "gui.Node.Window()", title)
+ newNode.widget.Width = Config.Width
+ newNode.widget.Height = Config.Height
- for _, aplug := range allPlugins {
- log(debugGui, "gui.Node.NewWindow() toolkit plugin =", aplug.name)
- if (aplug.NewWindow == nil) {
- log(debugGui, "gui.Node.NewWindow() is nil")
- continue
- }
- aplug.NewWindow(&newNode.Widget)
- }
+ log(debugGui, "Window()", Config.Title)
+ send(nil, newNode)
return newNode
}