allow passing of embed plugin files

Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
Jeff Carr 2023-04-28 07:29:46 -05:00
parent c0798a2db9
commit ed7becf5ee
8 changed files with 63 additions and 19 deletions

View File

@ -139,7 +139,7 @@ Creates a window helpful for debugging this package
`func ShowDebugValues()`
### func [StandardExit](/main.go#L197)
### func [StandardExit](/main.go#L231)
`func StandardExit()`
@ -157,13 +157,13 @@ This goroutine can be used like a watchdog timer
## Types
### type [GuiArgs](/structs.go#L26)
### type [GuiArgs](/structs.go#L27)
`type GuiArgs struct { ... }`
This struct can be used with the go-arg package
### type [GuiConfig](/structs.go#L32)
### type [GuiConfig](/structs.go#L33)
`type GuiConfig struct { ... }`
@ -173,14 +173,14 @@ This struct can be used with the go-arg package
var Config GuiConfig
```
### type [Node](/structs.go#L59)
### type [Node](/structs.go#L63)
`type Node struct { ... }`
The Node is a binary tree. This is how all GUI elements are stored
simply the name and the size of whatever GUI element exists
#### func [New](/main.go#L168)
#### func [New](/main.go#L202)
`func New() *Node`

View File

@ -64,6 +64,10 @@ func (n *Node) DebugTab(title string) *Node {
//////////////////////// window debugging things //////////////////////////////////
g1 = newN.NewGroup("list things")
g1.NewButton("List toolkits", func () {
dropdownWindow(g1)
Config.rootNode.ListToolkits()
})
g1.NewButton("List Windows", func () {
dropdownWindow(g1)
})

View File

@ -10,9 +10,6 @@ func (n *Node) NewImage(name string) *Node {
var a toolkit.Action
a.ActionType = toolkit.Add
// a.Widget = &newNode.widget
// a.Where = &n.widget
// action(&a)
newaction(&a, newNode, n)
return newNode

36
main.go
View File

@ -2,7 +2,7 @@ package gui
import (
"os"
// "embed" // reminder to not attempt this within the 'wit/gui' package
"embed"
"git.wit.org/wit/gui/toolkit"
)
@ -126,6 +126,40 @@ func (n *Node) doUserEvent(a toolkit.Action) {
}
}
func (n *Node) InitEmbed(resFS embed.FS) *Node {
Config.resFS = resFS
return n
}
func (n *Node) LoadToolkitEmbed(name string, b []byte) *Node {
for _, aplug := range allPlugins {
log(logInfo, "LoadToolkitEmbed() already loaded toolkit plugin =", aplug.name)
if (aplug.name == name) {
log(logError, "LoadToolkitEmbed() SKIPPING", name, "as you can't load it twice")
return n
}
}
f, err := os.CreateTemp("", "sample." + name + ".so")
if (err != nil) {
return n
}
defer os.Remove(f.Name())
f.Write(b)
p := initToolkit(name, f.Name())
if (p == nil) {
log(logError, "LoadToolkitEmbed() embedded go file failed", name)
}
return n
}
func (n *Node) ListToolkits() {
for _, aplug := range allPlugins {
log(logNow, "ListToolkits() already loaded toolkit plugin =", aplug.name)
}
}
func (n *Node) LoadToolkit(name string) *Node {
log(logInfo, "LoadToolkit() START for name =", name)
plug := initPlugin(name)

View File

@ -118,7 +118,7 @@ func searchPaths(name string) *aplug {
// attempt to write out the file from the internal resource
filename = "toolkit/" + name + ".so"
p := tryfile(name, filename)
p := initToolkit(name, filename)
if (p != nil) {
return p
}
@ -128,20 +128,20 @@ func searchPaths(name string) *aplug {
log(logError, "searchPaths() error. exiting here?")
} else {
filename = homeDir + "/go/src/git.wit.org/wit/gui/toolkit/" + name + ".so"
p = tryfile(name, filename)
p = initToolkit(name, filename)
if (p != nil) {
return p
}
}
filename = "/usr/lib/go-gui/" + name + ".so"
p = tryfile(name, filename)
p = initToolkit(name, filename)
if (p != nil) {
return p
}
filename = "/usr/local/lib/" + name + ".so"
p = tryfile(name, filename)
p = initToolkit(name, filename)
if (p != nil) {
return p
}
@ -150,13 +150,13 @@ func searchPaths(name string) *aplug {
// load module
// 1. open the shared object file to load the symbols
func tryfile(name string, filename string) *aplug {
func initToolkit(name string, filename string) *aplug {
plug, err := plugin.Open(filename)
if err != nil {
log(debugGui, "plugin FAILED =", filename, err)
return nil
}
log(debugGui, "tryfile() loading plugin =", filename)
log(debugGui, "initToolkit() loading plugin =", filename)
var newPlug *aplug
newPlug = new(aplug)
@ -180,13 +180,13 @@ func tryfile(name string, filename string) *aplug {
// set the communication to the plugins
newPlug.pluginChan = newPlug.PluginChannel()
if (newPlug.pluginChan == nil) {
log(debugError, "tryfile() ERROR PluginChannel() returned nil for plugin:", newPlug.name, filename)
log(debugError, "initToolkit() ERROR PluginChannel() returned nil for plugin:", newPlug.name, filename)
return nil
}
newPlug.Callback(Config.guiChan)
newPlug.InitOk = true
log(debugPlugin, "tryfile() END", newPlug.name, filename)
log(debugPlugin, "initToolkit() END", newPlug.name, filename)
return newPlug
}

View File

@ -1,8 +1,9 @@
package gui
import (
"git.wit.org/wit/gui/toolkit"
"sync"
"embed"
"git.wit.org/wit/gui/toolkit"
)
//
@ -52,6 +53,9 @@ type GuiConfig struct {
// sets the chan for the plugins to call back too
guiChan chan toolkit.Action
// option to pass in compiled plugins as embedded files
resFS embed.FS
}
// The Node is a binary tree. This is how all GUI elements are stored

View File

@ -16,6 +16,7 @@ func (n *node) doWidgetClick() {
// rootNode.dumpTree(true)
case toolkit.Window:
// setCurrentWindow(w)
n.doUserEvent()
case toolkit.Tab:
// setCurrentTab(w)
case toolkit.Group:

View File

@ -22,12 +22,16 @@ func simpleStdin() {
case "b":
log(true, "show buttons")
rootNode.showButtons()
case "d":
var a toolkit.Action
a.ActionType = toolkit.EnableDebug
callback <- a
case "":
fmt.Println("")
fmt.Println("Enter:")
fmt.Println("'l': list all widgets")
fmt.Println("'b': for buttons")
fmt.Println("")
fmt.Println("'d': enable debugging")
default:
i, _ := strconv.Atoi(s)
log(true, "got input:", i)