summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2022-10-16 08:07:13 -0500
committerJeff Carr <[email protected]>2022-10-16 08:07:13 -0500
commit2141e04328dcf4e4d6857fcc0a7cb551fc84fa07 (patch)
treef8b2a5d8cf17f9ccfcfa8c1699fe4a52ea8338e2
parent3c899365154e48aefbc0b5ee48cd089f49339cb2 (diff)
Add slander and spinbox in toolkit/andlabs
fix the helloworld demo move slider into toolkit/ move more into the toolkit directory add spinbox() fix example minor update fix examples Fix andlabs.ui.Slider() to work again correctly implement custom OnChange() callback Signed-off-by: Jeff Carr <[email protected]>
-rw-r--r--.gitignore1
-rw-r--r--Makefile7
-rw-r--r--box.go18
-rw-r--r--cmds/gui-example/Makefile2
-rw-r--r--cmds/gui-example/demo-window.go4
-rw-r--r--cmds/helloworld/Makefile14
-rwxr-xr-xcmds/helloworld/helloworldbin3097960 -> 0 bytes
-rw-r--r--cmds/helloworld/main.go10
-rw-r--r--doc.go20
-rw-r--r--entry.go111
-rw-r--r--go.mod2
-rw-r--r--go.sum3
-rw-r--r--int.go28
-rw-r--r--new-structs.go76
-rw-r--r--slider.go24
-rw-r--r--spinbox.go24
-rw-r--r--structs.go17
-rw-r--r--toolkit/andlabs/slider.go38
-rw-r--r--toolkit/andlabs/spinbox.go86
-rw-r--r--window.go6
20 files changed, 331 insertions, 160 deletions
diff --git a/.gitignore b/.gitignore
index 1445c95..1aab669 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
*.swp
cmds/gui-example/gui-example
cmds/gui-demo/gui-demo
+cmds/helloworld/helloworld
diff --git a/Makefile b/Makefile
index 7225bce..e2aa6b1 100644
--- a/Makefile
+++ b/Makefile
@@ -10,4 +10,9 @@ update:
go get -v -t -u ./...
examples:
- make -C gui-example
+ make -C cmds/helloworld
+ make -C cmds/gui-example
+ make -C cmds/gui-demo
+
+doc:
+ godoc -v
diff --git a/box.go b/box.go
index 7a61f55..5e63ace 100644
--- a/box.go
+++ b/box.go
@@ -192,6 +192,7 @@ func (n *Node) AddComboBox(title string, s ...string) *Node {
return n
}
+ newNode := n.AddNode(title)
ecbox := ui.NewEditableCombobox()
for id, name := range s {
@@ -202,18 +203,27 @@ func (n *Node) AddComboBox(title string, s ...string) *Node {
ecbox.OnChanged(func(*ui.EditableCombobox) {
test := ecbox.Text()
log.Println("node.Name = '" + n.Name + "' text for '" + title + "' is now: '" + test + "'")
+ log.Println("need to call node.OnChanged() here")
+ if (newNode.OnChanged == nil) {
+ log.Println("node.OnChanged() is nil")
+ log.Println("need to call node.OnChanged() here", newNode.OnChanged)
+ newNode.Dump()
+ } else {
+ log.Println("need to call node.OnChanged() here", newNode.OnChanged)
+ newNode.OnChanged(newNode)
+ }
})
box.Append(ecbox, false)
- newNode := n.AddNode(title)
newNode.uiText = ecbox
return newNode
}
-func (n *Node) OnChanged(f func()) {
- f()
-}
+//func (n *Node) OnChanged(f func()) {
+// log.Println("not doing shit here in Node.OnChanged()")
+// f()
+//}
func (n *Node) GetText() string {
if (n.uiText == nil) {
diff --git a/cmds/gui-example/Makefile b/cmds/gui-example/Makefile
index 638cffc..9ecbe55 100644
--- a/cmds/gui-example/Makefile
+++ b/cmds/gui-example/Makefile
@@ -2,5 +2,5 @@ run: build
./gui-example
build:
- GO111MODULE="off" go -v get .
+ GO111MODULE="off" go get -v .
GO111MODULE="off" go build
diff --git a/cmds/gui-example/demo-window.go b/cmds/gui-example/demo-window.go
index 993900d..02c7a50 100644
--- a/cmds/gui-example/demo-window.go
+++ b/cmds/gui-example/demo-window.go
@@ -33,9 +33,9 @@ func addDemoTab(n *gui.Node, title string) {
groupNode1 := newNode.AddGroup("group 1")
cbNode := groupNode1.AddComboBox("username", "root", "jcarr", "hugo")
- cbNode.OnChanged(func () {
+ cbNode.OnChanged = func (cbNode *gui.Node) {
username = cbNode.GetText()
- })
+ }
groupNode1.AddComboBox("demoCombo3", "foo 3", "bar", "stuff")
groupNode1.Dump()
diff --git a/cmds/helloworld/Makefile b/cmds/helloworld/Makefile
new file mode 100644
index 0000000..f18abaf
--- /dev/null
+++ b/cmds/helloworld/Makefile
@@ -0,0 +1,14 @@
+run: build
+ ./helloworld
+
+build:
+ go get -v -u -x .
+ go build
+
+build-master:
+ GO111MODULE="off" go get -v -x .
+ GO111MODULE="off" go build
+ ./helloworld
+
+update:
+ GO111MODULE="off" go get -v -u -x .
diff --git a/cmds/helloworld/helloworld b/cmds/helloworld/helloworld
deleted file mode 100755
index cc41f78..0000000
--- a/cmds/helloworld/helloworld
+++ /dev/null
Binary files differ
diff --git a/cmds/helloworld/main.go b/cmds/helloworld/main.go
index 1cb1bbd..6e52a0b 100644
--- a/cmds/helloworld/main.go
+++ b/cmds/helloworld/main.go
@@ -2,6 +2,8 @@
package main
import (
+ "os"
+ "log"
"git.wit.org/wit/gui"
)
@@ -14,6 +16,8 @@ func initGUI() {
gui.Config.Title = "Hello World golang wit/gui Window"
gui.Config.Width = 640
gui.Config.Height = 480
+ gui.Config.Exit = myDefaultExit
+
node1 := gui.NewWindow()
addDemoTab(node1, "A Simple Tab Demo")
addDemoTab(node1, "A Second Tab")
@@ -25,3 +29,9 @@ func addDemoTab(n *gui.Node, title string) {
groupNode1 := newNode.AddGroup("group 1")
groupNode1.AddComboBox("demoCombo2", "more 1", "more 2", "more 3")
}
+
+func myDefaultExit(n *gui.Node) {
+ log.Println("You can Do exit() things here")
+ os.Exit(0)
+}
+
diff --git a/doc.go b/doc.go
index 35c6a8f..9b52296 100644
--- a/doc.go
+++ b/doc.go
@@ -42,28 +42,14 @@ sections below for further details on formatting and configuration options.
groupNode1.AddComboBox("demoCombo2", "more 1", "more 2", "more 3")
}
-Configuration Options
-
-Configuration of the GUI is handled by fields in the ConfigType type. For
-convenience, all of the top-level functions use a global state available
-via the gui.Config global.
-
-The following configuration options are available:
- * Width
- When creating a new window, this is the width
-
- * Height
- When creating a new window, this is the height
-
- * Debug
- When 'true' log more output
-
Toolkit Usage
Right now, this abstraction is built on top of the go package 'andlabs/ui'
which does the cross platform support.
The next step is to intent is to allow this to work directly against GTK and QT.
-It should be able to add Fyne, WASM, native macos & windows, android, etc.
+
+It should be able to add Fyne, WASM, native macos & windows, android and
+hopefully also things like libSDL, faiface/pixel, slint
Errors
diff --git a/entry.go b/entry.go
index c10b7d0..cafa7ac 100644
--- a/entry.go
+++ b/entry.go
@@ -1,7 +1,7 @@
package gui
import "log"
-import "fmt"
+// import "fmt"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
@@ -15,10 +15,8 @@ func NewLabel(box *GuiBox, text string) {
func (n *Node) NewLabel(text string) *Node {
// make new node here
- // n.Append(ui.NewLabel(text), false)
newNode := makeNode(n, text, 333, 334)
newNode.Dump()
- // panic("node.NewLabel()")
n.Append(newNode)
return newNode
@@ -52,110 +50,3 @@ func (n *Node) SetText(value string) error {
}
return nil
}
-
-func SetText(box *GuiBox, name string, value string) error {
- if (box == nil) {
- return fmt.Errorf("gui.SetText() ERROR box == nil")
- }
- if (box.Window.EntryMap == nil) {
- return fmt.Errorf("gui.SetText() ERROR b.Box.Window.EntryMap == nil")
- }
- spew.Dump(box.Window.EntryMap)
- if (box.Window.EntryMap[name] == nil) {
- return fmt.Errorf("gui.SetText() ERROR box.Window.EntryMap[" + name + "] == nil ")
- }
- e := box.Window.EntryMap[name]
- log.Println("gui.SetText() box.Window.EntryMap[", name, "] = ", e.UiEntry.Text())
- e.UiEntry.SetText(value)
- log.Println("gui.SetText() box.Window.EntryMap[", name, "] = ", e.UiEntry.Text())
- log.Println("gui.SetText() END")
- return nil
-}
-
-// makeEntryBox(box, "hostname:", "blah.foo.org") {
-func MakeEntryVbox(box *GuiBox, a string, startValue string, edit bool, action string) *GuiEntry {
- // Start 'Nickname' vertical box
- vboxN := ui.NewVerticalBox()
- vboxN.SetPadded(true)
- vboxN.Append(ui.NewLabel(a), false)
-
- e := defaultMakeEntry(startValue, edit, action)
-
- vboxN.Append(e.UiEntry, false)
- box.UiBox.Append(vboxN, false)
- // End 'Nickname' vertical box
-
- return e
-}
-
-func MakeEntryHbox(box *GuiBox, a string, startValue string, edit bool, action string) *GuiEntry {
- hboxN := ui.NewHorizontalBox()
- hboxN.SetPadded(true)
- hboxN.Append(ui.NewLabel(a), false)
-
- e := defaultMakeEntry(startValue, edit, action)
- hboxN.Append(e.UiEntry, true)
-
- box.UiBox.Append(hboxN, true)
-
- return e
-}
-
-func AddEntry(box *GuiBox, name string) *GuiEntry {
- var ge *GuiEntry
- ge = new(GuiEntry)
-
- ue := ui.NewEntry()
- ue.SetReadOnly(false)
- ue.OnChanged(func(*ui.Entry) {
- log.Println("gui.AddEntry() OK. ue.Text() =", ue.Text())
- })
- box.UiBox.Append(ue, false)
-
- ge.UiEntry = ue
- box.Window.EntryMap[name] = ge
-
- return ge
-}
-
-func defaultEntryChange(e *ui.Entry) {
- for key, em := range Data.AllEntries {
- if (Config.Debug) {
- log.Println("\tdefaultEntryChange() Data.AllEntries =", key, em)
- }
- if Data.AllEntries[key].UiEntry == e {
- log.Println("defaultEntryChange() FOUND",
- "Name =", Data.AllEntries[key].Name,
- "Last =", Data.AllEntries[key].Last,
- "e.Text() =", e.Text())
- Data.AllEntries[key].Last = e.Text()
- if Data.AllEntries[key].Normalize != nil {
- fixed := Data.AllEntries[key].Normalize(e.Text())
- e.SetText(fixed)
- }
- return
- }
- }
- log.Println("defaultEntryChange() ERROR. MISSING ENTRY MAP. e.Text() =", e.Text())
-}
-
-func defaultMakeEntry(startValue string, edit bool, action string) *GuiEntry {
- e := ui.NewEntry()
- e.SetText(startValue)
- if (edit == false) {
- e.SetReadOnly(true)
- }
- e.OnChanged(defaultEntryChange)
-
- // add the entry field to the global map
- var newEntry GuiEntry
- newEntry.UiEntry = e
- newEntry.Edit = edit
- newEntry.Name = action
- if (action == "INT") {
- newEntry.Normalize = normalizeInt
- }
- Data.AllEntries = append(Data.AllEntries, &newEntry)
-
- return &newEntry
-}
diff --git a/go.mod b/go.mod
index c72bbca..74294de 100644
--- a/go.mod
+++ b/go.mod
@@ -5,5 +5,5 @@ go 1.17
require (
github.com/andlabs/ui v0.0.0-20200610043537-70a69d6ae31e
github.com/davecgh/go-spew v1.1.1
- golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d
+ golang.org/x/image v0.0.0-20220902085622-e7cb96979f69
)
diff --git a/go.sum b/go.sum
index 27ff5d2..db8e4aa 100644
--- a/go.sum
+++ b/go.sum
@@ -4,5 +4,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs=
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY=
+golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/int.go b/int.go
new file mode 100644
index 0000000..9543344
--- /dev/null
+++ b/int.go
@@ -0,0 +1,28 @@
+package gui
+
+import "log"
+
+import "github.com/davecgh/go-spew/spew"
+
+// import toolkit "git.wit.org/wit/gui/toolkit/andlabs"
+
+
+// Get the int from the gui toolkit
+// TODO: instead store the int in the Node structure? (this is probably a better idea)
+// because eventually this gui package should become it's own seperate go routine and never interact from the
+// gui subroutine back into the upstream application using the gui package
+func (n *Node) Int() int {
+ if (Config.DebugToolkit) {
+ log.Println("gui.Node.Int() for node name =", n.Name)
+ scs := spew.ConfigState{MaxDepth: 1}
+ scs.Dump(n)
+ }
+
+ if (n.Toolkit == nil) {
+ log.Println("gui.Node.Int() for toolkit struct = nil")
+ return 0
+ }
+
+ i := n.Toolkit.Value()
+ return i
+}
diff --git a/new-structs.go b/new-structs.go
index 4f9989e..74bbd50 100644
--- a/new-structs.go
+++ b/new-structs.go
@@ -9,8 +9,11 @@ import (
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
+
)
+import toolkit "git.wit.org/wit/gui/toolkit/andlabs"
+
type Element int
// https://ieftimov.com/post/golang-datastructures-trees/
@@ -39,8 +42,10 @@ func (s Element) String() string {
return "unknown"
}
+// The Node is simply the name and the size of whatever GUI element exists
type Node struct {
id string
+
Name string
Width int
Height int
@@ -50,10 +55,15 @@ type Node struct {
window *GuiWindow
box *GuiBox
- custom func(*Node)
+ custom func(*Node)
+ OnChanged func(*Node)
+
+ Toolkit *toolkit.Toolkit
uiControl *ui.Control
uiButton *ui.Button
+ uiSlider *ui.Slider
+ uiSpinbox *ui.Spinbox
uiWindow *ui.Window
uiTab *ui.Tab
uiBox *ui.Box
@@ -69,28 +79,53 @@ func (n *Node) Window() *Node {
}
func (n *Node) Dump() {
- log.Println("gui.Node.Dump() id = ", n.id)
- log.Println("gui.Node.Dump() Name = ", n.Name)
- log.Println("gui.Node.Dump() Width = ", n.Width)
- log.Println("gui.Node.Dump() Height = ", n.Height)
+ IndentPrintln("id = ", n.id)
+ IndentPrintln("Name = ", n.Name)
+ IndentPrintln("Width = ", n.Width)
+ IndentPrintln("Height = ", n.Height)
if (n.parent == nil) {
- log.Println("gui.Node.Dump() parent = nil")
+ IndentPrintln("parent = nil")
} else {
- log.Println("gui.Node.Dump() parent = ", n.parent.id)
+ IndentPrintln("parent =", n.parent.id)
+ }
+ if (n.children != nil) {
+ IndentPrintln("children = ", n.children)
}
- log.Println("gui.Node.Dump() children = ", n.children)
- log.Println("gui.Node.Dump() window = ", n.window)
- log.Println("gui.Node.Dump() box = ", n.box)
+ if (n.window != nil) {
+ IndentPrintln("window = ", n.window)
+ }
+ if (n.window != nil) {
+ IndentPrintln("box = ", n.box)
+ }
- log.Println("gui.Node.Dump() uiWindow = ", n.uiWindow)
- log.Println("gui.Node.Dump() uiTab = ", n.uiTab)
- log.Println("gui.Node.Dump() uiBox = ", n.uiBox)
- log.Println("gui.Node.Dump() uiControl = ", n.uiControl)
- log.Println("gui.Node.Dump() uiButton = ", n.uiButton)
+ if (n.window != nil) {
+ IndentPrintln("uiWindow = ", n.uiWindow)
+ }
+ if (n.uiTab != nil) {
+ IndentPrintln("uiTab = ", n.uiTab)
+ }
+ if (n.uiBox != nil) {
+ IndentPrintln("uiBox = ", n.uiBox)
+ }
+ if (n.uiControl != nil) {
+ IndentPrintln("uiControl = ", n.uiControl)
+ }
+ if (n.uiButton != nil) {
+ IndentPrintln("uiButton = ", n.uiButton)
+ }
+ if (n.custom != nil) {
+ IndentPrintln("custom = ", n.custom)
+ }
+ if (n.OnChanged != nil) {
+ IndentPrintln("OnChanged = ", n.OnChanged)
+ }
if (n.id == "") {
- panic("gui.Node.Dump() id == nil")
+ // Node structs should never have a nil id.
+ // I probably shouldn't panic here, but this is just to check the sanity of
+ // the gui package to make sure it's not exiting
+ panic("gui.Node.Dump() id == nil TODO: make a unigue id here in the golang gui library")
}
}
@@ -130,11 +165,16 @@ func (n *Node) List() {
var listChildrenParent *Node
var listChildrenDepth int = 0
+var defaultPadding = " "
+
+func IndentPrintln(a ...interface{}) {
+ indentPrintln(listChildrenDepth, defaultPadding, a)
+}
func indentPrintln(depth int, format string, a ...interface{}) {
var tabs string
for i := 0; i < depth; i++ {
- tabs = tabs + "\t"
+ tabs = tabs + format
}
// newFormat := tabs + strconv.Itoa(depth) + " " + format
@@ -143,7 +183,7 @@ func indentPrintln(depth int, format string, a ...interface{}) {
}
func (n *Node) ListChildren(dump bool) {
- indentPrintln(listChildrenDepth, "\t", n.id, n.Width, n.Height, n.Name)
+ indentPrintln(listChildrenDepth, defaultPadding, n.id, n.Width, n.Height, n.Name)
if (dump == true) {
n.Dump()
diff --git a/slider.go b/slider.go
new file mode 100644
index 0000000..6129bd6
--- /dev/null
+++ b/slider.go
@@ -0,0 +1,24 @@
+package gui
+
+import "log"
+
+import toolkit "git.wit.org/wit/gui/toolkit/andlabs"
+
+func (n *Node) NewSlider(name string, x int, y int) *Node {
+ // make new node here
+ log.Println("toolkit.NewSlider", x, y)
+
+ newNode := n.makeNode(name, 767, 676 + Config.counter)
+ newNode.Name = name
+
+ t := toolkit.NewSlider(n.uiBox, name, x, y)
+ t.OnChanged = func(t *toolkit.Toolkit) {
+ log.Println("toolkit.NewSlider() value =", t.Value())
+ if (newNode.OnChanged != nil) {
+ newNode.OnChanged(newNode)
+ }
+ }
+ newNode.Toolkit = t
+
+ return newNode
+}
diff --git a/spinbox.go b/spinbox.go
new file mode 100644
index 0000000..1d291da
--- /dev/null
+++ b/spinbox.go
@@ -0,0 +1,24 @@
+package gui
+
+import "log"
+
+import toolkit "git.wit.org/wit/gui/toolkit/andlabs"
+
+func (n *Node) NewSpinbox(name string, x int, y int) *Node {
+ // make new node here
+ log.Println("toolkit.NewSpinbox", x, y)
+
+ newNode := n.makeNode(name, 767, 676 + Config.counter)
+ newNode.Name = name
+
+ t := toolkit.NewSpinbox(n.uiBox, name, x, y)
+ t.OnChanged = func(t *toolkit.Toolkit) {
+ log.Println("toolkit.NewSpinbox() value =", t.Value())
+ if (newNode.OnChanged != nil) {
+ newNode.OnChanged(newNode)
+ }
+ }
+ newNode.Toolkit = t
+
+ return newNode
+}
diff --git a/structs.go b/structs.go
index c15f4b7..fedb34a 100644
--- a/structs.go
+++ b/structs.go
@@ -7,7 +7,9 @@ import (
"github.com/andlabs/ui"
"golang.org/x/image/font"
- _ "github.com/andlabs/ui/winmanifest"
+ // "github.com/davecgh/go-spew/spew"
+
+ // _ "github.com/andlabs/ui/winmanifest"
)
//
@@ -24,11 +26,12 @@ type GuiConfig struct {
Height int
Exit func(*Node)
- Debug bool
- DebugNode bool
- DebugTabs bool
- DebugTable bool
- DebugWindow bool
+ Debug bool
+ DebugNode bool
+ DebugTabs bool
+ DebugTable bool
+ DebugWindow bool
+ DebugToolkit bool
depth int
counter int // used to make unique ID's
@@ -171,6 +174,8 @@ func (b *GuiBox) SetNode(n *Node) {
func (b *GuiBox) Append(child ui.Control, x bool) {
if b.UiBox == nil {
+ // spew.Dump(b)
+ b.Dump()
panic("GuiBox.Append() can't work. UiBox == nil")
return
}
diff --git a/toolkit/andlabs/slider.go b/toolkit/andlabs/slider.go
new file mode 100644
index 0000000..930c514
--- /dev/null
+++ b/toolkit/andlabs/slider.go
@@ -0,0 +1,38 @@
+package toolkit
+
+import "log"
+
+import "github.com/andlabs/ui"
+import _ "github.com/andlabs/ui/winmanifest"
+
+import "github.com/davecgh/go-spew/spew"
+
+func NewSlider(b *ui.Box, name string, x int, y int) *Toolkit {
+ // make new node here
+ log.Println("gui.Toolbox.NewSpinbox()", x, y)
+ var t Toolkit
+
+ if (b == nil) {
+ log.Println("gui.ToolboxNode.NewSpinbox() node.UiBox == nil. I can't add a range UI element without a place to put it")
+ return &t
+ }
+ s := ui.NewSlider(x, y)
+ t.uiSlider = s
+ t.uiBox = b
+ t.uiBox.Append(s, false)
+
+ s.OnChanged(func(spin *ui.Slider) {
+ i := spin.Value()
+ if (DebugToolkit) {
+ log.Println("gui.Toolbox.ui.OnChanged() val =", i)
+ scs := spew.ConfigState{MaxDepth: 1}
+ scs.Dump(t)
+ }
+ if (t.OnChanged != nil) {
+ log.Println("gui.Toolbox.OnChanged() entered val =", i)
+ t.OnChanged(&t)
+ }
+ })
+
+ return &t
+}
diff --git a/toolkit/andlabs/spinbox.go b/toolkit/andlabs/spinbox.go
new file mode 100644
index 0000000..dca0502
--- /dev/null
+++ b/toolkit/andlabs/spinbox.go
@@ -0,0 +1,86 @@
+package toolkit
+
+import "log"
+
+import "github.com/andlabs/ui"
+import _ "github.com/andlabs/ui/winmanifest"
+
+import "github.com/davecgh/go-spew/spew"
+
+var DebugToolkit bool = false
+
+// stores the raw toolkit internals
+type Toolkit struct {
+ id string
+
+ Name string
+ Width int
+ Height int
+
+ OnChanged func(*Toolkit)
+
+ uiControl *ui.Control
+ uiButton *ui.Button
+ uiSlider *ui.Slider
+ uiSpinbox *ui.Spinbox
+ uiWindow *ui.Window
+ uiTab *ui.Tab
+ uiBox *ui.Box
+ uiText *ui.EditableCombobox
+}
+
+func (t *Toolkit) Value() int {
+ if (DebugToolkit) {
+ log.Println("gui.Toolkit.Value() Enter")
+ scs := spew.ConfigState{MaxDepth: 1}
+ scs.Dump(t)
+ }
+ if (t == nil) {
+ log.Println("gui.Toolkit.Value() can not get value t == nil")
+ return 0
+ }
+ if (t.uiSlider != nil) {
+ if (DebugToolkit) {
+ log.Println("gui.Toolkit.Value() =", t.uiSlider.Value)
+ }
+ return t.uiSlider.Value()
+ }
+ if (t.uiSpinbox != nil) {
+ if (DebugToolkit) {
+ log.Println("gui.Toolkit.Value() =", t.uiSpinbox.Value)
+ }
+ return t.uiSpinbox.Value()
+ }
+ log.Println("gui.Toolkit.Value() Could not find a ui element to get a value from")
+ return 0
+}
+
+func NewSpinbox(b *ui.Box, name string, x int, y int) *Toolkit {
+ // make new node here
+ log.Println("gui.Toolbox.NewSpinbox()", x, y)
+ var t Toolkit
+
+ if (b == nil) {
+ log.Println("gui.ToolboxNode.NewSpinbox() node.UiBox == nil. I can't add a range UI element without a place to put it")
+ return &t
+ }
+ spin := ui.NewSpinbox(x, y)
+ t.uiSpinbox = spin
+ t.uiBox = b
+ t.uiBox.Append(spin, false)
+
+ spin.OnChanged(func(spin *ui.Spinbox) {
+ i := spin.Value()
+ if (DebugToolkit) {
+ log.Println("gui.Toolbox.ui.OnChanged() val =", i)
+ scs := spew.ConfigState{MaxDepth: 1}
+ scs.Dump(t)
+ }
+ if (t.OnChanged != nil) {
+ log.Println("gui.Toolbox.OnChanged() entered val =", i)
+ t.OnChanged(&t)
+ }
+ })
+
+ return &t
+}
diff --git a/window.go b/window.go
index da7cff6..75097ee 100644
--- a/window.go
+++ b/window.go
@@ -58,6 +58,12 @@ func DeleteWindow(name string) {
}
}
+/*
+generic function to create a newnode structure on the tree of nodes
+
+If the parent is null, it tries to find out where it should go otherwise
+it creates a new window or new tab depending on the toolkit or OS
+*/
func makeNode(parent *Node, title string, x int, y int) *Node {
var node Node
node.Name = title