The debugging window is finally useful

the gui enabled debugging works
        --gui-debug works from the command line
        The debug window can now select things
        debugging now includes widget types
        all the debug flags work
        finally working debugging flags via gui checkboxes
    add debian packaging rules
    use log() in the toolkit
    use a standard log() to simplify debugging flags
    add reference to 'GO Style Guide'
    use the same LICENSE from the GO developers.
    TODO: make this threadsafe
    TODO: fix plugin stuff

Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
Jeff Carr 2023-02-25 14:05:25 -06:00
parent 4242393152
commit 053ea69885
59 changed files with 1615 additions and 1146 deletions

4
.gitignore vendored
View File

@ -8,3 +8,7 @@ cmds/console-ui-helloworld/console-ui-helloworld
cmds/debug/debug cmds/debug/debug
cmds/helloworld/helloworld cmds/helloworld/helloworld
cmds/textbox/textbox cmds/textbox/textbox
# temporary files when building debian packages
/*.deb
/files

27
LICENSE Normal file
View File

@ -0,0 +1,27 @@
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,11 +1,12 @@
.PHONY: README.md .PHONY: README.md
all: README.md all: README.md
reset
@echo @echo
@echo "make cmds # will run all the Example demos and commands" @echo "make examples # will run all the Example demos and commands"
@echo "make update # full git update of all the dependencies" @echo "make update # full git update of all the dependencies"
@echo @echo
#make -C cmds/helloworld make clean
make plugins make plugins
# should update every go dependancy (?) # should update every go dependancy (?)
@ -13,7 +14,16 @@ update:
git pull git pull
go get -v -t -u ./... go get -v -t -u ./...
cmds: cmds-buttonplugin cmds-console-ui-helloworld cmds-debug cmds-helloworld cmds-textbox deb:
cd debian && make
-wit mirrors
examples: \
cmds-buttonplugin \
cmds-console-ui-helloworld \
cmds-helloworld \
cmds-debug \
cmds-textbox
cmds-buttonplugin: cmds-buttonplugin:
make -C cmds/buttonplugin make -C cmds/buttonplugin
@ -51,6 +61,7 @@ README.md: doc.go
clean: clean:
rm -f toolkit/*.so rm -f toolkit/*.so
cd debian && make clean
plugins: plugins-gocui plugins-andlabs plugins: plugins-gocui plugins-andlabs

View File

@ -93,74 +93,93 @@ hopefully also things like libSDL, faiface/pixel, slint
## References ## References
Useful links and other Useful links and other
external things external things which might be useful
which might be useful
[Wikipedia Graphical widget]: [https://en.wikipedia.org/wiki/Graphical_widget](https://en.wikipedia.org/wiki/Graphical_widget) [Wikipedia Graphical widget]: [https://en.wikipedia.org/wiki/Graphical_widget](https://en.wikipedia.org/wiki/Graphical_widget)
[Github mirror]: [https://github.com/witorg/gui](https://github.com/witorg/gui) [Github mirror]: [https://github.com/witorg/gui](https://github.com/witorg/gui)
[Federated git pull]: [https://github.com/forgefed/forgefed](https://github.com/forgefed/forgefed) [Federated git pull]: [https://github.com/forgefed/forgefed](https://github.com/forgefed/forgefed)
[GO Style Guide]: [https://google.github.io/styleguide/go/index](https://google.github.io/styleguide/go/index)
```go ```go
* [Wikipedia Graphical widget] * [Wikipedia Graphical widget]
* [Github mirror] * [Github mirror]
* [Federated git pull] * [Federated git pull]
* [GO Style Guide]
```
version v1.3
I like things to be easy.
this means all the log settings are in one place. it should allow
things to be over-ridden externally to the library
but still allow command line --args to pass debugging settings
## I also have a generic sleep() and exit() in here because it's simple
Usage:
log("something", foo, bar)
var DEBUG bool = true
log(DEBUG, "something else", someOtherVariable) # if DEBUG == false, return doing nothing
log(SPEW, "something else", someOtherVariable) # this get's sent to spew.Dump(). Very useful for debugging!
## Variables
```golang
var INFO bool
```
```golang
var LOGOFF bool = false // turn this off, all logging stops
```
```golang
var SPEW spewt
```
```golang
var WARN bool
``` ```
## Functions ## Functions
### func [DebugTab](/example_window_debug.go#L26) ### func [DebugWindow](/debug_window.go#L9)
`func DebugTab()`
this function is used by the examples to add a tab
dynamically to the bugWin node
TODO: make this smarter once this uses toolkit/
### func [DebugWindow](/example_window_debug.go#L14)
`func DebugWindow()` `func DebugWindow()`
Creates a window helpful for debugging this package Creates a window helpful for debugging this package
### func [DemoWindow](/example_window_demo.go#L10) ### func [GetDebug](/debug.go#L20)
`func DemoWindow()`
This creates a window that shows how this package works
### func [GetDebug](/structs.go#L23)
`func GetDebug() bool` `func GetDebug() bool`
### func [GetDebugToolkit](/structs.go#L34) ### func [GolangDebugWindow](/example_window_golang_debug.go#L10)
`func GetDebugToolkit() bool`
### func [GolangDebugWindow](/example_window_golang_debug.go#L12)
`func GolangDebugWindow()` `func GolangDebugWindow()`
### func [IndentPrintln](/structs.go#L159) ### func [Indent](/debug.go#L120)
`func IndentPrintln(a ...interface{})` `func Indent(a ...interface{})`
### func [Init](/main.go#L41) ### func [InitPlugins](/main.go#L35)
`func Init()` `func InitPlugins(names []string)`
### func [LoadToolkit](/plugin.go#L50) ### func [LoadToolkit](/plugin.go#L53)
`func LoadToolkit(name string) bool` `func LoadToolkit(name string) bool`
loads and initializes a toolkit (andlabs/ui, gocui, etc) loads and initializes a toolkit (andlabs/ui, gocui, etc)
### func [Main](/main.go#L86) ### func [Main](/main.go#L76)
`func Main(f func())` `func Main(f func())`
This should not pass a function This should not pass a function
### func [Queue](/main.go#L115) ### func [Queue](/main.go#L106)
`func Queue(f func())` `func Queue(f func())`
@ -171,31 +190,39 @@ other goroutines. This is due to the nature of how
Linux, MacOS and Windows work (they all work differently. suprise. surprise.) Linux, MacOS and Windows work (they all work differently. suprise. surprise.)
For example: gui.Queue(NewWindow()) For example: gui.Queue(NewWindow())
### func [SetDebug](/structs.go#L27) ### func [SetDebug](/debug.go#L24)
`func SetDebug(s bool)` `func SetDebug(s bool)`
### func [SetDebugToolkit](/structs.go#L38) ### func [SetDebugChange](/debug.go#L52)
`func SetDebugChange(s bool)`
This passes the debugChange flag to the toolkit plugin
### func [SetDebugToolkit](/debug.go#L37)
`func SetDebugToolkit(s bool)` `func SetDebugToolkit(s bool)`
### func [ShowDebugValues](/structs.go#L42) This passes the debugToolkit flag to the toolkit plugin
### func [ShowDebugValues](/debug.go#L66)
`func ShowDebugValues()` `func ShowDebugValues()`
### func [StandardClose](/main.go#L128) ### func [StandardClose](/main.go#L119)
`func StandardClose(n *Node)` `func StandardClose(n *Node)`
The window is destroyed but the application does not quit The window is destroyed but the application does not quit
### func [StandardExit](/main.go#L135) ### func [StandardExit](/main.go#L125)
`func StandardExit(n *Node)` `func StandardExit(n *Node)`
The window is destroyed but the application does not quit The window is destroyed but the application does not quit
### func [Watchdog](/watchdog.go#L16) ### func [Watchdog](/watchdog.go#L15)
`func Watchdog()` `func Watchdog()`
@ -206,7 +233,13 @@ This goroutine can be used like a watchdog timer
## Types ## Types
### type [GuiConfig](/structs.go#L65) ### type [GuiArgs](/structs.go#L25)
`type GuiArgs struct { ... }`
This struct can be used with the go-arg package
### type [GuiConfig](/structs.go#L30)
`type GuiConfig struct { ... }` `type GuiConfig struct { ... }`
@ -216,23 +249,14 @@ This goroutine can be used like a watchdog timer
var Config GuiConfig var Config GuiConfig
``` ```
### type [GuiDebug](/structs.go#L53) ### type [Node](/structs.go#L48)
`type GuiDebug struct { ... }`
This struct can be used with go-arg
### type [Node](/structs.go#L84)
`type Node struct { ... }` `type Node struct { ... }`
The Node is simply the name and the size of whatever GUI element exists 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 [NewStandardWindow](/example_window_demo.go#L22) #### func [NewWindow](/window.go#L14)
`func NewStandardWindow(title string) *Node`
#### func [NewWindow](/window.go#L15)
`func NewWindow() *Node` `func NewWindow() *Node`
@ -280,7 +304,7 @@ func main() {
You get a window You get a window
``` ```
### type [Symbol](/plugin.go#L17) ### type [Symbol](/plugin.go#L16)
`type Symbol any` `type Symbol any`

View File

@ -87,12 +87,14 @@ hopefully also things like libSDL, faiface/pixel, slint
## References ## References
Useful links and other Useful links and other
external things external things which might be useful
which might be useful
* [Wikipedia Graphical widget](https://en.wikipedia.org/wiki/Graphical_widget) * [Wikipedia Graphical widget](https://en.wikipedia.org/wiki/Graphical_widget)
* [Github mirror](https://github.com/witorg/gui) * [GO Style Guide](https://google.github.io/styleguide/go/index) Code this way
* [Federated git pull](https://github.com/forgefed/forgefed) * [MS Windows Application Library Kit](https://github.com/lxn/walk)
* [Federated git pull](https://github.com/forgefed/forgefed) Hopefully this will work for me with gitea
* [Github mirror](https://github.com/wit-go/gui) This repo on mirror. Hopefully I won't have to use this.
* [WIT GO projects](https://go.wit.org/) Attempt to model go.uber.org
## Functions ## Functions

View File

@ -7,12 +7,10 @@
package gui package gui
import ( import (
"log"
"git.wit.org/wit/gui/toolkit/andlabs-direct" "git.wit.org/wit/gui/toolkit/andlabs-direct"
) )
func trythis() { func trythis() {
log.Println("not sure what to try") log(debugGui, "not sure what to try")
toolkit.DebugToolkit = true toolkit.DebugToolkit = true
} }

View File

@ -1,23 +1,21 @@
package gui package gui
import "log"
func (n *Node) NewButton(name string, custom func()) *Node { func (n *Node) NewButton(name string, custom func()) *Node {
newNode := n.New(name) newNode := n.New(name, "Button")
newNode.Widget.Custom = func() { newNode.Widget.Custom = func() {
log.Println("even newer clicker() name", newNode.Widget) log(debugGui, "even newer clicker() name", newNode.Widget)
if (custom != nil) { if (custom != nil) {
custom() custom()
} else { } else {
log.Println("wit/gui No callback function is defined for button name =", name) log(debugGui, "wit/gui No callback function is defined for button name =", name)
} }
} }
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.NewButton() aplug =", aplug.name, "name =", newNode.Widget.Name) log(debugGui, "gui.NewButton() aplug =", aplug.name, "name =", newNode.Widget.Name)
if (aplug.NewButton == nil) { if (aplug.NewButton == nil) {
log.Println("\tgui.NewButton() aplug.NewButton = nil", aplug.name) log(debugGui, "\tgui.NewButton() aplug.NewButton = nil", aplug.name)
continue continue
} }
aplug.NewButton(&n.Widget, &newNode.Widget) aplug.NewButton(&n.Widget, &newNode.Widget)

View File

@ -1,7 +1,5 @@
package gui package gui
import "log"
func (n *Node) Checked() bool { func (n *Node) Checked() bool {
n.Dump() n.Dump()
return n.checked return n.checked
@ -25,22 +23,29 @@ This was the old code
func (n *Node) NewCheckbox(name string) *Node { func (n *Node) NewCheckbox(name string) *Node {
newNode := n.New(name) newNode := n.New(name, "Checkbox")
newNode.custom = n.custom newNode.custom = n.custom
newNode.Widget.Custom = func() { newNode.Widget.Custom = func() {
log.Println("even newer clicker() name", newNode.Widget) log(debugChange, "wit go gui checkbox", newNode.Widget)
if (n.custom != nil) { if (n.custom != nil) {
log(debugChange, "trying parent.custom() callback() name =", name)
n.custom() n.custom()
} else { } else {
log.Println("wit/gui No callback function is defined for button name =", name) 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 { for _, aplug := range allPlugins {
log.Println("gui.NewCheckbox() aplug =", aplug.name, "name =", newNode.Widget.Name) log(debugGui, "gui.NewCheckbox() aplug =", aplug.name, "name =", newNode.Widget.Name)
if (aplug.NewCheckbox == nil) { if (aplug.NewCheckbox == nil) {
log.Println("\tgui.NewCheckbox() aplug.NewCheckbox = nil", aplug.name) log(debugGui, "\tgui.NewCheckbox() aplug.NewCheckbox = nil", aplug.name)
continue continue
} }
aplug.NewCheckbox(&n.Widget, &newNode.Widget) aplug.NewCheckbox(&n.Widget, &newNode.Widget)

View File

@ -21,7 +21,7 @@ func main() {
// gui.LoadToolkit("default") // gui.LoadToolkit("default")
// panic("WTF gocui not happening") // panic("WTF gocui not happening")
// gui.LoadToolkit("gocui") // gui.LoadToolkit("gocui")
gui.Init() // gui.Init()
// buttonWindow() // buttonWindow()
go gui.Main(func () { go gui.Main(func () {
@ -57,6 +57,10 @@ func buttonWindow() {
w = gui.NewWindow() w = gui.NewWindow()
g = w.NewGroup("buttonGroup") g = w.NewGroup("buttonGroup")
g.NewButton("hello", func () {
log.Println("world")
})
g.NewButton("NewButton()", func () { g.NewButton("NewButton()", func () {
log.Println("new foobar 2. Adding button 'foobar 3'") log.Println("new foobar 2. Adding button 'foobar 3'")
name := "foobar " + strconv.Itoa(counter) name := "foobar " + strconv.Itoa(counter)
@ -73,8 +77,12 @@ func buttonWindow() {
g.NewGroup(name) g.NewGroup(name)
}) })
g.NewButton("hello", func () { g.NewButton("gui.DebugWindow()", func () {
log.Println("world") gui.DebugWindow()
})
g.NewButton("gui.GolangDebugWindow()", func () {
gui.GolangDebugWindow()
}) })
g.NewButton("LoadToolkit(andlabs)", func () { g.NewButton("LoadToolkit(andlabs)", func () {
@ -86,7 +94,8 @@ func buttonWindow() {
}) })
g.NewButton("Init()", func () { g.NewButton("Init()", func () {
gui.Init() log.Println("gui.Init() is deprecated(?)")
//gui.Init()
}) })
g.NewButton("Main()", func () { g.NewButton("Main()", func () {

View File

@ -17,7 +17,7 @@ import (
func main() { func main() {
log.Println("Starting my Control Panel") log.Println("Starting my Control Panel")
gui.Init() // gui.Init()
// go gui.Main(helloworld) // go gui.Main(helloworld)
go gui.Main(gui.DebugWindow) go gui.Main(gui.DebugWindow)
// go gui.DemoToolkitWindow() // go gui.DemoToolkitWindow()

View File

@ -7,7 +7,7 @@ import (
) )
func main() { func main() {
gui.Init() // gui.Init()
gui.Main(helloworld) gui.Main(helloworld)
} }

View File

@ -1,5 +1,5 @@
run: build run: build
./textbox --guidebug ./textbox --gui-debug
build-release: build-release:
go get -v -u -x . go get -v -u -x .

View File

@ -4,7 +4,6 @@ package main
import ( import (
"os" "os"
"log" "log"
"fmt"
"git.wit.org/wit/gui" "git.wit.org/wit/gui"
arg "github.com/alexflint/go-arg" arg "github.com/alexflint/go-arg"
) )
@ -12,30 +11,20 @@ import (
type LogOptions struct { type LogOptions struct {
LogFile string LogFile string
Verbose bool Verbose bool
GuiDebug bool `help:"open up the wit/gui Debugging Window"` // GuiDebug bool `help:"open up the wit/gui Debugging Window"`
GuiDemo bool `help:"open the wit/gui Demo Window"` // GuiDemo bool `help:"open the wit/gui Demo Window"`
User string `arg:"env:USER"` User string `arg:"env:USER"`
} }
var args struct { var args struct {
Foo string
Bar bool
LogOptions LogOptions
gui.GuiDebug gui.GuiArgs
} }
func main() { func main() {
arg.MustParse(&args) arg.MustParse(&args)
fmt.Println(args.Foo, args.Bar, args.User) // fmt.Println(args.Foo, args.Bar, args.User)
log.Println("Toolkit = ", args.Toolkit)
gui.Config.Debug.Debug = args.Debug
/*
gui.Config.Debug.Change = args.DebugChange
gui.Config.Debug.Dump = args.DebugDump
gui.Config.Debug.Node = args.DebugNode
gui.Config.Debug.Tabs = args.DebugTabs
*/
/* /*
f, err := os.OpenFile("/tmp/guilogfile", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666) f, err := os.OpenFile("/tmp/guilogfile", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
@ -48,14 +37,14 @@ func main() {
log.Println("This is a test log entry") log.Println("This is a test log entry")
*/ */
gui.Init() // gui.InitPlugins([]string{"andlabs"})
gui.Main(initGUI) gui.Main(initGUI)
} }
// This initializes the first window // This initializes the first window
func initGUI() { func initGUI() {
var w *gui.Node var w *gui.Node
gui.Config.Title = "Hello World golang wit/gui Window" gui.Config.Title = "Hello World"
gui.Config.Width = 640 gui.Config.Width = 640
gui.Config.Height = 480 gui.Config.Height = 480
gui.Config.Exit = myDefaultExit gui.Config.Exit = myDefaultExit
@ -65,16 +54,9 @@ func initGUI() {
addDemoTab(w, "A Simple Tab Demo") addDemoTab(w, "A Simple Tab Demo")
addDemoTab(w, "A Second Tab") addDemoTab(w, "A Second Tab")
/*
TODO: add these back
if (args.GuiDemo) {
gui.DemoToolkitWindow()
}
if (args.GuiDebug) { if (args.GuiDebug) {
gui.DebugWindow() gui.DebugWindow()
} }
*/
} }
func addDemoTab(window *gui.Node, title string) { func addDemoTab(window *gui.Node, title string) {

View File

@ -1,21 +1,17 @@
package gui package gui
import "log"
// import "errors" // import "errors"
import "regexp" import "regexp"
// functions for handling text related GUI elements // functions for handling text related GUI elements
func (n *Node) SetText(str string) bool { func (n *Node) SetText(str string) bool {
if (Config.Debug.Change) { log(debugChange, "gui.SetText() value = FIXME. NOT DOING ANYTHING", str)
log.Println("gui.SetText() value =", str)
}
return true return true
} }
func (n *Node) GetText() string { func (n *Node) GetText() string {
return "not implemented" return "TODO: GetText() = {}"
} }
/* /*
@ -24,7 +20,7 @@ isAlpha := regexp.MustCompile(`^[A-Za-z]+$`).MatchString
for _, username := range []string{"userone", "user2", "user-three"} { for _, username := range []string{"userone", "user2", "user-three"} {
if !isAlpha(username) { if !isAlpha(username) {
log.Printf("%q is not valid\n", username) log(debugGui, "%q is not valid\n", username)
} }
} }
@ -44,35 +40,27 @@ func normalizeInt(s string) string {
// reg, err := regexp.Compile("[^a-zA-Z0-9]+") // reg, err := regexp.Compile("[^a-zA-Z0-9]+")
reg, err := regexp.Compile("[^0-9]+") reg, err := regexp.Compile("[^0-9]+")
if err != nil { if err != nil {
log.Println("normalizeInt() regexp.Compile() ERROR =", err) log(debugGui, "normalizeInt() regexp.Compile() ERROR =", err)
return s return s
} }
clean := reg.ReplaceAllString(s, "") clean := reg.ReplaceAllString(s, "")
log.Println("normalizeInt() s =", clean) log(debugGui, "normalizeInt() s =", clean)
return clean return clean
} }
func commonCallback(n *Node) { func commonCallback(n *Node) {
// TODO: make all of this common code to all the widgets // TODO: make all of this common code to all the widgets
if (n.OnChanged == nil) { if (n.OnChanged == nil) {
if (Config.Debug.Change) { log(debugChange, "Not Running n.OnChanged(n) == nil")
log.Println("Not Running n.OnChanged(n) == nil")
}
} else { } else {
if (Config.Debug.Change) { log(debugChange, "Running n.OnChanged(n)")
log.Println("Running n.OnChanged(n)")
}
n.OnChanged(n) n.OnChanged(n)
} }
if (n.custom == nil) { if (n.custom == nil) {
if (Config.Debug.Change) { log(debugChange, "Not Running n.custom(n) == nil")
log.Println("Not Running n.custom(n) == nil")
}
} else { } else {
if (Config.Debug.Change) { log(debugChange, "Running n.custom()")
log.Println("Running n.custom()")
}
n.custom() n.custom()
} }
} }

49
debian/Makefile vendored Normal file
View File

@ -0,0 +1,49 @@
# GITVERSION=$(shell git rev-parse FETCH_HEAD)
VERSION=$(shell git describe --tags $(git rev-list --tags --max-count=1) | sed 's/^v//')
BASENAME=go-wit-gui
all: help deb
help:
@echo
@echo "make deb # attempt to build the .deb package using dpkg"
@echo
deb: clean extract DEBIAN build
clean:
rm -rf ../files
rm -f ../*.deb
rm -f ../*.tar.xz data.tar.xz
rm -rf DEBIAN
extract:
mkdir -p ../files/usr/lib/go-gui
cp ../toolkit/*.so ../files/usr/lib/go-gui/
cp ../README.md ../files/usr/lib/go-gui/
cp ../cmds/textbox/textbox ../files/usr/lib/go-gui/textbox-demo
# makes the DEBIAN/ directory
DEBIAN:
mkdir -p DEBIAN
# make the md5sum file
cd ../files/ && find -type f -exec md5sum '{}' \; |sort -k2 >../md5sums
mv ../md5sums DEBIAN/
# make the control there
mkdir -p DEBIAN
cp control DEBIAN/
echo Version: ${VERSION} >>DEBIAN/control
cp postinst DEBIAN
build:
mv DEBIAN ../files/
cd .. && dpkg-deb --build files ${BASENAME}_${VERSION}_amd64.deb
@echo
@echo '#######################'
cd .. && dpkg-deb --info ${BASENAME}_${VERSION}_amd64.deb
@echo '#######################'
@echo

1
debian/compat vendored Normal file
View File

@ -0,0 +1 @@
10

9
debian/control vendored Normal file
View File

@ -0,0 +1,9 @@
Source: go-wit-gui
Build-Depends: golang
Package: go-wit-gui
Maintainer: Jeff Carr <jcarr@wit.com>
Architecture: amd64
Depends:
Recommends: libgtk-3-0
Description: a abstraction layer for Go visual elements (GTK, QT, etc)
Package gui implements a abstraction layer for Go visual elements.

1
debian/postinst vendored Executable file
View File

@ -0,0 +1 @@
#!/bin/sh

184
debug.go Normal file
View File

@ -0,0 +1,184 @@
package gui
// Lots of debugging things:
// A function dump out the binary tree
import (
// "fmt"
"reflect"
)
// various debugging flags
var debugGui bool = false
var debugDump bool = false
var debugNode bool = false
var debugTabs bool = false
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 SetDebug (s bool) {
debugGui = s
// debugDump = s
// debugNode = s
}
/*
func GetDebugToolkit () bool {
return debugToolkit
}
*/
// This passes the debugToolkit flag to the toolkit plugin
func SetDebugToolkit (s bool) {
debugToolkit = s
for _, aplug := range allPlugins {
log(debugPlugin, "gui.SetDebugToolkit() aplug =", aplug.name)
if (aplug.SetDebugToolkit == nil) {
log(debugPlugin, "\tgui.SetDebugToolkit() = nil", aplug.name)
continue
}
aplug.SetDebugToolkit(s)
return
}
log(debugPlugin, "\tgui.SetDebugToolkit() = nil in all plugins")
}
// This passes the debugChange flag to the toolkit plugin
func SetDebugChange (s bool) {
// debugToolkit = s
for _, aplug := range allPlugins {
log(debugPlugin, "gui.SetDebugChange() aplug =", aplug.name)
if (aplug.SetDebugChange == nil) {
log(debugPlugin, "\tgui.SetDebugChange() = nil", aplug.name)
continue
}
aplug.SetDebugChange(s)
return
}
log(debugPlugin, "\tgui.SetDebugChange() = nil in all plugins")
}
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)
log(true, "DebugToolkit =", debugToolkit)
// dump out the debugging flags for the plugins
for _, aplug := range allPlugins {
log(debugPlugin, "gui.ShowDebug() aplug =", aplug.name)
if (aplug.ShowDebug == nil) {
log(debugPlugin, "\tgui.ShowDebug() = nil", aplug.name)
continue
}
aplug.ShowDebug()
return
}
}
func (n *Node) Dump() {
if ! debugDump {
return
}
Indent("NODE DUMP START")
Indent("id = ", n.id)
Indent("Name = ", n.Name)
Indent("Width = ", n.Width)
Indent("Height = ", n.Height)
if (n.parent == nil) {
Indent("parent = nil")
} else {
Indent("parent.id =", n.parent.id)
}
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)
}
Indent("text = ", reflect.ValueOf(n.text).Kind(), n.text)
Indent("NODE DUMP END")
}
var listChildrenParent *Node
var listChildrenDepth int = 0
var defaultPadding = " "
func Indent(a ...interface{}) {
logindent(listChildrenDepth, defaultPadding, a...)
}
func (n *Node) dumpWidget() {
var info string
if (n.Widget.Type == "") {
n.Widget.Type = "UNDEF"
}
info = n.Widget.Type
info += ", " + n.Widget.Name
if (n.Name != n.Widget.Name) {
info += " NAME MISMATCH"
}
logindent(listChildrenDepth, defaultPadding, n.id, info)
}
func (n *Node) ListChildren(dump bool) {
n.dumpWidget()
if (dump == true) {
n.Dump()
}
if len(n.children) == 0 {
if (n.parent == nil) {
} else {
log(debugNode, "\t\t\tparent =",n.parent.id)
if (listChildrenParent != nil) {
log(debugNode, "\t\t\tlistChildrenParent =",listChildrenParent.id)
if (listChildrenParent.id != n.parent.id) {
// log("parent.child does not match child.parent")
exit("parent.child does not match child.parent")
}
}
}
log(debugNode, "\t\t", n.id, "has no children")
return
}
for _, child := range n.children {
if (child.parent != nil) {
log(debugNode, "\t\t\tparent =",child.parent.id)
} else {
log(debugGui, "\t\t\tno parent")
// memory corruption? non-threadsafe access?
// can all binary tree changes to Node.parent & Node.child be forced into a singular goroutine?
panic("something is wrong with the wit golang gui logic and the binary tree is broken. child has no parent")
}
if (dump == true) {
child.Dump()
}
if (child.children == nil) {
log(debugNode, "\t\t", child.id, "has no children")
} else {
log(debugNode, "\t\t\tHas children:", child.children)
}
listChildrenParent = n
listChildrenDepth += 1
child.ListChildren(dump)
listChildrenDepth -= 1
}
return
}

194
debug_window.go Normal file
View File

@ -0,0 +1,194 @@
package gui
var bugWin *Node
var mapWindows map[string]*Node
/*
Creates a window helpful for debugging this package
*/
func DebugWindow() {
Config.Title = "go.wit.org/gui debug window"
Config.Width = 300
Config.Height = 200
Config.Exit = StandardClose
bugWin = NewWindow()
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()
})
}
func (n *Node) DebugTab(title string) *Node {
var newN, gog, g1, g2, g3, dd *Node
// time.Sleep(1 * time.Second)
newN = n.NewTab(title)
newN.Dump()
//////////////////////// main debug things //////////////////////////////////
gog = newN.NewGroup("GOLANG")
gog.NewLabel("go language")
gog.NewButton("GO Language Debug", func () {
GolangDebugWindow()
})
gog.NewLabel("wit/gui package")
gog.NewButton("Demo toolkit andlabs/ui", func () {
// DemoToolkitWindow()
})
debugFlags(newN)
//////////////////////// window debugging things //////////////////////////////////
g1 = newN.NewGroup("Current Windows")
dd = g1.NewDropdown("Window Dropdown")
log(debugGui, "dd =", dd)
// initialize the windows map if it hasn't been
if (mapWindows == nil) {
mapWindows = make(map[string]*Node)
}
var dump = false
for _, child := range Config.master.children {
log(debugGui, "\t\t", child.id, child.Width, child.Height, child.Name)
if (child.parent != nil) {
log(debugGui, "\t\t\tparent =",child.parent.id)
} else {
log(debugGui, "\t\t\tno parent")
panic("no parent")
}
if (dump == true) {
child.Dump()
}
dd.AddDropdownName(child.Name)
mapWindows[child.Name] = child
}
dd.SetDropdown(0)
g2 = newN.NewGroup("Debug Window")
g2.NewButton("SetMargined(tab)", func () {
log(debugChange, "START SetMargined(tab)", g2.Name)
// name := dd.GetText()
name := dd.Widget.S
log(debugChange, "name =", name)
log(debugChange, "mapWindows[name] =", mapWindows[name])
/*
for s, n := range mapWindows {
log(debugChange, "\tname =", name)
log(debugChange, "\tmapWindows s =", s)
log(debugChange, "\tmapWindows[s] =", n)
}
*/
bugWin = mapWindows[name]
log(debugChange, "END dd.Widget.S =", dd.Widget.S)
// gw.UiTab.SetMargined(*gw.TabNumber, true)
})
g2.NewButton("Hide(tab)", func () {
log(debugChange, "\tclick() START", g2.Name)
// gw.UiTab.Hide()
})
g2.NewButton("Show(tab)", func () {
// gw.UiTab.Show()
})
g2.NewButton("Delete(tab)", func () {
// gw.UiTab.Delete(*gw.TabNumber)
})
g2.NewButton("change Title", func () {
// mainWindow.SetText("hello world")
})
/////////////////////////////////////////////////////
g3 = newN.NewGroup("Node Debug")
g3.NewButton("Node.Dump()", func () {
debugGui = true
debugDump = true
bugWin.Dump()
})
g3.NewButton("Node.ListChildren(false)", func () {
debugGui = true
debugDump = true
bugWin.ListChildren(false)
})
g3.NewButton("Node.ListChildren(true)", func () {
debugGui = true
debugDump = true
bugWin.ListChildren(true)
})
return newN
}

5
doc.go
View File

@ -84,16 +84,17 @@ Bugs
References References
Useful links and other Useful links and other
external things external things which might be useful
which might be useful
[Wikipedia Graphical widget]: https://en.wikipedia.org/wiki/Graphical_widget [Wikipedia Graphical widget]: https://en.wikipedia.org/wiki/Graphical_widget
[Github mirror]: https://github.com/witorg/gui [Github mirror]: https://github.com/witorg/gui
[Federated git pull]: https://github.com/forgefed/forgefed [Federated git pull]: https://github.com/forgefed/forgefed
[GO Style Guide]: https://google.github.io/styleguide/go/index
* [Wikipedia Graphical widget] * [Wikipedia Graphical widget]
* [Github mirror] * [Github mirror]
* [Federated git pull] * [Federated git pull]
* [GO Style Guide]
*/ */

View File

@ -1,31 +1,53 @@
package gui package gui
import "log"
func (n *Node) AddDropdownName(name string) { func (n *Node) AddDropdownName(name string) {
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.AddDropdownName() aplug =", aplug.name, "name =", name) log(debugGui, "gui.AddDropdownName() aplug =", aplug.name, "name =", name)
if (aplug.AddDropdownName == nil) { if (aplug.AddDropdownName == nil) {
log.Println("\tgui.AddDropdownName() aplug.NewDropdown = nil", aplug.name) log(debugGui, "\tgui.AddDropdownName() aplug.NewDropdown = nil", aplug.name)
continue continue
} }
aplug.AddDropdownName(&n.Widget, name) 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)
})
}
// 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(i int) { func (n *Node) SetDropdown(s any) {
log(debugGui, "gui.SetDropdown() TODO: make this work. s =", s)
} }
func (n *Node) NewDropdown(text string) *Node { func (n *Node) SetDropdownChange(f func()) {
newNode := n.New(text) n.Widget.Custom = f
}
func (n *Node) NewDropdown(name string) *Node {
newNode := n.New(name, "Dropdown")
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.NewDropdown() aplug =", aplug.name, "name =", newNode.Widget.Name) log(debugGui, "gui.NewDropdown() aplug =", aplug.name, "name =", newNode.Widget.Name)
if (aplug.NewDropdown == nil) { if (aplug.NewDropdown == nil) {
log.Println("\tgui.NewDropdown() aplug.NewDropdown = nil", aplug.name) log(debugGui, "\tgui.NewDropdown() aplug.NewDropdown = nil", aplug.name)
continue 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 return newNode
} }

View File

@ -1,163 +0,0 @@
package gui
import (
"log"
)
var names = make([]string, 100)
var nodeNames = make([]string, 100)
var bugWin *Node
/*
Creates a window helpful for debugging this package
*/
func DebugWindow() {
Config.Title = "git.wit.org/wit/gui debug fixme"
Config.Width = 300
Config.Height = 200
Config.Exit = StandardClose
bugWin = NewWindow()
bugWin.DebugTab("WIT GUI Debug Tab")
}
// this function is used by the examples to add a tab
// dynamically to the bugWin node
// TODO: make this smarter once this uses toolkit/
func DebugTab() {
if (bugWin == nil) {
log.Println("Not sure what window to add this to? Use node.DebugTab() instead")
return;
}
bugWin.DebugTab("does this work?")
}
var checkd, checkdn, checkdt, checkdtk *Node
//////////////////////// debug flags //////////////////////////////////
func debugFlags(n *Node) {
var df, checkd, checkdn, checkdd, changeCheckbox *Node
df = n.NewGroup("Debug Flags")
df.NewLabel("flags to control debugging output")
checkd = df.NewCheckbox("Debug")
checkd.OnChanged = func(*Node) {
// checkd.checked = checkd.toolkit.Checked()
Config.Debug.Debug = true
if (Config.Debug.Debug) {
log.Println("Debug turned on")
} else {
log.Println("Debug turned off")
}
}
checkdn = df.NewCheckbox("Debug Node")
checkdn.OnChanged = func(*Node) {
Config.Debug.Node = true
}
checkdd = df.NewCheckbox("Debug node.Dump()")
checkdd.OnChanged = func(*Node) {
Config.Debug.Dump = true
}
changeCheckbox = df.NewCheckbox("Debug Change")
changeCheckbox.OnChanged = func(*Node) {
Config.Debug.Change = true
}
df.NewButton("Dump Debug Flags", func () {
ShowDebugValues()
})
}
func (n *Node) DebugTab(title string) *Node {
var newN, gog, g1, g2, g3, dd *Node
// time.Sleep(1 * time.Second)
newN = n.NewTab(title)
newN.Dump()
//////////////////////// main debug things //////////////////////////////////
gog = newN.NewGroup("GOLANG")
gog.NewLabel("go language")
gog.NewButton("GO Language Debug", func () {
// GolangDebugWindow()
})
gog.NewLabel("wit/gui package")
gog.NewButton("WIT/GUI Package Debug", func () {
Config.Width = 640
Config.Height = 480
// Queue(DebugWindow)
})
gog.NewButton("Demo wit/gui", func () {
// DemoWindow()
})
gog.NewButton("Demo toolkit andlabs/ui", func () {
// DemoToolkitWindow()
})
debugFlags(newN)
//////////////////////// window debugging things //////////////////////////////////
g1 = newN.NewGroup("Current Windows")
dd = g1.NewDropdown("Window Dropdown")
log.Println("dd =", dd)
var dump = false
for _, child := range Config.master.children {
log.Println("\t\t", child.id, child.Width, child.Height, child.Name)
if (child.parent != nil) {
log.Println("\t\t\tparent =",child.parent.id)
} else {
log.Println("\t\t\tno parent")
panic("no parent")
}
if (dump == true) {
child.Dump()
}
dd.AddDropdownName(child.Name)
}
dd.SetDropdown(0)
g2 = newN.NewGroup("Debug Window")
g2.NewButton("SetMargined(tab)", func () {
log.Println("\tSTART")
name := dd.GetText()
log.Println("\tENDed with", name)
// gw.UiTab.SetMargined(*gw.TabNumber, true)
})
g2.NewButton("Hide(tab)", func () {
// gw.UiTab.Hide()
})
g2.NewButton("Show(tab)", func () {
// gw.UiTab.Show()
})
g2.NewButton("Delete(tab)", func () {
// gw.UiTab.Delete(*gw.TabNumber)
})
g2.NewButton("change Title", func () {
// mainWindow.SetText("hello world")
})
/////////////////////////////////////////////////////
g3 = newN.NewGroup("Node Debug")
g3.NewButton("Node.Dump()", func () {
bugWin.Dump()
})
g3.NewButton("Node.ListChildren(false)", func () {
bugWin.ListChildren(false)
})
g3.NewButton("Node.ListChildren(true)", func () {
bugWin.ListChildren(true)
})
g3.NewButton("AddDebugTab()", func () {
if (bugWin != nil) {
bugWin.DebugTab("added this DebugTab")
}
})
return newN
}

View File

@ -1,30 +0,0 @@
package gui
import "log"
// import "time"
// import toolkit "git.wit.org/wit/gui/toolkit/andlabs"
//
// This creates a window that shows how this package works
//
func DemoWindow() {
var w, t1 *Node
log.Println("DemoWindow() START")
w = NewStandardWindow("Demo of WIT/GUI")
t1 = w.DebugTab("WIT GUI Debug Tab t1")
t1.DebugTab("WIT GUI Debug Tab t2")
log.Println("DemoWindow() END")
}
func NewStandardWindow(title string) *Node {
log.Println("NewStandardWindow() creating", title)
Config.Title = title
Config.Width = 640
Config.Height = 480
Config.Exit = StandardClose
return NewWindow()
}

View File

@ -1,7 +1,5 @@
package gui package gui
import "log"
import ( import (
"os" "os"
"runtime" "runtime"
@ -19,88 +17,88 @@ func GolangDebugWindow() {
w = NewWindow() w = NewWindow()
t = w.NewTab("Debug Tab") t = w.NewTab("Debug Tab")
log.Println("debugWindow() START") log("debugWindow() START")
/////////////////////////////// Column DEBUG GOLANG ////////////////////// /////////////////////////////// Column DEBUG GOLANG //////////////////////
g := t.NewGroup("GO Language") g := t.NewGroup("GO Language")
g.NewButton("runtime.Stack()", func () { g.NewButton("runtime.Stack()", func () {
log.Println("\tSTART") log("\tSTART")
buf := make([]byte, 1<<16) buf := make([]byte, 1<<16)
runtime.Stack(buf, true) runtime.Stack(buf, true)
log.Printf("%s", buf) log("\t %s", buf)
log.Println("\tEND") log("\tEND")
}) })
g.NewButton("dumpModuleInfo()", func () { g.NewButton("dumpModuleInfo()", func () {
log.Println("\tSTART") log("\tSTART")
dumpModuleInfo() dumpModuleInfo()
log.Println("\tEND") log("\tEND")
}) })
g.NewButton("debug.PrintStack()", func () { g.NewButton("debug.PrintStack()", func () {
log.Println("\tSTART") log("\tSTART")
debug.PrintStack() debug.PrintStack()
log.Println("\tEND") log("\tEND")
}) })
g.NewButton("pprof.Lookup(goroutine)", func () { g.NewButton("pprof.Lookup(goroutine)", func () {
log.Println("\tSTART") log("\tSTART")
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
log.Println("\tEND") log("\tEND")
}) })
g.NewButton("pprof.Lookup(heap)", func () { g.NewButton("pprof.Lookup(heap)", func () {
log.Println("\tSTART") log("\tSTART")
pprof.Lookup("heap").WriteTo(os.Stdout, 1) pprof.Lookup("heap").WriteTo(os.Stdout, 1)
log.Println("\tEND") log("\tEND")
}) })
g.NewButton("pprof.Lookup(block)", func () { g.NewButton("pprof.Lookup(block)", func () {
log.Println("\tSTART") log("\tSTART")
pprof.Lookup("block").WriteTo(os.Stdout, 1) pprof.Lookup("block").WriteTo(os.Stdout, 1)
log.Println("\tEND") log("\tEND")
}) })
g.NewButton("pprof.Lookup threadcreate", func () { g.NewButton("pprof.Lookup threadcreate", func () {
log.Println("\tSTART") log("\tSTART")
pprof.Lookup("threadcreate").WriteTo(os.Stdout, 1) pprof.Lookup("threadcreate").WriteTo(os.Stdout, 1)
log.Println("\tEND") log("\tEND")
}) })
g.NewButton("runtime.ReadMemStats", func () { g.NewButton("runtime.ReadMemStats", func () {
var s runtime.MemStats var s runtime.MemStats
runtime.ReadMemStats(&s) runtime.ReadMemStats(&s)
log.Printf("alloc: %v bytes\n", s.Alloc) log("alloc: %v bytes\n", s.Alloc)
log.Printf("total-alloc: %v bytes\n", s.TotalAlloc) log("total-alloc: %v bytes\n", s.TotalAlloc)
log.Printf("sys: %v bytes\n", s.Sys) log("sys: %v bytes\n", s.Sys)
log.Printf("lookups: %v\n", s.Lookups) log("lookups: %v\n", s.Lookups)
log.Printf("mallocs: %v\n", s.Mallocs) log("mallocs: %v\n", s.Mallocs)
log.Printf("frees: %v\n", s.Frees) log("frees: %v\n", s.Frees)
log.Printf("heap-alloc: %v bytes\n", s.HeapAlloc) log("heap-alloc: %v bytes\n", s.HeapAlloc)
log.Printf("heap-sys: %v bytes\n", s.HeapSys) log("heap-sys: %v bytes\n", s.HeapSys)
log.Printf("heap-idle: %v bytes\n", s.HeapIdle) log("heap-idle: %v bytes\n", s.HeapIdle)
log.Printf("heap-in-use: %v bytes\n", s.HeapInuse) log("heap-in-use: %v bytes\n", s.HeapInuse)
log.Printf("heap-released: %v bytes\n", s.HeapReleased) log("heap-released: %v bytes\n", s.HeapReleased)
log.Printf("heap-objects: %v\n", s.HeapObjects) log("heap-objects: %v\n", s.HeapObjects)
log.Printf("stack-in-use: %v bytes\n", s.StackInuse) log("stack-in-use: %v bytes\n", s.StackInuse)
log.Printf("stack-sys: %v bytes\n", s.StackSys) log("stack-sys: %v bytes\n", s.StackSys)
log.Printf("next-gc: when heap-alloc >= %v bytes\n", s.NextGC) log("next-gc: when heap-alloc >= %v bytes\n", s.NextGC)
log.Printf("last-gc: %v ns\n", s.LastGC) log("last-gc: %v ns\n", s.LastGC)
log.Printf("gc-pause: %v ns\n", s.PauseTotalNs) log("gc-pause: %v ns\n", s.PauseTotalNs)
log.Printf("num-gc: %v\n", s.NumGC) log("num-gc: %v\n", s.NumGC)
log.Printf("enable-gc: %v\n", s.EnableGC) log("enable-gc: %v\n", s.EnableGC)
log.Printf("debug-gc: %v\n", s.DebugGC) log("debug-gc: %v\n", s.DebugGC)
}) })
} }
func dumpModuleInfo() { func dumpModuleInfo() {
tmp, _ := debug.ReadBuildInfo() tmp, _ := debug.ReadBuildInfo()
if tmp == nil { if tmp == nil {
log.Println("This wasn't compiled with go module support") log("This wasn't compiled with go module support")
return return
} }
log.Println("mod.Path = ", tmp.Path) log("mod.Path = ", tmp.Path)
log.Println("mod.Main.Path = ", tmp.Main.Path) log("mod.Main.Path = ", tmp.Main.Path)
log.Println("mod.Main.Version = ", tmp.Main.Version) log("mod.Main.Version = ", tmp.Main.Version)
log.Println("mod.Main.Sum = ", tmp.Main.Sum) log("mod.Main.Sum = ", tmp.Main.Sum)
for _, value := range tmp.Deps { for _, value := range tmp.Deps {
log.Println("\tmod.Path = ", value.Path) log("\tmod.Path = ", value.Path)
log.Println("\tmod.Version = ", value.Version) log("\tmod.Version = ", value.Version)
} }
} }

View File

@ -1,21 +1,17 @@
package gui package gui
import "log"
// TODO: which name is better. AddGroup or NewGroup ? // TODO: which name is better. AddGroup or NewGroup ?
// first reaction is NewGroup // first reaction is NewGroup
func (n *Node) NewGroup(name string) *Node { func (n *Node) NewGroup(name string) *Node {
var newNode *Node var newNode *Node
newNode = n.New(name, "Group")
if (GetDebug()) { log(debugGui, "toolkit.NewGroup() START", name)
log.Println("toolkit.NewGroup() START", name)
}
newNode = n.New(name)
log.Println("gui.Node.NewGroup()", name) log(debugGui, "gui.Node.NewGroup()", name)
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.Node.NewGroup() toolkit plugin =", aplug.name) log(debugGui, "gui.Node.NewGroup() toolkit plugin =", aplug.name)
if (aplug.NewGroup == nil) { if (aplug.NewGroup == nil) {
continue continue
} }

14
int.go
View File

@ -1,8 +1,7 @@
package gui package gui
import "log" // import "github.com/davecgh/go-spew/spew"
import "github.com/davecgh/go-spew/spew"
/* /*
Get the int from the gui toolkit Get the int from the gui toolkit
@ -14,12 +13,10 @@ import "github.com/davecgh/go-spew/spew"
Is it "has to go" or "should go"? Probably it makes sense to strictly inforce it. No "callback" functions. IPC only (go channels) Is it "has to go" or "should go"? Probably it makes sense to strictly inforce it. No "callback" functions. IPC only (go channels)
*/ */
func (n *Node) Int() int { func (n *Node) Int() int {
if (Config.Debug.Toolkit) { log(debugToolkit, "gui.Node.Int() for node name =", n.Name)
log.Println("gui.Node.Int() for node name =", n.Name) log(debugToolkit, SPEW, n)
scs := spew.ConfigState{MaxDepth: 1}
scs.Dump(n)
}
// FIXME: this needs to be redone
// i := n.toolkit.Value() // i := n.toolkit.Value()
i := 3333 i := 3333
return i return i
@ -31,7 +28,8 @@ func (n *Node) Value() int {
} }
func (n *Node) SetValue(i int) { func (n *Node) SetValue(i int) {
log.Println("gui.SetValue() START") log(debugGui, "gui.SetValue() START")
n.Dump() n.Dump()
// FIXME: this needs to be redone
// n.toolkit.SetValue(i) // n.toolkit.SetValue(i)
} }

View File

@ -1,16 +1,15 @@
package gui package gui
import "log"
// import "errors" // import "errors"
// import "regexp" // import "regexp"
func (n *Node) NewLabel(text string) *Node { func (n *Node) NewLabel(text string) *Node {
newNode := n.New(text) newNode := n.New(text, "Label")
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.NewLabel() aplug =", aplug.name, "name =", newNode.Widget.Name) log(debugGui, "gui.NewLabel() aplug =", aplug.name, "name =", newNode.Widget.Name)
if (aplug.NewLabel == nil) { if (aplug.NewLabel == nil) {
log.Println("\tgui.NewLabel() aplug.NewLabel = nil", aplug.name) log(debugGui, "\tgui.NewLabel() aplug.NewLabel = nil", aplug.name)
continue continue
} }
aplug.NewLabel(&n.Widget, &newNode.Widget) aplug.NewLabel(&n.Widget, &newNode.Widget)

137
log.go Normal file
View File

@ -0,0 +1,137 @@
//
// version v1.3
//
// I like things to be easy.
//
// this means all the log settings are in one place. it should allow
// things to be over-ridden externally to the library
// but still allow command line --args to pass debugging settings
//
// I also have a generic sleep() and exit() in here because it's simple
//
// Usage:
//
// log("something", foo, bar)
// var DEBUG bool = true
// log(DEBUG, "something else", someOtherVariable) # if DEBUG == false, return doing nothing
// log(SPEW, "something else", someOtherVariable) # this get's sent to spew.Dump(). Very useful for debugging!
//
package gui
import (
"os"
"runtime"
"runtime/pprof"
golog "log"
"time"
"reflect"
"github.com/davecgh/go-spew/spew"
// "net"
)
var LOGOFF bool = false // turn this off, all logging stops
var WARN bool
var INFO bool
type spewt struct {
a bool
}
var SPEW spewt
/*
sleep() # you know what this does? sleeps for 1 second. yep. dump. easy.
sleep(.1) # you know what this does? yes, it sleeps for 1/10th of a second
*/
func sleep(a ...any) {
if (a == nil) {
time.Sleep(time.Second)
return
}
log("sleep", a[0])
switch a[0].(type) {
case int:
time.Sleep(time.Duration(a[0].(int)) * time.Second)
case float64:
time.Sleep(time.Duration(a[0].(float64) * 1000) * time.Millisecond)
default:
log("sleep a[0], type = ", a[0], reflect.TypeOf(a[0]))
}
}
/*
exit() # yep. exits. I guess everything must be fine
exit(3) # I guess 3 it is then
exit("dont like apples") # ok. I'll make a note of that
*/
func exit(a ...any) {
log("exit", a)
//if (a) {
// os.Exit(a)
//}
os.Exit(0)
}
/*
I've spent, am spending, too much time thinking about 'logging'. 'log', 'logrus', 'zap', whatever.
I'm not twitter. i don't give a fuck about how many nanoseconds it takes to log. Anyway, this
implementation is probably faster than all of those because you just set one bool to FALSE
and it all stops.
Sometimes I need to capture to stdout, sometimes stdout can't
work because it doesn't exist for the user. This whole thing is a PITA. Then it's spread
over 8 million references in every .go file. I'm tapping out and putting
it in one place. here it is. Also, this makes having debug levels really fucking easy.
You can define whatever level of logging you want from anywhere (command line) etc.
log() # doesn't do anything
log(stuff) # sends it to whatever log you define in a single place. here is the place
*/
func log(a ...any) {
if (LOGOFF) {
return
}
if (a == nil) {
return
}
var blah bool
if (reflect.TypeOf(a[0]) == reflect.TypeOf(blah)) {
// golog.Println("\t a[0] = bool")
if (a[0] == false) {
return
}
a[0] = "WIT/GUI"
}
if (reflect.TypeOf(a[0]) == reflect.TypeOf(SPEW)) {
a = a[1:]
spew.Dump(a)
return
}
golog.Println(a...)
}
func loggo() {
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
golog.Println("runtime.NumGoroutine() = ", runtime.NumGoroutine())
}
func logindent(depth int, format string, a ...any) {
var tabs string
for i := 0; i < depth; i++ {
tabs = tabs + format
}
// newFormat := tabs + strconv.Itoa(depth) + " " + format
newFormat := tabs + format
// array prepend(). Why isn't this a standard function. It should be:
// a.prepend(debugGui, newFormat)
a = append([]any{debugGui, newFormat}, a...)
log(a...)
}

107
main.go
View File

@ -1,8 +1,6 @@
package gui package gui
import ( import (
"log"
"os"
"embed" "embed"
) )
@ -18,83 +16,76 @@ const Yaxis = 1 // stack things vertically
var res embed.FS var res embed.FS
func init() { func init() {
log.Println("gui.init() has been run") debugGui = true
log(debugGui, "gui.init() has been run")
Config.counter = 0 Config.counter = 0
Config.prefix = "wit" Config.prefix = "wit"
// Config.Debug.Debug = true
// Config.Debug.Node = true
// Config.Debug.Tabs = true
title := "guiBinaryTree" title := "guiBinaryTree"
w := 640 w := 640
h := 480 h := 480
// Populates the top of the binary tree // Populates the top of the binary tree
Config.master = addNode(title, w, h) Config.master = addNode(title, w, h)
if (Config.Debug.Debug) { // Config.master.Dump()
Config.master.Dump() debugGui = false
}
} }
func Init() { func InitPlugins(names []string) {
var initBAD bool = true log(debugGui, "Starting gui.Init()")
if (Config.Debug.Debug) {
log.Println("Starting gui.Init()")
}
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.LoadToolkit() already loaded toolkit plugin =", aplug.name) log(debugGui, "gui.LoadToolkit() already loaded toolkit plugin =", aplug.name)
initBAD = false for _, name := range names {
if (name == aplug.name) {
return
}
}
}
// try to load each plugin in the order passed to this function
for _, name := range names {
if (LoadToolkit(name)) {
// aplug.InitOk = true
// aplug.Init()
return
}
} }
// the program didn't specify a plugin. Try to load one // the program didn't specify a plugin. Try to load one
// TODO: detect the OS & user preferences to load the best one // TODO: detect the OS & user preferences to load the best one
if (initBAD) { // TODO: commented out Init() on 02/26/2023 because I'm not sure how to run it correctly
if (LoadToolkit("andlabs")) { if (LoadToolkit("andlabs")) {
initBAD = false // aplug.InitOk = true
} // aplug.Init()
return
} }
// andlabs gui plugin failed. fall back to the terminal gui (should be compiled into the binary) if (LoadToolkit("gocui")) {
if (initBAD) { // aplug.InitOk = true
if (LoadToolkit("gocui")) { // aplug.Init()
initBAD = false return
}
} }
// locate the shared library file // Should die here? TODO: need a Node to call StandardExit
// panic("WTF Init()") // StandardExit("golang wit/gui could not load a plugin TODO: do something to STDOUT (?)")
for _, aplug := range allPlugins {
log.Println("gui.Node.Init() toolkit plugin =", aplug.name)
if (aplug.InitOk) {
log.Println("gui.Node.Init() Already Ran Init()", aplug.name)
continue
}
if (aplug.Init == nil) {
log.Println("gui.Node.Main() Init == nil", aplug.name)
continue
}
aplug.InitOk = true
aplug.Init()
}
// StandardExit(nil)
} }
// This should not pass a function // This should not pass a function
func Main(f func()) { func Main(f func()) {
if (Config.Debug.Debug) { log(debugGui, "Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
} InitPlugins([]string{"andlabs", "gocui"})
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.Node.NewButton() toolkit plugin =", aplug.name) log(debugGui, "gui.Node.NewButton() toolkit plugin =", aplug.name)
if (aplug.MainOk) { if (aplug.MainOk) {
log.Println("gui.Node.Main() Already Ran Main()", aplug.name) log(debugGui, "gui.Node.Main() Already Ran Main()", aplug.name)
continue continue
} }
if (aplug.Main == nil) { if (aplug.Main == nil) {
log.Println("gui.Node.Main() Main == nil", aplug.name) log(debugGui, "gui.Node.Main() Main == nil", aplug.name)
continue continue
} }
aplug.MainOk = true aplug.MainOk = true
@ -113,10 +104,10 @@ func Main(f func()) {
// Linux, MacOS and Windows work (they all work differently. suprise. surprise.) // Linux, MacOS and Windows work (they all work differently. suprise. surprise.)
// For example: gui.Queue(NewWindow()) // 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)") log(debugGui, "Sending function to gui.Main() (using gtk via andlabs/ui)")
// toolkit.Queue(f) // toolkit.Queue(f)
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.Node.NewButton() toolkit plugin =", aplug.name) log(debugGui, "gui.Node.NewButton() toolkit plugin =", aplug.name)
if (aplug.Queue == nil) { if (aplug.Queue == nil) {
continue continue
} }
@ -126,24 +117,20 @@ func Queue(f func()) {
// The window is destroyed but the application does not quit // The window is destroyed but the application does not quit
func StandardClose(n *Node) { func StandardClose(n *Node) {
if (Config.Debug.Debug) { log(debugGui, "wit/gui Standard Window Close. name =", n.Name)
log.Println("wit/gui Standard Window Close. name =", n.Name) log(debugGui, "wit/gui Standard Window Close. n.custom exit =", n.custom)
}
} }
// The window is destroyed but the application does not quit // The window is destroyed but the application does not quit
func StandardExit(n *Node) { func StandardExit(n *Node) {
if (Config.Debug.Debug) { log(debugGui, "wit/gui Standard Window Exit. running os.Exit()")
log.Println("wit/gui Standard Window Exit. running os.Exit()") log(debugGui, "gui.Node.StandardExit() attempt to exit each toolkit plugin")
}
log.Println("gui.Node.StandardExit() attempt to exit each toolkit plugin")
for i, aplug := range allPlugins { for i, aplug := range allPlugins {
log.Println("gui.Node.NewButton()", i, aplug) log(debugGui, "gui.Node.NewButton()", i, aplug)
if (aplug.Quit != nil) { if (aplug.Quit != nil) {
aplug.Quit() aplug.Quit()
} }
} }
os.Exit(0) exit("StandardExit")
} }

View File

@ -5,10 +5,11 @@ package gui
/* /*
generic function to create a new node on the binary tree generic function to create a new node on the binary tree
*/ */
func (n *Node) New(title string) *Node { func (n *Node) New(title string, t string) *Node {
var newN *Node var newN *Node
newN = addNode(title, n.Width, n.Height) newN = addNode(title, n.Width, n.Height)
newN.Widget.Type = t
n.Append(newN) n.Append(newN)
newN.parent = n newN.parent = n
@ -19,7 +20,7 @@ func (n *Node) New(title string) *Node {
raw create function for a new node struct raw create function for a new node struct
*/ */
func addNode(title string, width int, height int) *Node { func addNode(title string, width int, height int) *Node {
var n Node n := new(Node)
n.Name = title n.Name = title
n.Width = width n.Width = width
@ -36,5 +37,5 @@ func addNode(title string, width int, height int) *Node {
n.id = Config.counter n.id = Config.counter
Config.counter += 1 Config.counter += 1
return &n return n
} }

View File

@ -6,7 +6,6 @@ package gui
// It's a pleasure to be here with all of you // It's a pleasure to be here with all of you
import ( import (
"log"
"os" "os"
"plugin" "plugin"
@ -42,6 +41,10 @@ type aplug struct {
NewDropdown func(*toolkit.Widget, *toolkit.Widget) NewDropdown func(*toolkit.Widget, *toolkit.Widget)
AddDropdownName func(*toolkit.Widget, string) AddDropdownName func(*toolkit.Widget, string)
SetDebugToolkit func(bool)
SetDebugChange func(bool)
ShowDebug func()
} }
var allPlugins []*aplug var allPlugins []*aplug
@ -50,13 +53,13 @@ var allPlugins []*aplug
func LoadToolkit(name string) bool { func LoadToolkit(name string) bool {
var newPlug aplug var newPlug aplug
log.Println("gui.LoadToolkit() START") log(debugGui, "gui.LoadToolkit() START")
newPlug.LoadOk = false newPlug.LoadOk = false
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.LoadToolkit() already loaded toolkit plugin =", aplug.name) log(debugGui, "gui.LoadToolkit() already loaded toolkit plugin =", aplug.name)
if (aplug.name == name) { if (aplug.name == name) {
log.Println("gui.LoadToolkit() SKIPPING") log(debugGui, "gui.LoadToolkit() SKIPPING")
return true return true
} }
} }
@ -92,13 +95,20 @@ func LoadToolkit(name string) bool {
newPlug.NewDropdown = loadFunc2(&newPlug, "NewDropdown") newPlug.NewDropdown = loadFunc2(&newPlug, "NewDropdown")
newPlug.AddDropdownName = loadFuncS(&newPlug, "AddDropdownName") newPlug.AddDropdownName = loadFuncS(&newPlug, "AddDropdownName")
newPlug.SetDebugToolkit = loadFuncB(&newPlug, "SetDebugToolkit")
newPlug.SetDebugChange = loadFuncB(&newPlug, "SetDebugChange")
newPlug.ShowDebug = loadFuncE(&newPlug, "ShowDebug")
allPlugins = append(allPlugins, &newPlug) allPlugins = append(allPlugins, &newPlug)
log.Println("gui.LoadToolkit() END", newPlug.name, filename) log(debugGui, "gui.LoadToolkit() END", newPlug.name, filename)
newPlug.Init()
newPlug.LoadOk = true newPlug.LoadOk = true
return true return true
} }
// TODO: All these functions need to be done a smarter way
// but I haven't worked out the golang syntax to make it smarter
func loadFuncE(p *aplug, funcName string) func() { func loadFuncE(p *aplug, funcName string) func() {
var newfunc func() var newfunc func()
var ok bool var ok bool
@ -106,13 +116,13 @@ func loadFuncE(p *aplug, funcName string) func() {
test, err = p.plug.Lookup(funcName) test, err = p.plug.Lookup(funcName)
if err != nil { if err != nil {
log.Println("DID NOT FIND: name =", test, "err =", err) log(debugGui, "DID NOT FIND: name =", test, "err =", err)
return nil return nil
} }
newfunc, ok = test.(func()) newfunc, ok = test.(func())
if !ok { if !ok {
log.Println("function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name) log(debugGui, "function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name)
return nil return nil
} }
return newfunc return newfunc
@ -125,13 +135,13 @@ func loadFunc1(p *aplug, funcName string) func(*toolkit.Widget) {
test, err = p.plug.Lookup(funcName) test, err = p.plug.Lookup(funcName)
if err != nil { if err != nil {
log.Println("DID NOT FIND: name =", test, "err =", err) log(debugGui, "DID NOT FIND: name =", test, "err =", err)
return nil return nil
} }
newfunc, ok = test.(func(*toolkit.Widget)) newfunc, ok = test.(func(*toolkit.Widget))
if !ok { if !ok {
log.Println("function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name) log(debugGui, "function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name)
return nil return nil
} }
return newfunc return newfunc
@ -144,13 +154,32 @@ func loadFuncS(p *aplug, funcName string) func(*toolkit.Widget, string) {
test, err = p.plug.Lookup(funcName) test, err = p.plug.Lookup(funcName)
if err != nil { if err != nil {
log.Println("DID NOT FIND: name =", test, "err =", err) log(debugGui, "DID NOT FIND: name =", test, "err =", err)
return nil return nil
} }
newfunc, ok = test.(func(*toolkit.Widget, string)) newfunc, ok = test.(func(*toolkit.Widget, string))
if !ok { if !ok {
log.Println("function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name) log(debugGui, "function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name)
return nil
}
return newfunc
}
func loadFuncB(p *aplug, funcName string) func(bool) {
var newfunc func(bool)
var ok bool
var test plugin.Symbol
test, err = p.plug.Lookup(funcName)
if err != nil {
log(debugGui, "DID NOT FIND: name =", test, "err =", err)
return nil
}
newfunc, ok = test.(func(bool))
if !ok {
log(debugGui, "function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name)
return nil return nil
} }
return newfunc return newfunc
@ -163,13 +192,13 @@ func loadFunc2(p *aplug, funcName string) func(*toolkit.Widget, *toolkit.Widget)
test, err = p.plug.Lookup(funcName) test, err = p.plug.Lookup(funcName)
if err != nil { if err != nil {
log.Println("DID NOT FIND: name =", test, "err =", err) log(debugGui, "DID NOT FIND: name =", test, "err =", err)
return nil return nil
} }
newfunc, ok = test.(func(*toolkit.Widget, *toolkit.Widget)) newfunc, ok = test.(func(*toolkit.Widget, *toolkit.Widget))
if !ok { if !ok {
log.Println("function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name) log(debugGui, "function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name)
return nil return nil
} }
return newfunc return newfunc
@ -185,41 +214,48 @@ func loadFuncF(p *aplug, funcName string) func(func ()) {
test, err = p.plug.Lookup(funcName) test, err = p.plug.Lookup(funcName)
if err != nil { if err != nil {
log.Println("DID NOT FIND: name =", test, "err =", err) log(debugGui, "DID NOT FIND: name =", test, "err =", err)
return nil return nil
} }
newfunc, ok = test.(func(func ())) newfunc, ok = test.(func(func ()))
if !ok { if !ok {
log.Println("function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name) log(debugGui, "function name =", funcName, "names didn't map correctly. Fix the plugin name =", p.name)
return nil return nil
} }
return newfunc return newfunc
} }
/*
This searches in the following order for the plugin .so files:
./toolkit/
~/go/src/go.wit.org/gui/toolkit/
/usr/lib/go-gui/
*/
func loadPlugin(p *aplug, name string) { func loadPlugin(p *aplug, name string) {
var filename string var filename string
// attempt to write out the file from the internal resource homeDir, err := os.UserHomeDir()
internalName := "toolkit/" + name if err != nil {
soFile, err := res.ReadFile(internalName) exit(err)
if (err != nil) {
log.Println(err)
} else {
err = os.WriteFile("/tmp/wit/" + name, soFile, 0644)
if (err != nil) {
log.Println(err)
}
} }
filename = "/tmp/wit/" + name // attempt to write out the file from the internal resource
filename = "toolkit/" + name
p.plug = loadfile(filename) p.plug = loadfile(filename)
if (p.plug != nil) { if (p.plug != nil) {
p.filename = filename p.filename = filename
return return
} }
filename = "/usr/share/wit/gui/" + name filename = homeDir + "/go/src/git.wit.org/wit/gui/toolkit/" + name
p.plug = loadfile(filename)
if (p.plug != nil) {
p.filename = filename
return
}
filename = "/usr/lib/go-gui/" + name
p.plug = loadfile(filename) p.plug = loadfile(filename)
if (p.plug != nil) { if (p.plug != nil) {
p.filename = filename p.filename = filename
@ -232,10 +268,10 @@ func loadPlugin(p *aplug, name string) {
// 1. open the shared object file to load the symbols // 1. open the shared object file to load the symbols
func loadfile(filename string) *plugin.Plugin { func loadfile(filename string) *plugin.Plugin {
plug, err := plugin.Open(filename) plug, err := plugin.Open(filename)
log.Println("plug =", plug)
if err != nil { if err != nil {
log.Println(err) log(debugGui, "plugin FAILED =", filename, err)
return nil return nil
} }
log(debugGui, "plugin WORKED =", filename)
return plug return plug
} }

View File

@ -1,21 +1,18 @@
package gui package gui
import "log"
func (n *Node) NewSlider(name string, x int, y int) *Node { func (n *Node) NewSlider(name string, x int, y int) *Node {
newNode := n.New(name) newNode := n.New(name, "Slider")
newNode.Widget.Name = name
newNode.Widget.X = x newNode.Widget.X = x
newNode.Widget.Y = y newNode.Widget.Y = y
newNode.Widget.Custom = func() { newNode.Widget.Custom = func() {
log.Println("even newer clicker() name in NewSlider", newNode.Widget) log(debugGui, "even newer clicker() name in NewSlider", newNode.Widget)
} }
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.NewSlider() aplug =", aplug.name, "name =", newNode.Widget.Name) log(debugGui, "gui.NewSlider() aplug =", aplug.name, "name =", newNode.Widget.Name)
if (aplug.NewSlider == nil) { if (aplug.NewSlider == nil) {
log.Println("\tgui.NewSlider() aplug.NewSlider = nil", aplug.name) log(debugGui, "\tgui.NewSlider() aplug.NewSlider = nil", aplug.name)
continue continue
} }
aplug.NewSlider(&n.Widget, &newNode.Widget) aplug.NewSlider(&n.Widget, &newNode.Widget)

View File

@ -1,21 +1,18 @@
package gui package gui
import "log"
func (n *Node) NewSpinner(name string, x int, y int) *Node { func (n *Node) NewSpinner(name string, x int, y int) *Node {
newNode := n.New(name) newNode := n.New(name, "Spinner")
newNode.Widget.Name = name
newNode.Widget.X = x newNode.Widget.X = x
newNode.Widget.Y = y newNode.Widget.Y = y
newNode.Widget.Custom = func() { newNode.Widget.Custom = func() {
log.Println("even newer clicker() name in NewSpinner", newNode.Widget) log(debugGui, "even newer clicker() name in NewSpinner", newNode.Widget)
} }
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.NewSpinner() aplug =", aplug.name, "name =", newNode.Widget.Name) log(debugGui, "gui.NewSpinner() aplug =", aplug.name, "name =", newNode.Widget.Name)
if (aplug.NewSpinner == nil) { if (aplug.NewSpinner == nil) {
log.Println("\tgui.NewSpinner() aplug.NewSpinner = nil", aplug.name) log(debugGui, "\tgui.NewSpinner() aplug.NewSpinner = nil", aplug.name)
continue continue
} }
aplug.NewSpinner(&n.Widget, &newNode.Widget) aplug.NewSpinner(&n.Widget, &newNode.Widget)

View File

@ -1,8 +1,6 @@
package gui package gui
import ( import (
"log"
"reflect"
"git.wit.org/wit/gui/toolkit" "git.wit.org/wit/gui/toolkit"
) )
@ -10,56 +8,23 @@ import (
// All GUI Data Structures and functions that are external // All GUI Data Structures and functions that are external
// within the toolkit/ abstraction layer // within the toolkit/ abstraction layer
// //
// More than one Window is not supported in a cross platform // More than one Window does not exist in every GUI situtaion and
// sense & may never be. On many toolkits you have to have 'tabs' // can never be. On many toolkits you have to have 'tabs', like
// Native Windows and MacOS toolkits work with tabs // Native Windows and MacOS toolkits
// //
// If that is the case, this code should abstract the concept of // If that is the case, this code abstracts the concept of
// windows and make everything 'tabs' // windows and makes each window a 'tabs' in a single window.
//
// Reminder from Goals: This is for simple GUI's.
// For example, a "Mouse Control Panel" not the GIMP or blender.
// //
var Config GuiConfig var Config GuiConfig
func GetDebug () bool { // This struct can be used with the go-arg package
return Config.Debug.Debug 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"`
func SetDebug (s bool) {
Config.Debug.Debug = s
// also set these
Config.Debug.Dump = s
Config.Debug.Node = s
}
func GetDebugToolkit () bool {
return Config.Debug.Toolkit
}
func SetDebugToolkit (s bool) {
Config.Debug.Toolkit = s
}
func ShowDebugValues() {
log.Println("\t wit/gui Debug =", Config.Debug.Debug)
log.Println("\t wit/gui DebugDump =", Config.Debug.Dump)
log.Println("\t wit/gui DebugNode =", Config.Debug.Node)
log.Println("\t wit/gui DebugTabs =", Config.Debug.Tabs)
log.Println("\t wit/gui DebugPlugin =", Config.Debug.Plugin)
log.Println("\t wit/gui DebugChange =", Config.Debug.Change)
log.Println("\t wit/gui DebugToolkit =", Config.Debug.Toolkit)
}
// This struct can be used with go-arg
type GuiDebug struct {
// These are global debugging settings
// TODO: move to a standard logging system
Debug bool
Dump bool
Node bool
Tabs bool
Plugin bool
Change bool `help:"debug mouse clicks and keyboard input"`
Toolkit bool `help:"debug toolkit"`
} }
type GuiConfig struct { type GuiConfig struct {
@ -72,33 +37,32 @@ type GuiConfig struct {
Height int Height int
Exit func(*Node) Exit func(*Node)
Debug GuiDebug
// hacks // hacks
depth int depth int
counter int // used to make unique ID's counter int // used to make unique ID's
prefix string prefix string
} }
// The Node is simply the name and the size of whatever GUI element exists // 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
type Node struct { type Node struct {
id int id int
Widget toolkit.Widget
// deprecate these and use toolkit.Widget // deprecate these and use toolkit.Widget
Name string Name string
Width int Width int
Height int Height int
Widget toolkit.Widget
// this function is run when there are mouse or keyboard events // this function is run when there are mouse or keyboard events
OnChanged func(*Node) OnChanged func(*Node)
parent *Node parent *Node
// TODO: make children a double linked list since some toolkits require order (?)
children []*Node children []*Node
// things that may not really be needed (?) // is keeping
// deprecate these things if they don't really need to exist
custom func() custom func()
checked bool checked bool
text string text string
@ -112,115 +76,12 @@ func (n *Node) Window() *Node {
return n.parent return n.parent
} }
func (n *Node) Dump() {
if ! Config.Debug.Dump {
return
}
IndentPrintln("NODE DUMP START")
IndentPrintln("id = ", n.id)
IndentPrintln("Name = ", n.Name)
IndentPrintln("Width = ", n.Width)
IndentPrintln("Height = ", n.Height)
if (n.parent == nil) {
IndentPrintln("parent = nil")
} else {
IndentPrintln("parent.id =", n.parent.id)
}
if (n.children != nil) {
IndentPrintln("children = ", n.children)
}
if (n.custom != nil) {
IndentPrintln("custom = ", n.custom)
}
IndentPrintln("checked = ", n.checked)
if (n.OnChanged != nil) {
IndentPrintln("OnChanged = ", n.OnChanged)
}
IndentPrintln("text = ", reflect.ValueOf(n.text).Kind(), n.text)
IndentPrintln("NODE DUMP END")
}
func (n *Node) Append(child *Node) { func (n *Node) Append(child *Node) {
n.children = append(n.children, child) n.children = append(n.children, child)
if (Config.Debug.Debug) { if (debugGui) {
log.Println("child node:") log(debugNode, "child node:")
child.Dump() child.Dump()
log.Println("parent node:") log(debugNode, "parent node:")
n.Dump() n.Dump()
} }
// time.Sleep(3 * time.Second)
}
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 + format
}
// newFormat := tabs + strconv.Itoa(depth) + " " + format
newFormat := tabs + format
log.Println(newFormat, a)
}
func (n *Node) ListChildren(dump bool) {
indentPrintln(listChildrenDepth, defaultPadding, n.id, n.Width, n.Height, n.Name)
if (dump == true) {
n.Dump()
}
if len(n.children) == 0 {
if (n.parent == nil) {
} else {
if (Config.Debug.Node) {
log.Println("\t\t\tparent =",n.parent.id)
}
if (listChildrenParent != nil) {
if (Config.Debug.Node) {
log.Println("\t\t\tlistChildrenParent =",listChildrenParent.id)
}
if (listChildrenParent.id != n.parent.id) {
log.Fatalln("parent.child does not match child.parent")
}
}
}
if (Config.Debug.Node) {
log.Println("\t\t", n.id, "has no children")
}
return
}
for _, child := range n.children {
// log.Println("\t\t", child.id, child.Width, child.Height, child.Name)
if (child.parent != nil) {
if (Config.Debug.Node) {
log.Println("\t\t\tparent =",child.parent.id)
}
} else {
log.Println("\t\t\tno parent")
panic("no parent")
}
if (dump == true) {
child.Dump()
}
if (Config.Debug.Node) {
if (child.children == nil) {
log.Println("\t\t", child.id, "has no children")
} else {
log.Println("\t\t\tHas children:", child.children)
}
}
listChildrenParent = n
listChildrenDepth += 1
child.ListChildren(dump)
listChildrenDepth -= 1
}
return
} }

7
tab.go
View File

@ -1,19 +1,18 @@
package gui package gui
import ( import (
"log"
) )
// This function should make a new node with the parent and // This function should make a new node with the parent and
// the 'tab' as a child // the 'tab' as a child
func (n *Node) NewTab(text string) *Node { func (n *Node) NewTab(text string) *Node {
newNode := n.New(text) newNode := n.New(text, "Tab")
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.NewTab() aplug =", aplug.name, "name =", newNode.Widget.Name) log(debugGui, "gui.NewTab() aplug =", aplug.name, "name =", newNode.Widget.Name)
if (aplug.NewTab == nil) { if (aplug.NewTab == nil) {
log.Println("\tgui.NewTab() aplug.NewTab = nil", aplug.name) log(debugGui, "\tgui.NewTab() aplug.NewTab = nil", aplug.name)
continue continue
} }
aplug.NewTab(&n.Widget, &newNode.Widget) aplug.NewTab(&n.Widget, &newNode.Widget)

View File

@ -1,18 +1,16 @@
package gui package gui
import "log"
func (n *Node) NewTextbox(name string) *Node { func (n *Node) NewTextbox(name string) *Node {
newNode := n.New(name) newNode := n.New(name, "Textbox")
newNode.Widget.Custom = func() { newNode.Widget.Custom = func() {
log.Println("even newer clicker() name in NewTextBox", newNode.Widget) log(debugGui, "wit/gui clicker()NewTextBox BUT IS EMPTY. FIXME", newNode.Widget)
} }
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.NewTextbox() aplug =", aplug.name, "name =", newNode.Widget.Name) log(debugGui, "gui.NewTextbox() aplug =", aplug.name, "name =", newNode.Widget.Name)
if (aplug.NewTextbox == nil) { if (aplug.NewTextbox == nil) {
log.Println("\tgui.NewTextbox() aplug.NewTextbox = nil", aplug.name) log(debugGui, "\tgui.NewTextbox() aplug.NewTextbox = nil", aplug.name)
continue continue
} }
aplug.NewTextbox(&n.Widget, &newNode.Widget) aplug.NewTextbox(&n.Widget, &newNode.Widget)

View File

@ -1,7 +1,5 @@
package main package main
import "log"
import "github.com/andlabs/ui" import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest" import _ "github.com/andlabs/ui/winmanifest"
@ -12,14 +10,10 @@ func (t *andlabsT) GetBox() *ui.Box {
// create a new box // create a new box
func (t *andlabsT) NewBox() *andlabsT { func (t *andlabsT) NewBox() *andlabsT {
if (DebugToolkit) { log(debugToolkit, "gui.Toolbox.NewBox() START create default")
log.Println("gui.Toolbox.NewBox() START create default")
}
t.Dump() t.Dump()
if (t.uiGroup != nil) { if (t.uiGroup != nil) {
if (DebugToolkit) { log(debugToolkit, "\tgui.Toolbox.NewBox() is a Group")
log.Println("\tgui.Toolbox.NewBox() is a Group")
}
var newTK andlabsT var newTK andlabsT
vbox := ui.NewVerticalBox() vbox := ui.NewVerticalBox()
@ -30,9 +24,7 @@ func (t *andlabsT) NewBox() *andlabsT {
return &newTK return &newTK
} }
if (t.uiBox != nil) { if (t.uiBox != nil) {
if (DebugToolkit) { log(debugToolkit, "\tgui.Toolbox.NewBox() is a Box")
log.Println("\tgui.Toolbox.NewBox() is a Box")
}
var newTK andlabsT var newTK andlabsT
vbox := ui.NewVerticalBox() vbox := ui.NewVerticalBox()
@ -44,9 +36,7 @@ func (t *andlabsT) NewBox() *andlabsT {
return &newTK return &newTK
} }
if (t.uiWindow != nil) { if (t.uiWindow != nil) {
if (DebugToolkit) { log(debugToolkit, "\tgui.Toolbox.NewBox() is a Window")
log.Println("\tgui.Toolbox.NewBox() is a Window")
}
var newT andlabsT var newT andlabsT
vbox := ui.NewVerticalBox() vbox := ui.NewVerticalBox()
@ -58,9 +48,7 @@ func (t *andlabsT) NewBox() *andlabsT {
// panic("WTF") // panic("WTF")
return &newT return &newT
} }
if (DebugToolkit) { log(debugToolkit, "\tgui.Toolbox.NewBox() FAILED. Couldn't figure out where to make a box")
log.Println("\tgui.Toolbox.NewBox() FAILED. Couldn't figure out where to make a box")
}
t.Dump() t.Dump()
return nil return nil
} }

View File

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

View File

@ -1,12 +1,12 @@
package main package main
import "log" import "git.wit.org/wit/gui/toolkit"
import "github.com/andlabs/ui" import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest" import _ "github.com/andlabs/ui/winmanifest"
func (t andlabsT) NewCheckbox(name string) *andlabsT { func (t andlabsT) NewCheckbox(name string, f func()) *andlabsT {
log.Println("gui.Toolkit.NewCheckbox()", name) log(debugToolkit, "gui.Toolkit.NewCheckbox()", name)
var newt andlabsT var newt andlabsT
if t.broken() { if t.broken() {
@ -17,9 +17,20 @@ func (t andlabsT) NewCheckbox(name string) *andlabsT {
newt.uiCheckbox = c newt.uiCheckbox = c
newt.uiBox = t.uiBox newt.uiBox = t.uiBox
t.uiBox.Append(c, stretchy) t.uiBox.Append(c, stretchy)
// newt.Custom = f
c.OnToggled(func(spin *ui.Checkbox) { c.OnToggled(func(spin *ui.Checkbox) {
// log(debugToolkit, "gui.Toolkit.NewCheckbox() clicked", name)
newt.commonChange("Checkbox") newt.commonChange("Checkbox")
/*
if (f != nil) {
log(debugToolkit, "Run custom() here", f)
log(SPEW, f)
f()
} else {
log(debugToolkit, "No custom() function here")
}
*/
}) })
return &newt return &newt
@ -32,3 +43,27 @@ func (t andlabsT) Checked() bool {
return t.uiCheckbox.Checked() return t.uiCheckbox.Checked()
} }
func NewCheckbox(parentW *toolkit.Widget, w *toolkit.Widget) {
log(debugToolkit, "gui.andlabs.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")
}
*/
mapWidgetsToolkits(w, newt)
}

View File

@ -1,37 +1,63 @@
package main package main
import "log" // This is important. This sets the defaults for the gui. Without this, there isn't correct padding, etc
func init() { func init() {
if (DebugToolkit) { // Can you pass values to a plugin init() ? Otherwise, there is no way to safely print
log.Println("gui/toolkit init() Setting defaultBehavior = true") // log(debugToolkit, "gui/toolkit init() Setting defaultBehavior = true")
}
setDefaultBehavior(true) setDefaultBehavior(true)
} }
func (t andlabsT) commonChange(widget string) { func (t andlabsT) commonChange(widget string) {
s := t.String() s := t.String()
if (DebugToolkit) { log(debugChange, "commonChange() START widget =", widget)
log.Println("gui.Toolkit.ui.OnChanged() =", s) log(debugChange, "commonChange() t.String =", s)
}
if (t.OnChanged != nil) { if (t.OnChanged != nil) {
if (DebugToolkit) { // log(debugChange, "commonChange() toolkit.OnChanged() START")
log.Println("gui.Toolkit.OnChanged() trying to run toolkit.OnChanged() entered val =", s) // t.OnChanged(&t)
} exit("OnChanged is not implemented. TODO: FIX THIS")
t.OnChanged(&t)
return return
} }
if (t.Custom != nil) { if (t.Custom != nil) {
if (DebugToolkit) { log(debugChange, "commonChange() START toolkit.Custom()")
log.Println("gui.Toolkit.OnChanged() Running toolkit.Custom()")
t.Dump()
}
t.Custom() t.Custom()
log(debugChange, "commonChange() END toolkit.Custom()")
return return
} }
if (DebugToolkit) { if (widget == "Checkbox") {
log.Println("gui.Toolkit.OnChanged() ENDED without finding any callback") log(debugChange, "commonChange() END Need to read the Checkbox value")
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")
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
} }
// does some sanity checks on the internal structs of the binary tree // does some sanity checks on the internal structs of the binary tree
@ -39,21 +65,19 @@ func (t andlabsT) commonChange(widget string) {
func (t *andlabsT) broken() bool { func (t *andlabsT) broken() bool {
if (t.uiBox == nil) { if (t.uiBox == nil) {
if (t.uiWindow != nil) { if (t.uiWindow != nil) {
if (DebugToolkit) { log(debugToolkit, "gui.Toolkit.UiBox == nil. This is an empty window. Try to add a box")
log.Println("gui.Toolkit.UiBox == nil. This is an empty window. Try to add a box")
}
t.NewBox() t.NewBox()
return false return false
} }
log.Println("gui.Toolkit.UiBox == nil. I can't add a widget without a place to put it") log(debugToolkit, "gui.Toolkit.UiBox == nil. I can't add a widget without a place to put it")
// log.Println("probably could just make a box here?") // log(debugToolkit, "probably could just make a box here?")
// corruption or something horrible? // corruption or something horrible?
panic("wit/gui toolkit/andlabs func broken() invalid goroutine access into this toolkit?") 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 (?)") panic("wit/gui toolkit/andlabs func broken() this probably should not cause the app to panic here (?)")
return true return true
} }
if (t.uiWindow == nil) { if (t.uiWindow == nil) {
log.Println("gui.Toolkit.UiWindow == nil. I can't add a widget without a place to put it (IGNORING FOR NOW)") log(debugToolkit, "gui.Toolkit.UiWindow == nil. I can't add a widget without a place to put it (IGNORING FOR NOW)")
forceDump(t) forceDump(t)
return false return false
} }

193
toolkit/andlabs/debug.go Normal file
View File

@ -0,0 +1,193 @@
package main
// import "git.wit.org/wit/gui/toolkit"
import "github.com/davecgh/go-spew/spew"
var defaultBehavior bool = true
var bookshelf bool // do you want things arranged in the box like a bookshelf or a stack?
var canvas bool // if set to true, the windows are a raw canvas
var menubar bool // for windows
var stretchy bool // expand things like buttons to the maximum size
var padded bool // add space between things like buttons
var margin bool // add space around the frames of windows
var debugToolkit bool
var debugChange bool
// var DebugToolkit bool
// This is important. This sets the defaults for the gui. Without this, there isn't correct padding, etc
func setDefaultBehavior(s bool) {
defaultBehavior = s
if (defaultBehavior) {
log(debugToolkit, "Setting this toolkit to use the default behavior.")
log(debugToolkit, "This is the 'guessing' part as defined by the wit/gui 'Principles'. Refer to the docs.")
stretchy = false
padded = true
menubar = true
margin = true
canvas = false
bookshelf = true // 99% of the time, things make a vertical stack of objects
} else {
log(debugToolkit, "This toolkit is set to ignore the default behavior.")
}
}
func SetDebugToolkit (s bool) {
debugToolkit = s
log(true, "debugToolkit =", debugToolkit)
log(true, "debugChange =", debugChange)
}
func SetDebugChange (s bool) {
debugChange = s
log(true, "debugToolkit =", debugToolkit)
log(true, "debugChange =", debugChange)
}
func ShowDebug () {
log(true, "debugToolkit =", debugToolkit)
log(true, "debugChange =", debugChange)
}
func GetDebugToolkit () bool {
return debugToolkit
}
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)
if (t.uiEntry != nil) {
log(debugToolkit, "gui.Toolkit.uiEntry.Text() =", t.uiEntry.Text())
return t.uiEntry.Text()
}
if (t.uiMultilineEntry != nil) {
log(debugToolkit, "gui.Toolkit.uiMultilineEntry.Text() =", t.uiMultilineEntry.Text())
text := t.uiMultilineEntry.Text()
log(debugToolkit, "gui.Toolkit.uiMultilineEntry.Text() =", text)
t.text = text
return text
}
if (t.uiCombobox != nil) {
log(debugToolkit, "gui.Toolkit.uiCombobox() =", t.text)
return t.text
}
return ""
}
func (t *andlabsT) SetText(s string) bool {
log(debugToolkit, "gui.Toolkit.Text() SetText() Enter")
if (t.uiEntry != nil) {
log(debugToolkit, "gui.Toolkit.Value() =", t.uiEntry.Text)
t.uiEntry.SetText(s)
return true
}
if (t.uiMultilineEntry != nil) {
log(debugToolkit, "gui.Toolkit.Value() =", t.uiMultilineEntry.Text)
t.uiMultilineEntry.SetText(s)
return true
}
return false
}
func sanity(t *andlabsT) bool {
if (debugToolkit) {
log(debugToolkit, "gui.Toolkit.Value() Enter")
scs := spew.ConfigState{MaxDepth: 1}
scs.Dump(t)
}
if (t.uiEntry == nil) {
log(debugToolkit, "gui.Toolkit.Value() =", t.uiEntry.Text)
return false
}
return true
}
func (t *andlabsT) SetValue(i int) bool {
log(debugToolkit, "gui.Toolkit.SetValue() START")
if (sanity(t)) {
return false
}
t.Dump()
// panic("got to toolkit.SetValue")
return true
}
func (t *andlabsT) Value() int {
if (debugToolkit) {
log(debugToolkit, "gui.Toolkit.Value() Enter")
scs := spew.ConfigState{MaxDepth: 1}
scs.Dump(t)
}
if (t == nil) {
log(debugToolkit, "gui.Toolkit.Value() can not get value t == nil")
return 0
}
if (t.uiSlider != nil) {
log(debugToolkit, "gui.Toolkit.Value() =", t.uiSlider.Value)
return t.uiSlider.Value()
}
if (t.uiSpinbox != nil) {
log(debugToolkit, "gui.Toolkit.Value() =", t.uiSpinbox.Value)
return t.uiSpinbox.Value()
}
log(debugToolkit, "gui.Toolkit.Value() Could not find a ui element to get a value from")
return 0
}
func (t *andlabsT) Dump() {
if ! debugToolkit {
return
}
log(debugToolkit, "gui.Toolkit.Dump() Name = ", t.Name, t.Width, t.Height)
if (t.uiBox != nil) {
log(debugToolkit, "gui.Toolkit.Dump() uiBox =", t.uiBox)
}
if (t.uiButton != nil) {
log(debugToolkit, "gui.Toolkit.Dump() uiButton =", t.uiButton)
}
if (t.uiCombobox != nil) {
log(debugToolkit, "gui.Toolkit.Dump() uiCombobox =", t.uiCombobox)
}
if (t.uiWindow != nil) {
log(debugToolkit, "gui.Toolkit.Dump() uiWindow =", t.uiWindow)
}
if (t.uiTab != nil) {
log(debugToolkit, "gui.Toolkit.Dump() uiTab =", t.uiTab)
}
if (t.uiGroup != nil) {
log(debugToolkit, "gui.Toolkit.Dump() uiGroup =", t.uiGroup)
}
if (t.uiEntry != nil) {
log(debugToolkit, "gui.Toolkit.Dump() uiEntry =", t.uiEntry)
}
if (t.uiMultilineEntry != nil) {
log(debugToolkit, "gui.Toolkit.Dump() uiMultilineEntry =", t.uiMultilineEntry)
}
if (t.uiSlider != nil) {
log(debugToolkit, "gui.Toolkit.Dump() uiSlider =", t.uiSlider)
}
if (t.uiCheckbox != nil) {
log(debugToolkit, "gui.Toolkit.Dump() 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)
}
log(debugToolkit, "gui.Toolkit.Dump() c =", t.c)
log(debugToolkit, "gui.Toolkit.Dump() val =", t.val)
log(debugToolkit, "gui.Toolkit.Dump() text =", t.text)
}

View File

@ -1,7 +1,5 @@
package main package main
import "log"
import "github.com/andlabs/ui" import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest" import _ "github.com/andlabs/ui/winmanifest"
@ -22,7 +20,7 @@ func BlankWindow(w *ui.Window) *ui.Box {
func (t *andlabsT) DemoNumbersPage() { func (t *andlabsT) DemoNumbersPage() {
var w *ui.Window var w *ui.Window
log.Println("Starting wit/gui toolkit andlabs/ui DemoNumbersPage()") log(debugToolkit, "Starting wit/gui toolkit andlabs/ui DemoNumbersPage()")
w = t.uiWindow w = t.uiWindow
t.uiBox = makeNumbersPage() t.uiBox = makeNumbersPage()

View File

@ -1,8 +1,5 @@
package main package main
import "log"
// import "time"
import "github.com/andlabs/ui" import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest" import _ "github.com/andlabs/ui/winmanifest"
@ -10,11 +7,10 @@ import "git.wit.org/wit/gui/toolkit"
func (t *andlabsT) NewDropdown(title string) *andlabsT { func (t *andlabsT) NewDropdown(title string) *andlabsT {
// make new node here // make new node here
if (DebugToolkit) {
log.Println("gui.Toolbox.NewDropdownCombobox()", title)
}
var newt andlabsT var newt andlabsT
log(debugToolkit, "gui.Toolbox.NewDropdownCombobox()", title)
if t.broken() { if t.broken() {
return nil return nil
} }
@ -31,7 +27,7 @@ func (t *andlabsT) NewDropdown(title string) *andlabsT {
s.OnSelected(func(spin *ui.Combobox) { s.OnSelected(func(spin *ui.Combobox) {
i := spin.Selected() i := spin.Selected()
if (newt.val == nil) { if (newt.val == nil) {
log.Println("make map didn't work") log(debugToolkit, "make map didn't work")
newt.text = "error" newt.text = "error"
} }
newt.text = newt.val[i] newt.text = newt.val[i]
@ -44,7 +40,7 @@ func (t *andlabsT) NewDropdown(title string) *andlabsT {
func (t *andlabsT) AddDropdownName(title string) { func (t *andlabsT) AddDropdownName(title string) {
t.uiCombobox.Append(title) t.uiCombobox.Append(title)
if (t.val == nil) { if (t.val == nil) {
log.Println("make map didn't work") log(debugToolkit, "make map didn't work")
return return
} }
t.val[t.c] = title t.val[t.c] = title
@ -56,34 +52,36 @@ func (t andlabsT) SetDropdown(i int) {
} }
func NewDropdown(parentW *toolkit.Widget, w *toolkit.Widget) { func NewDropdown(parentW *toolkit.Widget, w *toolkit.Widget) {
log.Println("gui.andlabs.NewDropdown()", w.Name) log(debugToolkit, "gui.andlabs.NewDropdown()", w.Name)
t := mapToolkits[parentW] t := mapToolkits[parentW]
if (t == nil) { if (t == nil) {
log.Println("go.andlabs.NewDropdown() toolkit struct == nil. name=", parentW.Name, w.Name) log(debugToolkit, "go.andlabs.NewDropdown() toolkit struct == nil. name=", parentW.Name, w.Name)
listMap() listMap()
} }
newt := t.NewDropdown(w.Name) newt := t.NewDropdown(w.Name)
newt.Custom = w.Custom
newt.tw = w
mapWidgetsToolkits(w, newt) mapWidgetsToolkits(w, newt)
} }
func AddDropdownName(w *toolkit.Widget, s string) { func AddDropdownName(w *toolkit.Widget, s string) {
log.Println("gui.andlabs.AddDropdownName()", w.Name, "add:", s) log(debugToolkit, "gui.andlabs.AddDropdownName()", w.Name, "add:", s)
t := mapToolkits[w] t := mapToolkits[w]
if (t == nil) { if (t == nil) {
log.Println("go.andlabs.AddDropdownName() toolkit struct == nil. name=", w.Name, s) log(debugToolkit, "go.andlabs.AddDropdownName() toolkit struct == nil. name=", w.Name, s)
listMap() listMap()
} }
t.AddDropdownName(s) t.AddDropdownName(s)
} }
func SetDropdown(w *toolkit.Widget, i int) { func SetDropdown(w *toolkit.Widget, i int) {
log.Println("gui.andlabs.SetDropdown()", i) log(debugToolkit, "gui.andlabs.SetDropdown()", i)
t := mapToolkits[w] t := mapToolkits[w]
if (t == nil) { if (t == nil) {
log.Println("go.andlabs.SetDropdown() toolkit struct == nil. name=", w.Name, i) log(debugToolkit, "go.andlabs.SetDropdown() toolkit struct == nil. name=", w.Name, i)
listMap() listMap()
} }
t.SetDropdown(i) t.SetDropdown(i)

View File

@ -1,8 +1,6 @@
package main package main
import ( import (
"log"
"git.wit.org/wit/gui/toolkit" "git.wit.org/wit/gui/toolkit"
"github.com/andlabs/ui" "github.com/andlabs/ui"
@ -10,11 +8,11 @@ import (
) )
func NewGroup(parentW *toolkit.Widget, w *toolkit.Widget) { func NewGroup(parentW *toolkit.Widget, w *toolkit.Widget) {
log.Println("gui.andlabs.NewGroup()", w.Name) log(debugToolkit, "gui.andlabs.NewGroup()", w.Name)
t := mapToolkits[parentW] t := mapToolkits[parentW]
if (t == nil) { if (t == nil) {
log.Println("go.andlabs.NewGroup() toolkit struct == nil. name=", parentW.Name, w.Name) log(debugToolkit, "go.andlabs.NewGroup() toolkit struct == nil. name=", parentW.Name, w.Name)
listMap() listMap()
} }
newt := t.NewGroup(w.Name) newt := t.NewGroup(w.Name)
@ -25,9 +23,8 @@ func NewGroup(parentW *toolkit.Widget, w *toolkit.Widget) {
func (t andlabsT) NewGroup(title string) *andlabsT { func (t andlabsT) NewGroup(title string) *andlabsT {
var newt andlabsT var newt andlabsT
if (DebugToolkit) { log(debugToolkit, "gui.Toolbox.NewGroup() create", title)
log.Println("gui.Toolbox.NewGroup() create", title)
}
g := ui.NewGroup(title) g := ui.NewGroup(title)
g.SetMargined(margin) g.SetMargined(margin)
@ -36,8 +33,9 @@ func (t andlabsT) NewGroup(title string) *andlabsT {
} else if (t.uiWindow != nil) { } else if (t.uiWindow != nil) {
t.uiWindow.SetChild(g) t.uiWindow.SetChild(g)
} else { } else {
log.Println("gui.ToolboxNode.NewGroup() node.UiBox == nil. I can't add a range UI element without a place to put it") log(debugToolkit, "gui.ToolboxNode.NewGroup() node.UiBox == nil. I can't add a range UI element without a place to put it")
log.Fatalln("probably could just make a box here?") log(debugToolkit, "probably could just make a box here?")
exit("internal wit/gui error")
} }
hbox := ui.NewVerticalBox() hbox := ui.NewVerticalBox()

View File

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

136
toolkit/andlabs/log.go Normal file
View File

@ -0,0 +1,136 @@
//
// version v1.2
//
// I like things to be easy.
//
// this means all the log settings are in one place. it should allow
// things to be over-ridden externally to the library
// but still allow command line --args to pass debugging settings
//
// I also have a generic sleep() and exit() in here because it's simple
//
// Usage:
//
// log("something", foo, bar)
// var DEBUG bool = true
// log(DEBUG, "something else", someOtherVariable) # if DEBUG == false, return doing nothing
// log(SPEW, "something else", someOtherVariable) # this get's sent to spew.Dump(). Very useful for debugging!
//
package main
import (
"os"
"runtime"
"runtime/pprof"
golog "log"
"time"
"reflect"
"github.com/davecgh/go-spew/spew"
// "net"
)
var LOGOFF bool = false // turn this off, all logging stops
var WARN bool
var INFO bool
type spewt struct {
a bool
}
var SPEW spewt
/*
sleep() # you know what this does? sleeps for 1 second. yep. dump. easy.
sleep(.1) # you know what this does? yes, it sleeps for 1/10th of a second
*/
func sleep(a ...any) {
if (a == nil) {
time.Sleep(time.Second)
return
}
log(true, "sleep", a[0])
switch a[0].(type) {
case int:
time.Sleep(time.Duration(a[0].(int)) * time.Second)
case float64:
time.Sleep(time.Duration(a[0].(float64) * 1000) * time.Millisecond)
default:
log("sleep a[0], type = ", a[0], reflect.TypeOf(a[0]))
}
}
/*
exit() # yep. exits. I guess everything must be fine
exit(3) # I guess 3 it is then
exit("dont like apples") # ok. I'll make a note of that
*/
func exit(a ...any) {
log(true, "exit", a)
//if (a) {
// os.Exit(a)
//}
os.Exit(0)
}
/*
I've spent, am spending, too much time thinking about 'logging'. 'log', 'logrus', 'zap', whatever.
I'm not twitter. i don't give a fuck about how many nanoseconds it takes to log. Anyway, this
implementation is probably faster than all of those because you just set one bool to FALSE
and it all stops.
Sometimes I need to capture to stdout, sometimes stdout can't
work because it doesn't exist for the user. This whole thing is a PITA. Then it's spread
over 8 million references in every .go file. I'm tapping out and putting
it in one place. here it is. Also, this makes having debug levels really fucking easy.
You can define whatever level of logging you want from anywhere (command line) etc.
log() # doesn't do anything
log(stuff) # sends it to whatever log you define in a single place. here is the place
*/
func log(a ...any) {
if (LOGOFF) {
return
}
if (a == nil) {
return
}
var blah bool
if (reflect.TypeOf(a[0]) == reflect.TypeOf(blah)) {
// golog.Println("\t a[0] = bool")
if (a[0] == false) {
return
}
a[0] = "WIT/GUI/Toolkit"
}
if (reflect.TypeOf(a[0]) == reflect.TypeOf(SPEW)) {
// a = a[1:]
a[0] = "WIT/GUI/Toolkit"
if (debugToolkit) {
spew.Dump(a)
}
return
}
golog.Println(a...)
}
func loggo() {
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
golog.Println("runtime.NumGoroutine() = ", runtime.NumGoroutine())
}
func logindent(depth int, format string, a ...interface{}) {
var tabs string
for i := 0; i < depth; i++ {
tabs = tabs + format
}
// newFormat := tabs + strconv.Itoa(depth) + " " + format
newFormat := tabs + format
log(debugToolkit, newFormat, a)
}

View File

@ -1,9 +1,6 @@
package main package main
import ( import (
"log"
// "time"
"git.wit.org/wit/gui/toolkit" "git.wit.org/wit/gui/toolkit"
"github.com/andlabs/ui" "github.com/andlabs/ui"
@ -12,16 +9,14 @@ import (
) )
func Main(f func()) { func Main(f func()) {
if (DebugToolkit) { log(debugToolkit, "Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)")
}
ui.Main( func() { ui.Main( func() {
log.Println("Starting gui.Main() (using gtk via andlabs/ui)") log(debugToolkit, "Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)") log(debugToolkit, "Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)") log(debugToolkit, "Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)") log(debugToolkit, "Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)") log(debugToolkit, "Starting gui.Main() (using gtk via andlabs/ui)")
log.Println("Starting gui.Main() (using gtk via andlabs/ui)") log(debugToolkit, "Starting gui.Main() (using gtk via andlabs/ui)")
// time.Sleep(1 * time.Second) // time.Sleep(1 * time.Second)
// NewWindow2("helloworld2", 200, 100) // NewWindow2("helloworld2", 200, 100)
f() f()
@ -37,21 +32,20 @@ func Main(f func()) {
// For example: Queue(NewWindow()) // For example: Queue(NewWindow())
// //
func Queue(f func()) { func Queue(f func()) {
if (DebugToolkit) { log(debugToolkit, "Sending function to ui.QueueMain() (using gtk via andlabs/ui)")
log.Println("Sending function to ui.QueueMain() (using gtk via andlabs/ui)") log("THIS MIGHT BREAK")
} ui.QueueMain(f)
//ui.QueueMain(f) // f()
f()
} }
func Init() { func Init() {
log.Println("should Init() here") log(debugToolkit, "should Init() here")
mapWidgets = make(map[*andlabsT]*toolkit.Widget) mapWidgets = make(map[*andlabsT]*toolkit.Widget)
mapToolkits = make(map[*toolkit.Widget]*andlabsT) mapToolkits = make(map[*toolkit.Widget]*andlabsT)
} }
func Quit() { func Quit() {
log.Println("should Quit() here") log(debugToolkit, "should Quit() here")
// myExit(nil) // myExit(nil)
} }

View File

@ -1,8 +1,6 @@
package main package main
import ( import (
"log"
"git.wit.org/wit/gui/toolkit" "git.wit.org/wit/gui/toolkit"
) )
@ -13,15 +11,15 @@ var mapToolkits map[*toolkit.Widget]*andlabsT
// This lists out the know mappings // This lists out the know mappings
func listMap() { func listMap() {
log.Println("listMap() HERE") log(debugToolkit, "listMap() HERE")
log.Println("listMap() HERE") log(debugToolkit, "listMap() HERE")
log.Println("listMap() HERE mapWidgets()") log(debugToolkit, "listMap() HERE mapWidgets()")
for t, w := range mapWidgets { for t, w := range mapWidgets {
log.Println("andlabs =", t.Name, "widget =", w.Name) log(debugToolkit, "andlabs =", t.Name, "widget =", w.Name)
} }
log.Println("listMap() HERE mapToolkits()") log(debugToolkit, "listMap() HERE mapToolkits()")
for w, t := range mapToolkits { for w, t := range mapToolkits {
log.Println("andlabs =", t, "widget =", w.Name) log(debugToolkit, "andlabs =", t, "widget =", w.Name)
forceDump(t) forceDump(t)
} }
} }
@ -30,14 +28,22 @@ func mapWidgetsToolkits(w *toolkit.Widget, t *andlabsT) {
if (mapToolkits[w] == nil) { if (mapToolkits[w] == nil) {
mapToolkits[w] = t mapToolkits[w] = t
} else { } else {
log.Println("WTF: mapToolkits already installed") log(debugToolkit, "WTF: mapToolkits was sent nil. this should not happen w =", w)
panic("WTF") 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")
} }
if (mapWidgets[t] == nil) { if (mapWidgets[t] == nil) {
mapWidgets[t] = w mapWidgets[t] = w
} else { } else {
log.Println("WTF: mapWidgets already installed") log(debugToolkit, "WTF: mapWidgets already installed. w =", w)
panic("WTF") 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")
} }
} }

View File

@ -1,9 +1,6 @@
package main package main
import ( import (
"log"
"os"
"git.wit.org/wit/gui/toolkit" "git.wit.org/wit/gui/toolkit"
"github.com/andlabs/ui" "github.com/andlabs/ui"
@ -12,13 +9,13 @@ import (
func (t andlabsT) NewSlider(title string, x int, y int) *andlabsT { func (t andlabsT) NewSlider(title string, x int, y int) *andlabsT {
// make new node here // make new node here
log.Println("gui.Toolkit.NewSpinbox()", x, y) log(debugToolkit, "gui.Toolkit.NewSpinbox()", x, y)
var newt andlabsT var newt andlabsT
if (t.uiBox == nil) { 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(debugToolkit, "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?") log(debugToolkit, "probably could just make a box here?")
os.Exit(0) exit("internal golang wit/gui/toolkit error")
return nil return nil
} }
@ -36,11 +33,11 @@ func (t andlabsT) NewSlider(title string, x int, y int) *andlabsT {
func NewSlider(parentW *toolkit.Widget, w *toolkit.Widget) { func NewSlider(parentW *toolkit.Widget, w *toolkit.Widget) {
var newt *andlabsT var newt *andlabsT
log.Println("gui.andlabs.NewTab()", w.Name) log(debugToolkit, "gui.andlabs.NewTab()", w.Name)
t := mapToolkits[parentW] t := mapToolkits[parentW]
if (t == nil) { if (t == nil) {
log.Println("go.andlabs.NewTab() toolkit struct == nil. name=", parentW.Name, w.Name) log(debugToolkit, "go.andlabs.NewTab() toolkit struct == nil. name=", parentW.Name, w.Name)
return return
} }
newt = t.NewSlider(w.Name, w.X, w.Y) newt = t.NewSlider(w.Name, w.X, w.Y)

View File

@ -1,19 +1,16 @@
package main package main
import "log"
import "os"
import "github.com/andlabs/ui" import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest" import _ "github.com/andlabs/ui/winmanifest"
func (t andlabsT) NewSpinner(title string, x int, y int) *andlabsT { func (t andlabsT) NewSpinner(title string, x int, y int) *andlabsT {
// make new node here // make new node here
log.Println("gui.Toolkit.NewSpinner()", x, y) log(debugToolkit, "gui.Toolkit.NewSpinner()", x, y)
var newt andlabsT var newt andlabsT
if (t.uiBox == nil) { 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") log(debugToolkit, "gui.ToolkitNode.NewSpinner() node.UiBox == nil. I can't add a range UI element without a place to put it")
os.Exit(0) exit("internal golang wit/gui error")
return nil return nil
} }

View File

@ -1,51 +1,10 @@
package main package main
import "log" import "git.wit.org/wit/gui/toolkit"
import "github.com/andlabs/ui" import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest" import _ "github.com/andlabs/ui/winmanifest"
import "github.com/davecgh/go-spew/spew"
var defaultBehavior bool = true
var bookshelf bool // do you want things arranged in the box like a bookshelf or a stack?
var canvas bool // if set to true, the windows are a raw canvas
var menubar bool // for windows
var stretchy bool // expand things like buttons to the maximum size
var padded bool // add space between things like buttons
var margin bool // add space around the frames of windows
var DebugToolkit bool
func setDefaultBehavior(s bool) {
defaultBehavior = s
if (defaultBehavior) {
if (DebugToolkit) {
log.Println("Setting this toolkit to use the default behavior.")
log.Println("This is the 'guessing' part as defined by the wit/gui 'Principles'. Refer to the docs.")
}
stretchy = false
padded = true
menubar = true
margin = true
canvas = false
bookshelf = true // 99% of the time, things make a vertical stack of objects
DebugToolkit = false
} else {
log.Println("This toolkit is set to ignore the default behavior.")
}
}
func SetDebugToolkit (s bool) {
DebugToolkit = s
}
func GetDebugToolkit () bool {
return DebugToolkit
}
// stores the raw toolkit internals // stores the raw toolkit internals
type andlabsT struct { type andlabsT struct {
id string id string
@ -53,6 +12,7 @@ type andlabsT struct {
Name string Name string
Width int Width int
Height int Height int
tw *toolkit.Widget
OnChanged func(*andlabsT) OnChanged func(*andlabsT)
OnExit func(*andlabsT) OnExit func(*andlabsT)
@ -83,167 +43,3 @@ type andlabsT struct {
val map[int]string val map[int]string
text string text string
} }
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 {
t.Dump()
if (DebugToolkit) {
log.Println("gui.Toolkit.Text() Enter")
scs := spew.ConfigState{MaxDepth: 1}
scs.Dump(t)
}
if (t.uiEntry != nil) {
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() =", t.uiEntry.Text())
}
return t.uiEntry.Text()
}
if (t.uiMultilineEntry != nil) {
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() =", t.uiMultilineEntry.Text())
}
text := t.uiMultilineEntry.Text()
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() text =", text)
}
t.text = text
return text
}
if (t.uiCombobox != nil) {
if (DebugToolkit) {
log.Println("gui.Toolkit.GetText() =", t.text)
}
return t.text
}
return ""
}
func (t *andlabsT) SetText(s string) bool {
if (DebugToolkit) {
log.Println("gui.Toolkit.Text() Enter")
scs := spew.ConfigState{MaxDepth: 1}
scs.Dump(t)
}
if (t.uiEntry != nil) {
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() =", t.uiEntry.Text)
}
t.uiEntry.SetText(s)
return true
}
if (t.uiMultilineEntry != nil) {
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() =", t.uiMultilineEntry.Text)
}
t.uiMultilineEntry.SetText(s)
return true
}
return false
}
func sanity(t *andlabsT) bool {
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() Enter")
scs := spew.ConfigState{MaxDepth: 1}
scs.Dump(t)
}
if (t.uiEntry == nil) {
if (DebugToolkit) {
log.Println("gui.Toolkit.Value() =", t.uiEntry.Text)
}
return false
}
return true
}
func (t *andlabsT) SetValue(i int) bool {
log.Println("gui.Toolkit.SetValue() START")
if (sanity(t)) {
return false
}
t.Dump()
// panic("got to toolkit.SetValue")
return true
}
func (t *andlabsT) 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 (t *andlabsT) Dump() {
if ! DebugToolkit {
return
}
log.Println("gui.Toolkit.Dump() Name = ", t.Name, t.Width, t.Height)
if (t.uiBox != nil) {
log.Println("gui.Toolkit.Dump() uiBox =", t.uiBox)
}
if (t.uiButton != nil) {
log.Println("gui.Toolkit.Dump() uiButton =", t.uiButton)
}
if (t.uiCombobox != nil) {
log.Println("gui.Toolkit.Dump() uiCombobox =", t.uiCombobox)
}
if (t.uiWindow != nil) {
log.Println("gui.Toolkit.Dump() uiWindow =", t.uiWindow)
}
if (t.uiTab != nil) {
log.Println("gui.Toolkit.Dump() uiTab =", t.uiTab)
}
if (t.uiGroup != nil) {
log.Println("gui.Toolkit.Dump() uiGroup =", t.uiGroup)
}
if (t.uiEntry != nil) {
log.Println("gui.Toolkit.Dump() uiEntry =", t.uiEntry)
}
if (t.uiMultilineEntry != nil) {
log.Println("gui.Toolkit.Dump() uiMultilineEntry =", t.uiMultilineEntry)
}
if (t.uiSlider != nil) {
log.Println("gui.Toolkit.Dump() uiSlider =", t.uiSlider)
}
if (t.uiCheckbox != nil) {
log.Println("gui.Toolkit.Dump() uiCheckbox =", t.uiCheckbox)
}
if (t.OnExit != nil) {
log.Println("gui.Toolkit.Dump() OnExit =", t.OnExit)
}
if (t.Custom != nil) {
log.Println("gui.Toolkit.Dump() Custom =", t.Custom)
}
log.Println("gui.Toolkit.Dump() c =", t.c)
log.Println("gui.Toolkit.Dump() val =", t.val)
log.Println("gui.Toolkit.Dump() text =", t.text)
}

View File

@ -1,9 +1,6 @@
package main package main
import ( import (
"log"
"time"
"git.wit.org/wit/gui/toolkit" "git.wit.org/wit/gui/toolkit"
"github.com/andlabs/ui" "github.com/andlabs/ui"
@ -26,32 +23,30 @@ func (t *andlabsT) newTab(name string) *andlabsT {
// var w *ui.Window // var w *ui.Window
var newt *andlabsT var newt *andlabsT
log.Println("gui.toolkit.AddTab() sleep 3") log(debugToolkit, "gui.toolkit.AddTab()")
if (t.uiWindow == nil) { if (t.uiWindow == nil) {
log.Println("gui.Toolkit.UiWindow == nil. I can't add a toolbar without window") log(debugToolkit, "gui.Toolkit.UiWindow == nil. I can't add a toolbar without window")
return nil return nil
} }
if (t.uiTab == nil) { if (t.uiTab == nil) {
// this means you have to make a new tab // this means you have to make a new tab
log.Println("gui.toolkit.NewTab() GOOD. This should be the first tab:", name) log(debugToolkit, "gui.toolkit.NewTab() GOOD. This should be the first tab:", name)
newt = newTab(t.uiWindow, name) newt = newTab(t.uiWindow, name)
t.uiTab = newt.uiTab t.uiTab = newt.uiTab
} else { } else {
// this means you have to append a tab // this means you have to append a tab
log.Println("gui.toolkit.NewTab() GOOD. This should be an additional tab:", name) log(debugToolkit, "gui.toolkit.NewTab() GOOD. This should be an additional tab:", name)
newt = t.appendTab(name) newt = t.appendTab(name)
} }
newt.Name = name newt.Name = name
if (DebugToolkit) { log(debugToolkit, "t:")
log.Println("t:") t.Dump()
t.Dump() log(debugToolkit, "newt:")
log.Println("newt:") newt.Dump()
newt.Dump()
}
return newt return newt
} }
@ -62,29 +57,23 @@ func (t *andlabsT) newTab(name string) *andlabsT {
func tabSetMargined(tab *ui.Tab) { func tabSetMargined(tab *ui.Tab) {
c := tab.NumPages() c := tab.NumPages()
for i := 0; i < c; i++ { for i := 0; i < c; i++ {
if (DebugToolkit) { log(debugToolkit, "SetMargined", i, margin)
log.Println("SetMargined", i, margin)
}
tab.SetMargined(i, margin) tab.SetMargined(i, margin)
} }
} }
func newTab(w *ui.Window, name string) *andlabsT { func newTab(w *ui.Window, name string) *andlabsT {
var t andlabsT var t andlabsT
if (DebugToolkit) { log(debugToolkit, "gui.toolkit.NewTab() ADD", name)
log.Println("gui.toolkit.NewTab() ADD", name)
}
if (w == nil) { if (w == nil) {
log.Println("gui.toolkit.NewTab() node.UiWindow == nil. I can't add a tab without a window") log(debugToolkit, "gui.toolkit.NewTab() node.UiWindow == nil. I can't add a tab without a window")
log.Println("gui.toolkit.NewTab() node.UiWindow == nil. I can't add a tab without a window") log(debugToolkit, "gui.toolkit.NewTab() node.UiWindow == nil. I can't add a tab without a window")
log.Println("gui.toolkit.NewTab() node.UiWindow == nil. I can't add a tab without a window") log(debugToolkit, "gui.toolkit.NewTab() node.UiWindow == nil. I can't add a tab without a window")
time.Sleep(1 * time.Second) sleep(1)
return nil return nil
} }
if (DebugToolkit) { log(debugToolkit, "gui.toolkit.AddTab() START name =", name)
log.Println("gui.toolkit.AddTab() START name =", name)
}
tab := ui.NewTab() tab := ui.NewTab()
w.SetMargined(margin) w.SetMargined(margin)
@ -102,17 +91,13 @@ func newTab(w *ui.Window, name string) *andlabsT {
func (t *andlabsT) appendTab(name string) *andlabsT { func (t *andlabsT) appendTab(name string) *andlabsT {
var newT andlabsT var newT andlabsT
if (DebugToolkit) { log(debugToolkit, "gui.toolkit.NewTab() ADD", name)
log.Println("gui.toolkit.NewTab() ADD", name)
}
if (t.uiTab == nil) { if (t.uiTab == nil) {
log.Println("gui.Toolkit.UiWindow == nil. I can't add a widget without a place to put it") log(debugToolkit, "gui.Toolkit.UiWindow == nil. I can't add a widget without a place to put it")
panic("should never have happened. wit/gui/toolkit has ui.Tab == nil") panic("should never have happened. wit/gui/toolkit has ui.Tab == nil")
} }
if (DebugToolkit) { log(debugToolkit, "gui.toolkit.AddTab() START name =", name)
log.Println("gui.toolkit.AddTab() START name =", name)
}
var hbox *ui.Box var hbox *ui.Box
if (defaultBehavior) { if (defaultBehavior) {
@ -135,11 +120,11 @@ func (t *andlabsT) appendTab(name string) *andlabsT {
func NewTab(parentW *toolkit.Widget, w *toolkit.Widget) { func NewTab(parentW *toolkit.Widget, w *toolkit.Widget) {
var newt *andlabsT var newt *andlabsT
log.Println("gui.andlabs.NewTab()", w.Name) log(debugToolkit, "gui.andlabs.NewTab()", w.Name)
t := mapToolkits[parentW] t := mapToolkits[parentW]
if (t == nil) { if (t == nil) {
log.Println("go.andlabs.NewTab() toolkit struct == nil. name=", parentW.Name, w.Name) log(debugToolkit, "go.andlabs.NewTab() toolkit struct == nil. name=", parentW.Name, w.Name)
return return
} }
newt = t.newTab(w.Name) newt = t.newTab(w.Name)

View File

@ -1,7 +1,5 @@
package main package main
import "log"
import "git.wit.org/wit/gui/toolkit" import "git.wit.org/wit/gui/toolkit"
import "github.com/andlabs/ui" import "github.com/andlabs/ui"
@ -10,9 +8,7 @@ import _ "github.com/andlabs/ui/winmanifest"
func (t andlabsT) NewTextbox(name string) *andlabsT { func (t andlabsT) NewTextbox(name string) *andlabsT {
var newt andlabsT var newt andlabsT
if (DebugToolkit) { log(debugToolkit, "gui.Toolkit.NewTextbox()", name)
log.Println("gui.Toolkit.NewTextbox()", name)
}
if t.broken() { if t.broken() {
return nil return nil
} }
@ -37,11 +33,11 @@ func (t andlabsT) NewTextbox(name string) *andlabsT {
func NewTextbox(parentW *toolkit.Widget, w *toolkit.Widget) { func NewTextbox(parentW *toolkit.Widget, w *toolkit.Widget) {
var t, newt *andlabsT var t, newt *andlabsT
log.Println("gui.andlabs.NewTextbox()", w.Name) log(debugToolkit, "gui.andlabs.NewTextbox()", w.Name)
t = mapToolkits[parentW] t = mapToolkits[parentW]
if (t == nil) { if (t == nil) {
log.Println("go.andlabs.NewTextbox() toolkit struct == nil. name=", parentW.Name, w.Name) log(debugToolkit, "go.andlabs.NewTextbox() toolkit struct == nil. name=", parentW.Name, w.Name)
return return
} }
@ -53,16 +49,15 @@ func NewTextbox(parentW *toolkit.Widget, w *toolkit.Widget) {
newt.uiLabel = ui.NewLabel(w.Name) newt.uiLabel = ui.NewLabel(w.Name)
newt.uiBox = t.uiBox newt.uiBox = t.uiBox
if (DebugToolkit) { log(debugToolkit, "gui.Toolbox.NewTextbox() about to append to Box parent t:", w.Name)
log.Println("gui.Toolbox.NewTextbox() about to append to Box parent t:", w.Name) t.Dump()
t.Dump() log(debugToolkit, "gui.Toolbox.NewTextbox() about to append to Box new t:", w.Name)
log.Println("gui.Toolbox.NewTextbox() about to append to Box new t:", w.Name) newt.Dump()
newt.Dump()
}
if (t.uiBox != nil) { if (t.uiBox != nil) {
t.uiBox.Append(newt.uiLabel, false) t.uiBox.Append(newt.uiLabel, false)
} else { } else {
log.Println("ERROR: wit/gui andlabs couldn't place this Textbox in a box") log(debugToolkit, "ERROR: wit/gui andlabs couldn't place this Textbox in a box")
return return
} }

View File

@ -1,8 +1,6 @@
package main package main
import ( import (
"log"
"github.com/andlabs/ui" "github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest" _ "github.com/andlabs/ui/winmanifest"
@ -20,12 +18,10 @@ func (t *andlabsT) ErrorWindow(msg1 string, msg2 string) {
func NewWindow(w *toolkit.Widget) { func NewWindow(w *toolkit.Widget) {
var t *andlabsT var t *andlabsT
if (DebugToolkit) { log(debugToolkit, "toolkit NewWindow", w.Name, w.Width, w.Height)
log.Println("toolkit NewWindow", w.Name, w.Width, w.Height)
}
if (w == nil) { if (w == nil) {
log.Println("wit/gui plugin error. widget == nil") log(debugToolkit, "wit/gui plugin error. widget == nil")
return return
} }
t = new(andlabsT) t = new(andlabsT)
@ -37,21 +33,17 @@ func NewWindow(w *toolkit.Widget) {
win.SetBorderless(canvas) win.SetBorderless(canvas)
win.SetMargined(margin) win.SetMargined(margin)
win.OnClosing(func(*ui.Window) bool { win.OnClosing(func(*ui.Window) bool {
if (DebugToolkit) { log(debugToolkit, "ui.Window().OnExit() SHOULD ATTEMPT CALLBACK here")
log.Println("ui.Window().OnExit() SHOULD ATTEMPT CALLBACK here") t.Dump()
t.Dump()
}
if (w.Custom != nil) { if (w.Custom != nil) {
w.Custom() w.Custom()
return true return true
} }
if (w.Event != nil) { // if (w.Event != nil) {
w.Event(w) // w.Event(w)
return true // return true
} // }
if (DebugToolkit) { log(debugToolkit, "andlabs.ui.Window().OnClosing() was not defined")
log.Println("andlabs.ui.Window().OnClosing() was not defined")
}
return false return false
}) })
win.Show() win.Show()
@ -64,15 +56,11 @@ func NewWindow(w *toolkit.Widget) {
} }
func (t *andlabsT) SetWindowTitle(title string) { func (t *andlabsT) SetWindowTitle(title string) {
if (DebugToolkit) { log(debugToolkit, "toolkit NewWindow", t.Name, "title", title)
log.Println("toolkit NewWindow", t.Name, "title", title)
}
win := t.uiWindow win := t.uiWindow
if (win != nil) { if (win != nil) {
win.SetTitle(title) win.SetTitle(title)
} else { } else {
if (DebugToolkit) { log(debugToolkit, "Setting the window title", title)
log.Println("Setting the window title", title)
}
} }
} }

View File

@ -98,10 +98,10 @@ func initKeybindings(g *gocui.Gui) error {
w.Custom() w.Custom()
return nil return nil
} }
if (w.Event != nil) { // if (w.Event != nil) {
w.Event(w) // w.Event(w)
return nil // return nil
} // }
} }
return nil return nil
}); err != nil { }); err != nil {

View File

@ -1,42 +1,43 @@
package toolkit package toolkit
// passes information between the toolkit library (plugin) // passes information between the toolkit library (plugin)
//
// All Toolkit interactions should be done via a channel or Queue() // All Toolkit interactions should be done via a channel or Queue()
// TODO: FIND THIS NOTE AND FIGURE OUT HOW TO IMPLEMENT IT
//
// This is the only thing that is passed between the toolkit plugin // This is the only thing that is passed between the toolkit plugin
//
// what names should be used? This is not part of [[Graphical Widget]] // what names should be used? This is not part of [[Graphical Widget]]
// Event() seems like a good name. // Event() seems like a good name.
// Could a protobuf be used here? (Can functions be passed?) // Could a protobuf be used here? (Can functions be passed?)
type Widget struct { type Widget struct {
i int
s string
Name string Name string
Type string // after lots of back and forth, a simple string
// This GUI is intended for simple things
// We are not laying out PDF's here
// This is used for things like a slider(0,100)
Width int Width int
Height int Height int
X int X int
Y int Y int
// latest attempt
Custom func() Custom func()
Event func(*Widget) *Widget
// Probably deprecate these // This might be useful to simplify retrieving
// values from things like checkboxes & dropdown's
B bool
I int
S string
// other things I've tried
// Event func(*Widget) *Widget
// OnChanged func(*Widget) // OnChanged func(*Widget)
// Custom func(*Widget) // Custom func(*Widget)
// OnExit func(*Widget) // OnExit func(*Widget)
} }
type Blah struct {
i int
s string
Name string
Width int
Height int
}
/* /*
type Widget int type Widget int

View File

@ -1,7 +1,6 @@
package gui package gui
import ( import (
"log"
"time" "time"
) )
@ -16,7 +15,7 @@ var watchtime time.Duration = 100 // in tenths of seconds
func Watchdog() { func Watchdog() {
var i = 1 var i = 1
for { for {
log.Println("watchdog timer is alive. give me something to do.", i, "debug =", Config.Debug.Debug) log(debugGui, "watchdog timer is alive. give me something to do.", i)
i += 1 i += 1
time.Sleep(watchtime * time.Second / 10) time.Sleep(watchtime * time.Second / 10)
} }

View File

@ -1,7 +1,6 @@
package gui package gui
import ( import (
"log"
) )
//import toolkit "git.wit.org/wit/gui/toolkit/andlabs" //import toolkit "git.wit.org/wit/gui/toolkit/andlabs"
@ -17,16 +16,18 @@ func NewWindow() *Node {
title := Config.Title title := Config.Title
// Windows are created off of the master node of the Binary Tree // Windows are created off of the master node of the Binary Tree
newNode = Config.master.New(title) newNode = Config.master.New(title, "Window")
newNode.Widget.Name = title
newNode.Widget.Width = Config.Width newNode.Widget.Width = Config.Width
newNode.Widget.Height = Config.Height newNode.Widget.Height = Config.Height
if (Config.Exit != nil) { if (Config.Exit != nil) {
log("setting a custom exit")
newNode.custom = func() { newNode.custom = func() {
Config.Exit(newNode) Config.Exit(newNode)
} }
} else {
log("not setting a custom exit")
} }
if (newNode.custom == nil) { if (newNode.custom == nil) {
@ -35,12 +36,12 @@ func NewWindow() *Node {
newNode.Widget.Custom = newNode.custom newNode.Widget.Custom = newNode.custom
log.Println("gui.Node.Window()", title) log(debugGui, "gui.Node.Window()", title)
for _, aplug := range allPlugins { for _, aplug := range allPlugins {
log.Println("gui.Node.NewWindow() toolkit plugin =", aplug.name) log(debugGui, "gui.Node.NewWindow() toolkit plugin =", aplug.name)
if (aplug.NewWindow == nil) { if (aplug.NewWindow == nil) {
log.Println("gui.Node.NewWindow() is nil") log(debugGui, "gui.Node.NewWindow() is nil")
continue continue
} }
aplug.NewWindow(&newNode.Widget) aplug.NewWindow(&newNode.Widget)