setup building without plugins on windows

notes from github remote
keep removing os.Exit()
rename from andlabs2 back to andlabs
rename files for windows andlabs/ui
gocui always sets STDOUT a file in /tmp/

Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
Jeff Carr 2022-11-14 14:30:28 -06:00
parent 8221522ba8
commit 4242393152
58 changed files with 745 additions and 758 deletions

View File

@ -31,9 +31,12 @@ cmds-textbox:
make -C cmds/textbox
# sync repo to the github backup
# git remote add github git@github.com:witorg/gui.git
github:
git push origin master
git push github master
git push github devel
git push github jcarr
@echo
@echo check https://github.com/witorg/gui
@echo
@ -49,14 +52,14 @@ README.md: doc.go
clean:
rm -f toolkit/*.so
plugins: plugins-gocui plugins-andlabs2
plugins: plugins-gocui plugins-andlabs
plugins-gocui:
make -C toolkit/gocui
plugins-andlabs2:
cd toolkit/andlabs2/ && GO111MODULE="off" go build -buildmode=plugin -o ../andlabs2.so
# make -C toolkit/andlabs2
plugins-andlabs:
cd toolkit/andlabs/ && GO111MODULE="off" go build -buildmode=plugin -o ../andlabs.so
# make -C toolkit/andlabs
objdump:
objdump -t toolkit/andlabs.so |less

View File

@ -128,11 +128,11 @@ Creates a window helpful for debugging this package
This creates a window that shows how this package works
### func [GetDebug](/structs.go#L25)
### func [GetDebug](/structs.go#L23)
`func GetDebug() bool`
### func [GetDebugToolkit](/structs.go#L37)
### func [GetDebugToolkit](/structs.go#L34)
`func GetDebugToolkit() bool`
@ -140,7 +140,7 @@ This creates a window that shows how this package works
`func GolangDebugWindow()`
### func [IndentPrintln](/structs.go#L188)
### func [IndentPrintln](/structs.go#L159)
`func IndentPrintln(a ...interface{})`
@ -160,15 +160,26 @@ loads and initializes a toolkit (andlabs/ui, gocui, etc)
This should not pass a function
### func [SetDebug](/structs.go#L29)
### func [Queue](/main.go#L115)
`func Queue(f func())`
Other goroutines must use this to access the GUI
You can not acess / process the GUI thread directly from
other goroutines. This is due to the nature of how
Linux, MacOS and Windows work (they all work differently. suprise. surprise.)
For example: gui.Queue(NewWindow())
### func [SetDebug](/structs.go#L27)
`func SetDebug(s bool)`
### func [SetDebugToolkit](/structs.go#L41)
### func [SetDebugToolkit](/structs.go#L38)
`func SetDebugToolkit(s bool)`
### func [ShowDebugValues](/structs.go#L45)
### func [ShowDebugValues](/structs.go#L42)
`func ShowDebugValues()`
@ -195,7 +206,7 @@ This goroutine can be used like a watchdog timer
## Types
### type [GuiConfig](/structs.go#L68)
### type [GuiConfig](/structs.go#L65)
`type GuiConfig struct { ... }`
@ -205,13 +216,13 @@ This goroutine can be used like a watchdog timer
var Config GuiConfig
```
### type [GuiDebug](/structs.go#L56)
### type [GuiDebug](/structs.go#L53)
`type GuiDebug struct { ... }`
This struct can be used with go-arg
### type [Node](/structs.go#L87)
### type [Node](/structs.go#L84)
`type Node struct { ... }`

View File

@ -207,8 +207,6 @@ my guess).
## Sub Packages
* [need-to-redo](./need-to-redo)
* [toolkit](./toolkit)
---

18
andlabs.go Normal file
View File

@ -0,0 +1,18 @@
// +build windows
/*
this is a direct compile version of andlabs/ui for windows since
golang on windows does not yet support plugins
*/
package gui
import (
"log"
"git.wit.org/wit/gui/toolkit/andlabs-direct"
)
func trythis() {
log.Println("not sure what to try")
toolkit.DebugToolkit = true
}

View File

@ -77,8 +77,8 @@ func buttonWindow() {
log.Println("world")
})
g.NewButton("LoadToolkit(andlabs2)", func () {
gui.LoadToolkit("andlabs2")
g.NewButton("LoadToolkit(andlabs)", func () {
gui.LoadToolkit("andlabs")
})
g.NewButton("LoadToolkit(gocui)", func () {

View File

@ -24,7 +24,7 @@ isAlpha := regexp.MustCompile(`^[A-Za-z]+$`).MatchString
for _, username := range []string{"userone", "user2", "user-three"} {
if !isAlpha(username) {
fmt.Printf("%q is not valid\n", username)
log.Printf("%q is not valid\n", username)
}
}

View File

@ -2,24 +2,15 @@ package gui
import "log"
// import toolkit "git.wit.org/wit/gui/toolkit/andlabs"
// import newtoolkit "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 newT *toolkit.Toolkit
var newNode *Node
if (GetDebug()) {
log.Println("toolkit.NewGroup() START", name)
}
// if (n.toolkit == nil) {
// log.Println("toolkit.NewGroup() toolkit == nil")
// panic("toolkit should never be nil")
// }
newNode = n.New(name)
log.Println("gui.Node.NewGroup()", name)
@ -31,16 +22,5 @@ func (n *Node) NewGroup(name string) *Node {
aplug.NewGroup(&n.Widget, &newNode.Widget)
}
// make a *Node with a *toolkit.Group
// newT = n.toolkit.NewGroup(name)
// newNode.toolkit = newT
// newNode.Dump()
return newNode
}
/*
func (n *Node) AddGroup(title string) *Node {
return n.NewGroup(title + " deprecated AddGroup")
}
*/

View File

@ -52,12 +52,12 @@ func Init() {
// the program didn't specify a plugin. Try to load one
// TODO: detect the OS & user preferences to load the best one
if (initBAD) {
if (LoadToolkit("andlabs2")) {
if (LoadToolkit("andlabs")) {
initBAD = false
}
}
// andlabs2 gui failed. fall back to the terminal gui (should be compiled into the binary)
// andlabs gui plugin failed. fall back to the terminal gui (should be compiled into the binary)
if (initBAD) {
if (LoadToolkit("gocui")) {
initBAD = false
@ -112,7 +112,7 @@ func Main(f func()) {
// other goroutines. This is due to the nature of how
// Linux, MacOS and Windows work (they all work differently. suprise. surprise.)
// For example: gui.Queue(NewWindow())
func queue(f func()) {
func Queue(f func()) {
log.Println("Sending function to gui.Main() (using gtk via andlabs/ui)")
// toolkit.Queue(f)
for _, aplug := range allPlugins {

View File

@ -3,11 +3,9 @@ package gui
import (
"log"
"reflect"
"git.wit.org/wit/gui/toolkit"
)
// import toolkit "git.wit.org/wit/gui/toolkit/andlabs"
import newtoolkit "git.wit.org/wit/gui/toolkit"
//
// All GUI Data Structures and functions that are external
// within the toolkit/ abstraction layer
@ -31,7 +29,6 @@ func SetDebug (s bool) {
// also set these
Config.Debug.Dump = s
Config.Debug.Node = s
// toolkit.DebugToolkit = s
}
func GetDebugToolkit () bool {
@ -92,7 +89,7 @@ type Node struct {
Width int
Height int
Widget newtoolkit.Widget
Widget toolkit.Widget
// this function is run when there are mouse or keyboard events
OnChanged func(*Node)
@ -101,9 +98,6 @@ type Node struct {
// TODO: make children a double linked list since some toolkits require order (?)
children []*Node
// hmm. how do you handle this when the toolkits are plugins?
// toolkit *toolkit.Toolkit
// things that may not really be needed (?)
custom func()
checked bool
@ -144,26 +138,9 @@ func (n *Node) Dump() {
IndentPrintln("OnChanged = ", n.OnChanged)
}
IndentPrintln("text = ", reflect.ValueOf(n.text).Kind(), n.text)
// if (n.toolkit != nil) {
// IndentPrintln("toolkit = ", reflect.ValueOf(n.toolkit).Kind())
// n.toolkit.Dump()
// }
// if (n.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")
// }
IndentPrintln("NODE DUMP END")
}
/*
func (n *Node) SetName(name string) {
n.toolkit.SetWindowTitle(name)
return
}
*/
func (n *Node) Append(child *Node) {
n.children = append(n.children, child)
if (Config.Debug.Debug) {
@ -175,12 +152,6 @@ func (n *Node) Append(child *Node) {
// time.Sleep(3 * time.Second)
}
/*
func (n *Node) List() {
findByIdDFS(n, "test")
}
*/
var listChildrenParent *Node
var listChildrenDepth int = 0
var defaultPadding = " "
@ -217,8 +188,7 @@ func (n *Node) ListChildren(dump bool) {
log.Println("\t\t\tlistChildrenParent =",listChildrenParent.id)
}
if (listChildrenParent.id != n.parent.id) {
log.Println("parent.child does not match child.parent")
panic("parent.child does not match child.parent")
log.Fatalln("parent.child does not match child.parent")
}
}
}

View File

@ -1,4 +1,4 @@
package main
package toolkit
import "log"
@ -6,12 +6,12 @@ import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
// create a new box
func (t *andlabsT) GetBox() *ui.Box {
func (t *Toolkit) GetBox() *ui.Box {
return t.uiBox
}
// create a new box
func (t *andlabsT) NewBox() *andlabsT {
func (t *Toolkit) NewBox() *Toolkit {
if (DebugToolkit) {
log.Println("gui.Toolbox.NewBox() START create default")
}
@ -20,7 +20,7 @@ func (t *andlabsT) NewBox() *andlabsT {
if (DebugToolkit) {
log.Println("\tgui.Toolbox.NewBox() is a Group")
}
var newTK andlabsT
var newTK Toolkit
vbox := ui.NewVerticalBox()
vbox.SetPadded(padded)
@ -33,7 +33,7 @@ func (t *andlabsT) NewBox() *andlabsT {
if (DebugToolkit) {
log.Println("\tgui.Toolbox.NewBox() is a Box")
}
var newTK andlabsT
var newTK Toolkit
vbox := ui.NewVerticalBox()
vbox.SetPadded(padded)
@ -47,7 +47,7 @@ func (t *andlabsT) NewBox() *andlabsT {
if (DebugToolkit) {
log.Println("\tgui.Toolbox.NewBox() is a Window")
}
var newT andlabsT
var newT Toolkit
vbox := ui.NewVerticalBox()
vbox.SetPadded(padded)

View File

@ -0,0 +1,79 @@
package toolkit
import "log"
// import "os"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
// make new Group here
func (t Toolkit) NewButton(name string) *Toolkit {
var newt Toolkit
var b *ui.Button
if t.broken() {
return nil
}
if (DebugToolkit) {
log.Println("gui.Toolbox.NewButton() create", name)
}
b = ui.NewButton(name)
newt.uiButton = b
b.OnClicked(func(*ui.Button) {
log.Println("TODO: IN TOOLKIT GOROUTINE. SHOULD LEAVE HERE VIA channels. button name =", name)
t.Dump()
newt.Dump()
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() Should do something here")
}
if (newt.Custom == nil) {
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() toolkit.Custom == nil")
}
} else {
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() toolkit.Custom() START")
}
newt.Custom()
return
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() toolkit.Custom() END")
}
}
if (t.Custom == nil) {
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() parent toolkit.Custom == nil")
}
} else {
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() running parent toolkit.Custom() START (IS THIS A BAD IDEA?)")
}
t.Custom()
return
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() running parent toolkit.Custom() END (IS THIS A BAD IDEA?)")
}
}
log.Println("TODO: LEFT TOOLKIT GOROUTINE WITH NOTHING TO DO button name =", name)
})
if (DebugToolkit) {
log.Println("gui.Toolbox.NewButton() about to append to Box parent t:", name)
t.Dump()
log.Println("gui.Toolbox.NewButton() about to append to Box new t:", name)
newt.Dump()
}
if (t.uiBox != nil) {
t.uiBox.Append(b, stretchy)
} else if (t.uiWindow != nil) {
t.uiWindow.SetChild(b)
} else {
log.Println("ERROR: wit/gui andlabs couldn't place this button in a box or a window")
log.Println("ERROR: wit/gui andlabs couldn't place this button in a box or a window")
return &t
}
return &newt
}

View File

@ -1,13 +1,13 @@
package main
package toolkit
import "log"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t andlabsT) NewCheckbox(name string) *andlabsT {
func (t Toolkit) NewCheckbox(name string) *Toolkit {
log.Println("gui.Toolkit.NewCheckbox()", name)
var newt andlabsT
var newt Toolkit
if t.broken() {
return nil
@ -25,7 +25,7 @@ func (t andlabsT) NewCheckbox(name string) *andlabsT {
return &newt
}
func (t andlabsT) Checked() bool {
func (t Toolkit) Checked() bool {
if t.broken() {
return false
}

View File

@ -1,4 +1,4 @@
package main
package toolkit
import "log"
@ -9,7 +9,7 @@ func init() {
setDefaultBehavior(true)
}
func (t andlabsT) commonChange(widget string) {
func (t Toolkit) commonChange(widget string) {
s := t.String()
if (DebugToolkit) {
log.Println("gui.Toolkit.ui.OnChanged() =", s)
@ -36,7 +36,7 @@ func (t andlabsT) commonChange(widget string) {
// 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 (?)
func (t *andlabsT) broken() bool {
func (t *Toolkit) broken() bool {
if (t.uiBox == nil) {
if (t.uiWindow != nil) {
if (DebugToolkit) {

View File

@ -1,4 +1,4 @@
package main
package toolkit
import "log"
@ -19,7 +19,7 @@ func BlankWindow(w *ui.Window) *ui.Box {
return hbox
}
func (t *andlabsT) DemoNumbersPage() {
func (t *Toolkit) DemoNumbersPage() {
var w *ui.Window
log.Println("Starting wit/gui toolkit andlabs/ui DemoNumbersPage()")

View File

@ -0,0 +1,55 @@
package toolkit
import "log"
import "os"
// import "time"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t *Toolkit) NewDropdown(title string) *Toolkit {
// make new node here
if (DebugToolkit) {
log.Println("gui.Toolbox.NewDropdownCombobox()", title)
}
var newt Toolkit
if t.broken() {
return nil
}
s := ui.NewCombobox()
newt.uiCombobox = s
newt.uiBox = t.uiBox
t.uiBox.Append(s, stretchy)
// initialize the index
newt.c = 0
newt.val = make(map[int]string)
s.OnSelected(func(spin *ui.Combobox) {
i := spin.Selected()
if (newt.val == nil) {
log.Println("make map didn't work")
os.Exit(0)
}
newt.text = newt.val[i]
newt.commonChange("Dropdown")
})
return &newt
}
func (t *Toolkit) AddDropdown(title string) {
t.uiCombobox.Append(title)
if (t.val == nil) {
log.Println("make map didn't work")
return
}
t.val[t.c] = title
t.c = t.c + 1
}
func (t Toolkit) SetDropdown(i int) {
t.uiCombobox.SetSelected(i)
}

View File

@ -1,4 +1,4 @@
package main
package toolkit
import "log"
import "os"
@ -6,23 +6,9 @@ import "os"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
import "git.wit.org/wit/gui/toolkit"
func NewGroup(parentW *toolkit.Widget, w *toolkit.Widget) {
log.Println("gui.andlabs.NewGroup()", w.Name)
t := mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewGroup() toolkit struct == nil. name=", parentW.Name, w.Name)
listMap()
}
newt := t.NewGroup(w.Name)
mapWidgetsToolkits(w, newt)
}
// make new Group here
func (t andlabsT) NewGroup(title string) *andlabsT {
var newt andlabsT
func (t Toolkit) NewGroup(title string) *Toolkit {
var newt Toolkit
if (DebugToolkit) {
log.Println("gui.Toolbox.NewGroup() create", title)

View File

@ -0,0 +1,21 @@
package toolkit
import "log"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t *Toolkit) NewLabel(name string) *Toolkit {
// make new node here
log.Println("gui.Toolbox.NewLabel", name)
if t.broken() {
return nil
}
var newt Toolkit
newt.uiLabel = ui.NewLabel(name)
newt.uiBox = t.uiBox
t.uiBox.Append(newt.uiLabel, false)
return &newt
}

View File

@ -0,0 +1,31 @@
package toolkit
import (
"log"
"github.com/andlabs/ui"
// the _ means we only need this for the init()
_ "github.com/andlabs/ui/winmanifest"
)
func Main(f func()) {
if (DebugToolkit) {
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
}
ui.Main(f)
}
// Other goroutines must use this to access the GUI
//
// You can not acess / process the GUI thread directly from
// other goroutines. This is due to the nature of how
// Linux, MacOS and Windows work (they all work differently. suprise. surprise.)
//
// For example: Queue(NewWindow())
//
func Queue(f func()) {
if (DebugToolkit) {
log.Println("Sending function to gui.Main() (using gtk via andlabs/ui)")
}
ui.QueueMain(f)
}

View File

@ -0,0 +1,31 @@
package toolkit
import "log"
import "os"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t Toolkit) NewSlider(title string, x int, y int) *Toolkit {
// make new node here
log.Println("gui.Toolkit.NewSpinbox()", x, y)
var newt Toolkit
if (t.uiBox == nil) {
log.Println("gui.ToolkitNode.NewGroup() node.UiBox == nil. I can't add a range UI element without a place to put it")
log.Println("probably could just make a box here?")
os.Exit(0)
return nil
}
s := ui.NewSlider(x, y)
newt.uiSlider = s
newt.uiBox = t.uiBox
t.uiBox.Append(s, stretchy)
s.OnChanged(func(spin *ui.Slider) {
newt.commonChange("Slider")
})
return &newt
}

View File

@ -1,4 +1,4 @@
package main
package toolkit
import "log"
import "os"
@ -6,10 +6,10 @@ import "os"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t andlabsT) NewSpinner(title string, x int, y int) *andlabsT {
func (t Toolkit) NewSpinner(title string, x int, y int) *Toolkit {
// make new node here
log.Println("gui.Toolkit.NewSpinner()", x, y)
var newt andlabsT
var newt Toolkit
if (t.uiBox == nil) {
log.Println("gui.ToolkitNode.NewSpinner() node.UiBox == nil. I can't add a range UI element without a place to put it")

View File

@ -1,4 +1,4 @@
package main
package toolkit
import "log"
@ -47,15 +47,15 @@ func GetDebugToolkit () bool {
}
// stores the raw toolkit internals
type andlabsT struct {
type Toolkit struct {
id string
Name string
Width int
Height int
OnChanged func(*andlabsT)
OnExit func(*andlabsT)
OnChanged func(*Toolkit)
OnExit func(*Toolkit)
Custom func()
@ -84,18 +84,18 @@ type andlabsT struct {
text string
}
func (t *andlabsT) String() string {
func (t *Toolkit) String() string {
return t.GetText()
}
func forceDump(t *andlabsT) {
func forceDump(t *Toolkit) {
tmp := DebugToolkit
DebugToolkit = true
t.Dump()
DebugToolkit = tmp
}
func (t *andlabsT) GetText() string {
func (t *Toolkit) GetText() string {
t.Dump()
if (DebugToolkit) {
log.Println("gui.Toolkit.Text() Enter")
@ -128,7 +128,7 @@ func (t *andlabsT) GetText() string {
return ""
}
func (t *andlabsT) SetText(s string) bool {
func (t *Toolkit) SetText(s string) bool {
if (DebugToolkit) {
log.Println("gui.Toolkit.Text() Enter")
scs := spew.ConfigState{MaxDepth: 1}
@ -151,7 +151,7 @@ func (t *andlabsT) SetText(s string) bool {
return false
}
func sanity(t *andlabsT) bool {
func sanity(t *Toolkit) bool {
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() Enter")
scs := spew.ConfigState{MaxDepth: 1}
@ -166,7 +166,7 @@ func sanity(t *andlabsT) bool {
return true
}
func (t *andlabsT) SetValue(i int) bool {
func (t *Toolkit) SetValue(i int) bool {
log.Println("gui.Toolkit.SetValue() START")
if (sanity(t)) {
return false
@ -176,7 +176,7 @@ func (t *andlabsT) SetValue(i int) bool {
return true
}
func (t *andlabsT) Value() int {
func (t *Toolkit) Value() int {
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() Enter")
scs := spew.ConfigState{MaxDepth: 1}
@ -202,7 +202,7 @@ func (t *andlabsT) Value() int {
return 0
}
func (t *andlabsT) Dump() {
func (t *Toolkit) Dump() {
if ! DebugToolkit {
return
}

View File

@ -1,13 +1,12 @@
package main
package toolkit
import (
"log"
"time"
"git.wit.org/wit/gui/toolkit"
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
)
/*
@ -22,9 +21,9 @@ import (
once there is one. If you send a Window here, it will replace
any existing tabs rather than adding a new one
*/
func (t *andlabsT) newTab(name string) *andlabsT {
func (t *Toolkit) AddTab(name string) *Toolkit {
// var w *ui.Window
var newt *andlabsT
var newt *Toolkit
log.Println("gui.toolkit.AddTab() sleep 3")
@ -69,8 +68,8 @@ func tabSetMargined(tab *ui.Tab) {
}
}
func newTab(w *ui.Window, name string) *andlabsT {
var t andlabsT
func newTab(w *ui.Window, name string) *Toolkit {
var t Toolkit
if (DebugToolkit) {
log.Println("gui.toolkit.NewTab() ADD", name)
}
@ -100,8 +99,8 @@ func newTab(w *ui.Window, name string) *andlabsT {
return &t
}
func (t *andlabsT) appendTab(name string) *andlabsT {
var newT andlabsT
func (t *Toolkit) appendTab(name string) *Toolkit {
var newT Toolkit
if (DebugToolkit) {
log.Println("gui.toolkit.NewTab() ADD", name)
}
@ -132,16 +131,3 @@ func (t *andlabsT) appendTab(name string) *andlabsT {
newT.uiBox = hbox
return &newT
}
func NewTab(parentW *toolkit.Widget, w *toolkit.Widget) {
var newt *andlabsT
log.Println("gui.andlabs.NewTab()", w.Name)
t := mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewTab() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
newt = t.newTab(w.Name)
mapWidgetsToolkits(w, newt)
}

View File

@ -0,0 +1,34 @@
package toolkit
import "log"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t Toolkit) NewTextbox(name string) *Toolkit {
if (DebugToolkit) {
log.Println("gui.Toolkit.NewTextbox()", name)
}
var newt Toolkit
if t.broken() {
return nil
}
c := ui.NewNonWrappingMultilineEntry()
newt.uiMultilineEntry = c
newt.uiBox = t.uiBox
newt.Name = name
if (defaultBehavior) {
t.uiBox.Append(c, true)
} else {
t.uiBox.Append(c, stretchy)
}
c.OnChanged(func(spin *ui.MultilineEntry) {
newt.commonChange("Textbox")
})
return &newt
}

View File

@ -0,0 +1,66 @@
package toolkit
import (
"log"
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
)
func (t *Toolkit) MessageWindow(msg1 string, msg2 string) {
ui.MsgBox(t.uiWindow, msg1, msg2)
}
func (t *Toolkit) ErrorWindow(msg1 string, msg2 string) {
ui.MsgBoxError(t.uiWindow, msg1, msg2)
}
func NewWindow(title string, x int, y int) *Toolkit {
var t Toolkit
if (DebugToolkit) {
log.Println("toolkit NewWindow", title, x, y)
}
w := ui.NewWindow(title, x, y, menubar)
w.SetBorderless(canvas)
w.SetMargined(margin)
w.OnClosing(func(*ui.Window) bool {
if (DebugToolkit) {
log.Println("ui.Window().OnExit() SHOULD ATTEMPT CALLBACK here")
t.Dump()
}
if (t.OnExit != nil) {
if (DebugToolkit) {
log.Println("ui.Window().OnExit() ATTEMPTING toolkit.OnExit CALLBACK")
}
t.OnExit(&t)
}
if (t.Custom != nil) {
if (DebugToolkit) {
log.Println("ui.Window().Custom() ATTEMPTING toolkit.Custom CALLBACK")
}
t.Custom()
}
if (DebugToolkit) {
log.Println("ui.Window().OnExit() Toolkit.OnExit is nil")
}
return true
})
w.Show()
t.uiWindow = w
t.UiWindowBad = w // deprecate this as soon as possible
return &t
}
func (t *Toolkit) SetWindowTitle(title string) {
if (DebugToolkit) {
log.Println("toolkit NewWindow", t.Name, "title", title)
}
win := t.uiWindow
if (win != nil) {
win.SetTitle(title)
} else {
if (DebugToolkit) {
log.Println("Setting the window title", title)
}
}
}

4
toolkit/andlabs/Makefile Normal file
View File

@ -0,0 +1,4 @@
all: plugin
plugin:
GO111MODULE="off" go build -buildmode=plugin -o ../andlabs.so

View File

@ -1,4 +1,4 @@
package toolkit
package main
import "log"
@ -6,12 +6,12 @@ import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
// create a new box
func (t *Toolkit) GetBox() *ui.Box {
func (t *andlabsT) GetBox() *ui.Box {
return t.uiBox
}
// create a new box
func (t *Toolkit) NewBox() *Toolkit {
func (t *andlabsT) NewBox() *andlabsT {
if (DebugToolkit) {
log.Println("gui.Toolbox.NewBox() START create default")
}
@ -20,7 +20,7 @@ func (t *Toolkit) NewBox() *Toolkit {
if (DebugToolkit) {
log.Println("\tgui.Toolbox.NewBox() is a Group")
}
var newTK Toolkit
var newTK andlabsT
vbox := ui.NewVerticalBox()
vbox.SetPadded(padded)
@ -33,7 +33,7 @@ func (t *Toolkit) NewBox() *Toolkit {
if (DebugToolkit) {
log.Println("\tgui.Toolbox.NewBox() is a Box")
}
var newTK Toolkit
var newTK andlabsT
vbox := ui.NewVerticalBox()
vbox.SetPadded(padded)
@ -47,7 +47,7 @@ func (t *Toolkit) NewBox() *Toolkit {
if (DebugToolkit) {
log.Println("\tgui.Toolbox.NewBox() is a Window")
}
var newT Toolkit
var newT andlabsT
vbox := ui.NewVerticalBox()
vbox.SetPadded(padded)

View File

@ -1,68 +1,56 @@
package toolkit
package main
import "log"
// import "os"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
// make new Group here
func (t Toolkit) NewButton(name string) *Toolkit {
var newt Toolkit
import "git.wit.org/wit/gui/toolkit"
func NewButton(parentW *toolkit.Widget, w *toolkit.Widget) {
var t, newt *andlabsT
var b *ui.Button
log.Println("gui.andlabs.NewButton()", w.Name)
t = mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewButton() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
if t.broken() {
return nil
return
}
newt = new(andlabsT)
if (DebugToolkit) {
log.Println("gui.Toolbox.NewButton() create", name)
}
b = ui.NewButton(name)
b = ui.NewButton(w.Name)
newt.uiButton = b
b.OnClicked(func(*ui.Button) {
log.Println("TODO: IN TOOLKIT GOROUTINE. SHOULD LEAVE HERE VIA channels. button name =", name)
if (DebugToolkit) {
log.Println("TODO: IN TOOLKIT GOROUTINE. SHOULD LEAVE HERE VIA channels. button name =", w.Name)
log.Println("FOUND WIDGET!", w)
}
if (w.Custom != nil) {
w.Custom()
return
}
if (w.Event != nil) {
w.Event(w)
return
}
t.Dump()
newt.Dump()
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() Should do something here")
log.Println("TODO: LEFT TOOLKIT GOROUTINE WITH NOTHING TO DO button name =", w.Name)
}
if (newt.Custom == nil) {
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() toolkit.Custom == nil")
}
} else {
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() toolkit.Custom() START")
}
newt.Custom()
return
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() toolkit.Custom() END")
}
}
if (t.Custom == nil) {
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() parent toolkit.Custom == nil")
}
} else {
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() running parent toolkit.Custom() START (IS THIS A BAD IDEA?)")
}
t.Custom()
return
if (DebugToolkit) {
log.Println("wit/gui/toolkit NewButton() running parent toolkit.Custom() END (IS THIS A BAD IDEA?)")
}
}
log.Println("TODO: LEFT TOOLKIT GOROUTINE WITH NOTHING TO DO button name =", name)
})
if (DebugToolkit) {
log.Println("gui.Toolbox.NewButton() about to append to Box parent t:", name)
log.Println("gui.Toolbox.NewButton() about to append to Box parent t:", w.Name)
t.Dump()
log.Println("gui.Toolbox.NewButton() about to append to Box new t:", name)
log.Println("gui.Toolbox.NewButton() about to append to Box new t:", w.Name)
newt.Dump()
}
if (t.uiBox != nil) {
@ -72,8 +60,8 @@ func (t Toolkit) NewButton(name string) *Toolkit {
} else {
log.Println("ERROR: wit/gui andlabs couldn't place this button in a box or a window")
log.Println("ERROR: wit/gui andlabs couldn't place this button in a box or a window")
return &t
return
}
return &newt
mapWidgetsToolkits(w, newt)
}

View File

@ -1,13 +1,13 @@
package toolkit
package main
import "log"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t Toolkit) NewCheckbox(name string) *Toolkit {
func (t andlabsT) NewCheckbox(name string) *andlabsT {
log.Println("gui.Toolkit.NewCheckbox()", name)
var newt Toolkit
var newt andlabsT
if t.broken() {
return nil
@ -25,7 +25,7 @@ func (t Toolkit) NewCheckbox(name string) *Toolkit {
return &newt
}
func (t Toolkit) Checked() bool {
func (t andlabsT) Checked() bool {
if t.broken() {
return false
}

View File

@ -1,4 +1,4 @@
package toolkit
package main
import "log"
@ -9,7 +9,7 @@ func init() {
setDefaultBehavior(true)
}
func (t Toolkit) commonChange(widget string) {
func (t andlabsT) commonChange(widget string) {
s := t.String()
if (DebugToolkit) {
log.Println("gui.Toolkit.ui.OnChanged() =", s)
@ -36,7 +36,7 @@ func (t Toolkit) commonChange(widget string) {
// 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 (?)
func (t *Toolkit) broken() bool {
func (t *andlabsT) broken() bool {
if (t.uiBox == nil) {
if (t.uiWindow != nil) {
if (DebugToolkit) {

View File

@ -1,4 +1,4 @@
package toolkit
package main
import "log"
@ -19,7 +19,7 @@ func BlankWindow(w *ui.Window) *ui.Box {
return hbox
}
func (t *Toolkit) DemoNumbersPage() {
func (t *andlabsT) DemoNumbersPage() {
var w *ui.Window
log.Println("Starting wit/gui toolkit andlabs/ui DemoNumbersPage()")

View File

@ -1,18 +1,19 @@
package toolkit
package main
import "log"
import "os"
// import "time"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t *Toolkit) NewDropdown(title string) *Toolkit {
import "git.wit.org/wit/gui/toolkit"
func (t *andlabsT) NewDropdown(title string) *andlabsT {
// make new node here
if (DebugToolkit) {
log.Println("gui.Toolbox.NewDropdownCombobox()", title)
}
var newt Toolkit
var newt andlabsT
if t.broken() {
return nil
@ -31,7 +32,7 @@ func (t *Toolkit) NewDropdown(title string) *Toolkit {
i := spin.Selected()
if (newt.val == nil) {
log.Println("make map didn't work")
os.Exit(0)
newt.text = "error"
}
newt.text = newt.val[i]
newt.commonChange("Dropdown")
@ -40,7 +41,7 @@ func (t *Toolkit) NewDropdown(title string) *Toolkit {
return &newt
}
func (t *Toolkit) AddDropdown(title string) {
func (t *andlabsT) AddDropdownName(title string) {
t.uiCombobox.Append(title)
if (t.val == nil) {
log.Println("make map didn't work")
@ -50,6 +51,40 @@ func (t *Toolkit) AddDropdown(title string) {
t.c = t.c + 1
}
func (t Toolkit) SetDropdown(i int) {
func (t andlabsT) SetDropdown(i int) {
t.uiCombobox.SetSelected(i)
}
func NewDropdown(parentW *toolkit.Widget, w *toolkit.Widget) {
log.Println("gui.andlabs.NewDropdown()", w.Name)
t := mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewDropdown() toolkit struct == nil. name=", parentW.Name, w.Name)
listMap()
}
newt := t.NewDropdown(w.Name)
mapWidgetsToolkits(w, newt)
}
func AddDropdownName(w *toolkit.Widget, s string) {
log.Println("gui.andlabs.AddDropdownName()", w.Name, "add:", s)
t := mapToolkits[w]
if (t == nil) {
log.Println("go.andlabs.AddDropdownName() toolkit struct == nil. name=", w.Name, s)
listMap()
}
t.AddDropdownName(s)
}
func SetDropdown(w *toolkit.Widget, i int) {
log.Println("gui.andlabs.SetDropdown()", i)
t := mapToolkits[w]
if (t == nil) {
log.Println("go.andlabs.SetDropdown() toolkit struct == nil. name=", w.Name, i)
listMap()
}
t.SetDropdown(i)
}

View File

@ -1,14 +1,29 @@
package toolkit
package main
import "log"
import "os"
import (
"log"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
"git.wit.org/wit/gui/toolkit"
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
)
func NewGroup(parentW *toolkit.Widget, w *toolkit.Widget) {
log.Println("gui.andlabs.NewGroup()", w.Name)
t := mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewGroup() toolkit struct == nil. name=", parentW.Name, w.Name)
listMap()
}
newt := t.NewGroup(w.Name)
mapWidgetsToolkits(w, newt)
}
// make new Group here
func (t Toolkit) NewGroup(title string) *Toolkit {
var newt Toolkit
func (t andlabsT) NewGroup(title string) *andlabsT {
var newt andlabsT
if (DebugToolkit) {
log.Println("gui.Toolbox.NewGroup() create", title)
@ -22,8 +37,7 @@ func (t Toolkit) NewGroup(title string) *Toolkit {
t.uiWindow.SetChild(g)
} else {
log.Println("gui.ToolboxNode.NewGroup() node.UiBox == nil. I can't add a range UI element without a place to put it")
log.Println("probably could just make a box here?")
os.Exit(0)
log.Fatalln("probably could just make a box here?")
}
hbox := ui.NewVerticalBox()

View File

@ -1,21 +1,42 @@
package toolkit
package main
import "log"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t *Toolkit) NewLabel(name string) *Toolkit {
// make new node here
log.Println("gui.Toolbox.NewLabel", name)
import "git.wit.org/wit/gui/toolkit"
func NewLabel(parentW *toolkit.Widget, w *toolkit.Widget) {
var t, newt *andlabsT
log.Println("gui.andlabs.NewButton()", w.Name)
t = mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewButton() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
if t.broken() {
return nil
return
}
var newt Toolkit
newt.uiLabel = ui.NewLabel(name)
newt.uiBox = t.uiBox
t.uiBox.Append(newt.uiLabel, false)
newt = new(andlabsT)
return &newt
newt.uiLabel = ui.NewLabel(w.Name)
newt.uiBox = t.uiBox
if (DebugToolkit) {
log.Println("gui.Toolbox.NewButton() about to append to Box parent t:", w.Name)
t.Dump()
log.Println("gui.Toolbox.NewButton() about to append to Box new t:", w.Name)
newt.Dump()
}
if (t.uiBox != nil) {
t.uiBox.Append(newt.uiLabel, false)
} else {
log.Println("ERROR: wit/gui andlabs couldn't place this label in a box")
return
}
mapWidgetsToolkits(w, newt)
}

View File

@ -1,7 +1,10 @@
package toolkit
package main
import (
"log"
// "time"
"git.wit.org/wit/gui/toolkit"
"github.com/andlabs/ui"
// the _ means we only need this for the init()
@ -12,7 +15,17 @@ func Main(f func()) {
if (DebugToolkit) {
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
}
ui.Main(f)
ui.Main( func() {
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
// time.Sleep(1 * time.Second)
// NewWindow2("helloworld2", 200, 100)
f()
})
}
// Other goroutines must use this to access the GUI
@ -25,7 +38,20 @@ func Main(f func()) {
//
func Queue(f func()) {
if (DebugToolkit) {
log.Println("Sending function to gui.Main() (using gtk via andlabs/ui)")
log.Println("Sending function to ui.QueueMain() (using gtk via andlabs/ui)")
}
ui.QueueMain(f)
//ui.QueueMain(f)
f()
}
func Init() {
log.Println("should Init() here")
mapWidgets = make(map[*andlabsT]*toolkit.Widget)
mapToolkits = make(map[*toolkit.Widget]*andlabsT)
}
func Quit() {
log.Println("should Quit() here")
// myExit(nil)
}

View File

@ -1,15 +1,19 @@
package toolkit
package main
import "log"
import "os"
import (
"log"
"os"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
"git.wit.org/wit/gui/toolkit"
func (t Toolkit) NewSlider(title string, x int, y int) *Toolkit {
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
)
func (t andlabsT) NewSlider(title string, x int, y int) *andlabsT {
// make new node here
log.Println("gui.Toolkit.NewSpinbox()", x, y)
var newt Toolkit
var newt andlabsT
if (t.uiBox == nil) {
log.Println("gui.ToolkitNode.NewGroup() node.UiBox == nil. I can't add a range UI element without a place to put it")
@ -29,3 +33,16 @@ func (t Toolkit) NewSlider(title string, x int, y int) *Toolkit {
return &newt
}
func NewSlider(parentW *toolkit.Widget, w *toolkit.Widget) {
var newt *andlabsT
log.Println("gui.andlabs.NewTab()", w.Name)
t := mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewTab() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
newt = t.NewSlider(w.Name, w.X, w.Y)
mapWidgetsToolkits(w, newt)
}

View File

@ -1,4 +1,4 @@
package toolkit
package main
import "log"
import "os"
@ -6,10 +6,10 @@ import "os"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t Toolkit) NewSpinner(title string, x int, y int) *Toolkit {
func (t andlabsT) NewSpinner(title string, x int, y int) *andlabsT {
// make new node here
log.Println("gui.Toolkit.NewSpinner()", x, y)
var newt Toolkit
var newt andlabsT
if (t.uiBox == nil) {
log.Println("gui.ToolkitNode.NewSpinner() node.UiBox == nil. I can't add a range UI element without a place to put it")

View File

@ -1,4 +1,4 @@
package toolkit
package main
import "log"
@ -47,15 +47,15 @@ func GetDebugToolkit () bool {
}
// stores the raw toolkit internals
type Toolkit struct {
type andlabsT struct {
id string
Name string
Width int
Height int
OnChanged func(*Toolkit)
OnExit func(*Toolkit)
OnChanged func(*andlabsT)
OnExit func(*andlabsT)
Custom func()
@ -84,18 +84,18 @@ type Toolkit struct {
text string
}
func (t *Toolkit) String() string {
func (t *andlabsT) String() string {
return t.GetText()
}
func forceDump(t *Toolkit) {
func forceDump(t *andlabsT) {
tmp := DebugToolkit
DebugToolkit = true
t.Dump()
DebugToolkit = tmp
}
func (t *Toolkit) GetText() string {
func (t *andlabsT) GetText() string {
t.Dump()
if (DebugToolkit) {
log.Println("gui.Toolkit.Text() Enter")
@ -128,7 +128,7 @@ func (t *Toolkit) GetText() string {
return ""
}
func (t *Toolkit) SetText(s string) bool {
func (t *andlabsT) SetText(s string) bool {
if (DebugToolkit) {
log.Println("gui.Toolkit.Text() Enter")
scs := spew.ConfigState{MaxDepth: 1}
@ -151,7 +151,7 @@ func (t *Toolkit) SetText(s string) bool {
return false
}
func sanity(t *Toolkit) bool {
func sanity(t *andlabsT) bool {
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() Enter")
scs := spew.ConfigState{MaxDepth: 1}
@ -166,7 +166,7 @@ func sanity(t *Toolkit) bool {
return true
}
func (t *Toolkit) SetValue(i int) bool {
func (t *andlabsT) SetValue(i int) bool {
log.Println("gui.Toolkit.SetValue() START")
if (sanity(t)) {
return false
@ -176,7 +176,7 @@ func (t *Toolkit) SetValue(i int) bool {
return true
}
func (t *Toolkit) Value() int {
func (t *andlabsT) Value() int {
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() Enter")
scs := spew.ConfigState{MaxDepth: 1}
@ -202,7 +202,7 @@ func (t *Toolkit) Value() int {
return 0
}
func (t *Toolkit) Dump() {
func (t *andlabsT) Dump() {
if ! DebugToolkit {
return
}

View File

@ -1,12 +1,13 @@
package toolkit
package main
import (
"log"
"time"
"git.wit.org/wit/gui/toolkit"
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
)
/*
@ -21,9 +22,9 @@ import (
once there is one. If you send a Window here, it will replace
any existing tabs rather than adding a new one
*/
func (t *Toolkit) AddTab(name string) *Toolkit {
func (t *andlabsT) newTab(name string) *andlabsT {
// var w *ui.Window
var newt *Toolkit
var newt *andlabsT
log.Println("gui.toolkit.AddTab() sleep 3")
@ -68,8 +69,8 @@ func tabSetMargined(tab *ui.Tab) {
}
}
func newTab(w *ui.Window, name string) *Toolkit {
var t Toolkit
func newTab(w *ui.Window, name string) *andlabsT {
var t andlabsT
if (DebugToolkit) {
log.Println("gui.toolkit.NewTab() ADD", name)
}
@ -99,8 +100,8 @@ func newTab(w *ui.Window, name string) *Toolkit {
return &t
}
func (t *Toolkit) appendTab(name string) *Toolkit {
var newT Toolkit
func (t *andlabsT) appendTab(name string) *andlabsT {
var newT andlabsT
if (DebugToolkit) {
log.Println("gui.toolkit.NewTab() ADD", name)
}
@ -131,3 +132,16 @@ func (t *Toolkit) appendTab(name string) *Toolkit {
newT.uiBox = hbox
return &newT
}
func NewTab(parentW *toolkit.Widget, w *toolkit.Widget) {
var newt *andlabsT
log.Println("gui.andlabs.NewTab()", w.Name)
t := mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewTab() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
newt = t.newTab(w.Name)
mapWidgetsToolkits(w, newt)
}

View File

@ -1,16 +1,18 @@
package toolkit
package main
import "log"
import "git.wit.org/wit/gui/toolkit"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
func (t Toolkit) NewTextbox(name string) *Toolkit {
func (t andlabsT) NewTextbox(name string) *andlabsT {
var newt andlabsT
if (DebugToolkit) {
log.Println("gui.Toolkit.NewTextbox()", name)
}
var newt Toolkit
if t.broken() {
return nil
}
@ -32,3 +34,37 @@ func (t Toolkit) NewTextbox(name string) *Toolkit {
return &newt
}
func NewTextbox(parentW *toolkit.Widget, w *toolkit.Widget) {
var t, newt *andlabsT
log.Println("gui.andlabs.NewTextbox()", w.Name)
t = mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewTextbox() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
if t.broken() {
return
}
newt = new(andlabsT)
newt.uiLabel = ui.NewLabel(w.Name)
newt.uiBox = t.uiBox
if (DebugToolkit) {
log.Println("gui.Toolbox.NewTextbox() about to append to Box parent t:", w.Name)
t.Dump()
log.Println("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.Println("ERROR: wit/gui andlabs couldn't place this Textbox in a box")
return
}
mapWidgetsToolkits(w, newt)
}

View File

@ -1,57 +1,69 @@
package toolkit
package main
import (
"log"
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
"git.wit.org/wit/gui/toolkit"
)
func (t *Toolkit) MessageWindow(msg1 string, msg2 string) {
func (t *andlabsT) MessageWindow(msg1 string, msg2 string) {
ui.MsgBox(t.uiWindow, msg1, msg2)
}
func (t *Toolkit) ErrorWindow(msg1 string, msg2 string) {
func (t *andlabsT) ErrorWindow(msg1 string, msg2 string) {
ui.MsgBoxError(t.uiWindow, msg1, msg2)
}
func NewWindow(title string, x int, y int) *Toolkit {
var t Toolkit
func NewWindow(w *toolkit.Widget) {
var t *andlabsT
if (DebugToolkit) {
log.Println("toolkit NewWindow", title, x, y)
log.Println("toolkit NewWindow", w.Name, w.Width, w.Height)
}
w := ui.NewWindow(title, x, y, menubar)
w.SetBorderless(canvas)
w.SetMargined(margin)
w.OnClosing(func(*ui.Window) bool {
if (w == nil) {
log.Println("wit/gui plugin error. widget == nil")
return
}
t = new(andlabsT)
// t = NewWindow2(w.Name, w.Width, w.Height)
// 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 {
if (DebugToolkit) {
log.Println("ui.Window().OnExit() SHOULD ATTEMPT CALLBACK here")
t.Dump()
}
if (t.OnExit != nil) {
if (DebugToolkit) {
log.Println("ui.Window().OnExit() ATTEMPTING toolkit.OnExit CALLBACK")
}
t.OnExit(&t)
if (w.Custom != nil) {
w.Custom()
return true
}
if (t.Custom != nil) {
if (DebugToolkit) {
log.Println("ui.Window().Custom() ATTEMPTING toolkit.Custom CALLBACK")
}
t.Custom()
if (w.Event != nil) {
w.Event(w)
return true
}
if (DebugToolkit) {
log.Println("ui.Window().OnExit() Toolkit.OnExit is nil")
log.Println("andlabs.ui.Window().OnClosing() was not defined")
}
return true
return false
})
w.Show()
t.uiWindow = w
t.UiWindowBad = w // deprecate this as soon as possible
return &t
win.Show()
t.uiWindow = win
t.UiWindowBad = win // deprecate this as soon as possible
t.Name = w.Name
mapWidgetsToolkits(w, t)
return
}
func (t *Toolkit) SetWindowTitle(title string) {
func (t *andlabsT) SetWindowTitle(title string) {
if (DebugToolkit) {
log.Println("toolkit NewWindow", t.Name, "title", title)
}

View File

@ -1,4 +0,0 @@
all: plugin
plugin:
GO111MODULE="off" go build -buildmode=plugin -o ../andlabs2.so

View File

@ -1,67 +0,0 @@
package main
import "log"
// import "os"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
import "git.wit.org/wit/gui/toolkit"
func NewButton(parentW *toolkit.Widget, w *toolkit.Widget) {
var t, newt *andlabsT
var b *ui.Button
log.Println("gui.andlabs.NewButton()", w.Name)
t = mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewButton() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
if t.broken() {
return
}
newt = new(andlabsT)
b = ui.NewButton(w.Name)
newt.uiButton = b
b.OnClicked(func(*ui.Button) {
if (DebugToolkit) {
log.Println("TODO: IN TOOLKIT GOROUTINE. SHOULD LEAVE HERE VIA channels. button name =", w.Name)
log.Println("FOUND WIDGET!", w)
}
if (w.Custom != nil) {
w.Custom()
return
}
if (w.Event != nil) {
w.Event(w)
return
}
t.Dump()
newt.Dump()
if (DebugToolkit) {
log.Println("TODO: LEFT TOOLKIT GOROUTINE WITH NOTHING TO DO button name =", w.Name)
}
})
if (DebugToolkit) {
log.Println("gui.Toolbox.NewButton() about to append to Box parent t:", w.Name)
t.Dump()
log.Println("gui.Toolbox.NewButton() about to append to Box new t:", w.Name)
newt.Dump()
}
if (t.uiBox != nil) {
t.uiBox.Append(b, stretchy)
} else if (t.uiWindow != nil) {
t.uiWindow.SetChild(b)
} else {
log.Println("ERROR: wit/gui andlabs couldn't place this button in a box or a window")
log.Println("ERROR: wit/gui andlabs couldn't place this button in a box or a window")
return
}
mapWidgetsToolkits(w, newt)
}

View File

@ -1,90 +0,0 @@
package main
import "log"
// import "time"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
import "git.wit.org/wit/gui/toolkit"
func (t *andlabsT) NewDropdown(title string) *andlabsT {
// make new node here
if (DebugToolkit) {
log.Println("gui.Toolbox.NewDropdownCombobox()", title)
}
var newt andlabsT
if t.broken() {
return nil
}
s := ui.NewCombobox()
newt.uiCombobox = s
newt.uiBox = t.uiBox
t.uiBox.Append(s, stretchy)
// initialize the index
newt.c = 0
newt.val = make(map[int]string)
s.OnSelected(func(spin *ui.Combobox) {
i := spin.Selected()
if (newt.val == nil) {
log.Println("make map didn't work")
newt.text = "error"
}
newt.text = newt.val[i]
newt.commonChange("Dropdown")
})
return &newt
}
func (t *andlabsT) AddDropdownName(title string) {
t.uiCombobox.Append(title)
if (t.val == nil) {
log.Println("make map didn't work")
return
}
t.val[t.c] = title
t.c = t.c + 1
}
func (t andlabsT) SetDropdown(i int) {
t.uiCombobox.SetSelected(i)
}
func NewDropdown(parentW *toolkit.Widget, w *toolkit.Widget) {
log.Println("gui.andlabs.NewDropdown()", w.Name)
t := mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewDropdown() toolkit struct == nil. name=", parentW.Name, w.Name)
listMap()
}
newt := t.NewDropdown(w.Name)
mapWidgetsToolkits(w, newt)
}
func AddDropdownName(w *toolkit.Widget, s string) {
log.Println("gui.andlabs.AddDropdownName()", w.Name, "add:", s)
t := mapToolkits[w]
if (t == nil) {
log.Println("go.andlabs.AddDropdownName() toolkit struct == nil. name=", w.Name, s)
listMap()
}
t.AddDropdownName(s)
}
func SetDropdown(w *toolkit.Widget, i int) {
log.Println("gui.andlabs.SetDropdown()", i)
t := mapToolkits[w]
if (t == nil) {
log.Println("go.andlabs.SetDropdown() toolkit struct == nil. name=", w.Name, i)
listMap()
}
t.SetDropdown(i)
}

View File

@ -1,42 +0,0 @@
package main
import "log"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
import "git.wit.org/wit/gui/toolkit"
func NewLabel(parentW *toolkit.Widget, w *toolkit.Widget) {
var t, newt *andlabsT
log.Println("gui.andlabs.NewButton()", w.Name)
t = mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewButton() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
if t.broken() {
return
}
newt = new(andlabsT)
newt.uiLabel = ui.NewLabel(w.Name)
newt.uiBox = t.uiBox
if (DebugToolkit) {
log.Println("gui.Toolbox.NewButton() about to append to Box parent t:", w.Name)
t.Dump()
log.Println("gui.Toolbox.NewButton() about to append to Box new t:", w.Name)
newt.Dump()
}
if (t.uiBox != nil) {
t.uiBox.Append(newt.uiLabel, false)
} else {
log.Println("ERROR: wit/gui andlabs couldn't place this label in a box")
return
}
mapWidgetsToolkits(w, newt)
}

View File

@ -1,56 +0,0 @@
package main
import (
"log"
// "time"
"git.wit.org/wit/gui/toolkit"
"github.com/andlabs/ui"
// the _ means we only need this for the init()
_ "github.com/andlabs/ui/winmanifest"
)
func Main(f func()) {
if (DebugToolkit) {
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
}
ui.Main( func() {
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
// time.Sleep(1 * time.Second)
// NewWindow2("helloworld2", 200, 100)
f()
})
}
// Other goroutines must use this to access the GUI
//
// You can not acess / process the GUI thread directly from
// other goroutines. This is due to the nature of how
// Linux, MacOS and Windows work (they all work differently. suprise. surprise.)
//
// For example: Queue(NewWindow())
//
func Queue(f func()) {
if (DebugToolkit) {
log.Println("Sending function to ui.QueueMain() (using gtk via andlabs/ui)")
}
ui.QueueMain(f)
}
func Init() {
log.Println("should Init() here")
mapWidgets = make(map[*andlabsT]*toolkit.Widget)
mapToolkits = make(map[*toolkit.Widget]*andlabsT)
}
func Quit() {
log.Println("should Quit() here")
// myExit(nil)
}

View File

@ -1,48 +0,0 @@
package main
import (
"log"
"os"
"git.wit.org/wit/gui/toolkit"
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
)
func (t andlabsT) NewSlider(title string, x int, y int) *andlabsT {
// make new node here
log.Println("gui.Toolkit.NewSpinbox()", x, y)
var newt andlabsT
if (t.uiBox == nil) {
log.Println("gui.ToolkitNode.NewGroup() node.UiBox == nil. I can't add a range UI element without a place to put it")
log.Println("probably could just make a box here?")
os.Exit(0)
return nil
}
s := ui.NewSlider(x, y)
newt.uiSlider = s
newt.uiBox = t.uiBox
t.uiBox.Append(s, stretchy)
s.OnChanged(func(spin *ui.Slider) {
newt.commonChange("Slider")
})
return &newt
}
func NewSlider(parentW *toolkit.Widget, w *toolkit.Widget) {
var newt *andlabsT
log.Println("gui.andlabs.NewTab()", w.Name)
t := mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewTab() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
newt = t.NewSlider(w.Name, w.X, w.Y)
mapWidgetsToolkits(w, newt)
}

View File

@ -1,70 +0,0 @@
package main
import "log"
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
if (DebugToolkit) {
log.Println("gui.Toolkit.NewTextbox()", name)
}
if t.broken() {
return nil
}
c := ui.NewNonWrappingMultilineEntry()
newt.uiMultilineEntry = c
newt.uiBox = t.uiBox
newt.Name = name
if (defaultBehavior) {
t.uiBox.Append(c, true)
} else {
t.uiBox.Append(c, stretchy)
}
c.OnChanged(func(spin *ui.MultilineEntry) {
newt.commonChange("Textbox")
})
return &newt
}
func NewTextbox(parentW *toolkit.Widget, w *toolkit.Widget) {
var t, newt *andlabsT
log.Println("gui.andlabs.NewTextbox()", w.Name)
t = mapToolkits[parentW]
if (t == nil) {
log.Println("go.andlabs.NewTextbox() toolkit struct == nil. name=", parentW.Name, w.Name)
return
}
if t.broken() {
return
}
newt = new(andlabsT)
newt.uiLabel = ui.NewLabel(w.Name)
newt.uiBox = t.uiBox
if (DebugToolkit) {
log.Println("gui.Toolbox.NewTextbox() about to append to Box parent t:", w.Name)
t.Dump()
log.Println("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.Println("ERROR: wit/gui andlabs couldn't place this Textbox in a box")
return
}
mapWidgetsToolkits(w, newt)
}

View File

@ -1,78 +0,0 @@
package main
import (
"log"
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
"git.wit.org/wit/gui/toolkit"
)
func (t *andlabsT) MessageWindow(msg1 string, msg2 string) {
ui.MsgBox(t.uiWindow, msg1, msg2)
}
func (t *andlabsT) ErrorWindow(msg1 string, msg2 string) {
ui.MsgBoxError(t.uiWindow, msg1, msg2)
}
func NewWindow(w *toolkit.Widget) {
var t *andlabsT
if (DebugToolkit) {
log.Println("toolkit NewWindow", w.Name, w.Width, w.Height)
}
if (w == nil) {
log.Println("wit/gui plugin error. widget == nil")
return
}
t = new(andlabsT)
// t = NewWindow2(w.Name, w.Width, w.Height)
// 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 {
if (DebugToolkit) {
log.Println("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
}
if (DebugToolkit) {
log.Println("andlabs.ui.Window().OnClosing() was not defined")
}
return false
})
win.Show()
t.uiWindow = win
t.UiWindowBad = win // deprecate this as soon as possible
t.Name = w.Name
mapWidgetsToolkits(w, t)
return
}
func (t *andlabsT) SetWindowTitle(title string) {
if (DebugToolkit) {
log.Println("toolkit NewWindow", t.Name, "title", title)
}
win := t.uiWindow
if (win != nil) {
win.SetTitle(title)
} else {
if (DebugToolkit) {
log.Println("Setting the window title", title)
}
}
}

View File

@ -28,6 +28,7 @@ var (
helpLabel *gocui.View
err error
ch chan(func ())
outf *os.File
)
func Init() {
@ -50,6 +51,16 @@ func Init() {
stringWidget = make(map[string]*toolkit.Widget)
ch = make(chan func())
outf, err = os.OpenFile("/tmp/witgui.log", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
if err != nil {
log.Fatalf("error opening file: %v", err)
}
// hmm. where to put this?
// defer outf.Close()
log.SetOutput(outf)
log.Println("This is a test log entry")
}
func Queue(f func()) {
@ -58,6 +69,8 @@ func Queue(f func()) {
}
func Main(f func()) {
// close the STDOUT log file
defer outf.Close()
if (baseGui == nil) {
panic("WTF Main()")
}
@ -76,7 +89,7 @@ func layout(g *gocui.Gui) error {
var err error
maxX, _ := g.Size()
helpLabel, err = g.SetView("help", maxX-32, 0, maxX-1, 11, 0)
helpLabel, err = g.SetView("help", maxX-32, 0, maxX-1, 12, 0)
if err != nil {
if !errors.Is(err, gocui.ErrUnknownView) {
return err
@ -90,6 +103,7 @@ func layout(g *gocui.Gui) error {
fmt.Fprintln(helpLabel, "Arrow keys: Move Button")
fmt.Fprintln(helpLabel, "t: Move Button to the top")
fmt.Fprintln(helpLabel, "b: Move Button to the button")
fmt.Fprintln(helpLabel, "STDOUT: /tmp/witgui.log")
fmt.Fprintln(helpLabel, "Ctrl-C or Q: Exit")
}
return nil

View File

@ -130,7 +130,7 @@ func initKeybindings(g *gocui.Gui) error {
g.SetCurrentView("help")
// moveView(g, tmp, 0, -delta)
if err := g.DeleteView("help"); err != nil {
panic(err)
log.Fatalln("gocui SetKeybinding()", err)
}
return nil
}); err != nil {

View File

@ -14,7 +14,6 @@ import (
// my guess).
func NewWindow() *Node {
var newNode *Node
// var t *toolkit.Toolkit
title := Config.Title
// Windows are created off of the master node of the Binary Tree
@ -38,9 +37,6 @@ func NewWindow() *Node {
log.Println("gui.Node.Window()", title)
// t = toolkit.NewWindow(title, w, h)
// n.toolkit = t
for _, aplug := range allPlugins {
log.Println("gui.Node.NewWindow() toolkit plugin =", aplug.name)
if (aplug.NewWindow == nil) {
@ -50,9 +46,5 @@ func NewWindow() *Node {
aplug.NewWindow(&newNode.Widget)
}
// TODO: this is still confusing and probably wrong. This needs to communicate through a channel
// newNode.toolkit = n.toolkit.NewButton(name)
// newNode.toolkit.Custom = newNode.Widget.Custom
return newNode
}