new-gui/main.go

205 lines
5.8 KiB
Go
Raw Normal View History

package gui
import (
"os"
// "embed" // reminder to not attempt this within the 'wit/gui' package
"git.wit.org/wit/gui/toolkit"
)
// TODO: make a fake 'plugin' channel of communication to andlabs for mswindows
// Windows doesn't support plugins. How can I keep andlabs and only compile it on windows?
// https://forum.heroiclabs.com/t/setting-up-goland-to-compile-plugins-on-windows/594/5
// import toolkit "git.wit.org/wit/gui/toolkit/andlabs"
const Xaxis = 0 // stack things horizontally
const Yaxis = 1 // stack things vertically
Squashed commit of the following: commit 448abc843e2241bab6c399f7a836dccba1defc18 Author: Jeff Carr <jcarr@wit.com> Date: Sun Mar 12 08:35:28 2023 -0500 this should probably be a new release now Signed-off-by: Jeff Carr <jcarr@wit.com> commit a4064f7a6c5ac67437768aa2bc67c75dafc91c4c Author: Jeff Carr <jcarr@wit.com> Date: Sat Mar 11 03:18:23 2023 -0600 able to work on add 'Box' and play with 'Image' Signed-off-by: Jeff Carr <jcarr@wit.com> commit 6e59573d85e82ecb005805f50711dddc2df50480 Author: Jeff Carr <jcarr@wit.com> Date: Sat Mar 11 03:04:34 2023 -0600 rearrange widget debugging Signed-off-by: Jeff Carr <jcarr@wit.com> commit e0570de75c6eb1b4f49e541d9ef5d83ae4434d3d Author: Jeff Carr <jcarr@wit.com> Date: Sat Mar 11 02:29:20 2023 -0600 debugging is lots smarter Signed-off-by: Jeff Carr <jcarr@wit.com> commit ece32a1e43d91cd197d0a8497ad2f034c46126e1 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 21:38:23 2023 -0600 first pass on a node delete Signed-off-by: Jeff Carr <jcarr@wit.com> commit c91cb0eddb0f73f8dea9b21a16cd76c7e2c19a33 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 21:06:29 2023 -0600 can recreate window list Signed-off-by: Jeff Carr <jcarr@wit.com> commit 470f9dc26aefd3626b319264fe151aa48d4d5377 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 12:07:34 2023 -0600 attempt to ressurect mouse in the console plugin Signed-off-by: Jeff Carr <jcarr@wit.com> commit 747bb53e06dda458cc8cd77b665f4d9d07f5e925 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 10:47:14 2023 -0600 jesus. gocui actually builds and works again as a plugin it didn't take too much to change it Signed-off-by: Jeff Carr <jcarr@wit.com> commit 9283c65c8e9b8d2630b251ad952b6b52caddb307 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 07:26:53 2023 -0600 show/hide/etc for window widgets Signed-off-by: Jeff Carr <jcarr@wit.com> commit 5724cd7ffd8595ae049a7c9c21cb2f1a993c4b76 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 06:40:36 2023 -0600 compiles and runs Signed-off-by: Jeff Carr <jcarr@wit.com> commit 44a5e69ce17cb506adfe24ca72cc86caa9ebcc70 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 05:57:15 2023 -0600 more debugging improvements Signed-off-by: Jeff Carr <jcarr@wit.com> commit b86f145f0252e7545b2e7fa78e1d5960cacb7bad Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 03:42:32 2023 -0600 set margin on tab's works Signed-off-by: Jeff Carr <jcarr@wit.com> commit d2218c08cf44acd5f017a8faa1439ee6d2fd46d5 Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 16:26:21 2023 -0600 ignore all *.so files Signed-off-by: Jeff Carr <jcarr@wit.com> commit e21934fff3cfea30b04df01bf0714f6927aa78f4 Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 16:25:15 2023 -0600 can't embed the toolkit/*.so files here Signed-off-by: Jeff Carr <jcarr@wit.com> commit f1e6c5fc9c8ca36db3ad6109d64612b6850fa856 Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 16:21:14 2023 -0600 andlabs group widget has Show() and Hide() Signed-off-by: Jeff Carr <jcarr@wit.com> commit e8487504aa76ca99c4891b777585a428fda0ef62 Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 16:07:56 2023 -0600 pass the node id into the plugin to use in channels Signed-off-by: Jeff Carr <jcarr@wit.com> commit 3667940a77af4e3855facb9247771d595477302f Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 14:20:21 2023 -0600 fix SetText() on Label Signed-off-by: Jeff Carr <jcarr@wit.com> commit 311d6be66db84b63fb7124df64e2e9be0f0b76a4 Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 14:06:46 2023 -0600 still compiles and runs Signed-off-by: Jeff Carr <jcarr@wit.com> commit ee4e9b21ef59a97f902c6dae2a57ac7b3063fe3b Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 11:02:34 2023 -0600 compiles Signed-off-by: Jeff Carr <jcarr@wit.com> Signed-off-by: Jeff Carr <jcarr@wit.com>
2023-03-12 08:47:16 -05:00
/*
// TODO: 2023/03/03 rethink how to get a plugin or figure out how
// golang packages can include a binary. Pull from /usr/go/go-gui/ ?
// may this plugin work when all other plugins fail
// if this is in the plugin, the packages can't work with go.mod builds
# don't do this in the plugin // go:embed /usr/lib/go-gui/toolkit/gocui.so
# don't do this in the plugin var res embed.FS
*/
func init() {
log("init() has been run")
Config.counter = 0
Config.prefix = "wit"
Config.Width = 640
Config.Height = 480
// Populates the top of the binary tree
Config.rootNode = addNode("guiBinaryTree")
Config.rootNode.WidgetType = toolkit.Root
// used to pass debugging flags to the toolkit plugins
Config.flag = Config.rootNode.newNode("flag", 0, nil)
Config.flag.WidgetType = toolkit.Flag
Config.flag = Config.rootNode.newNode("stdout", 0, nil)
Config.flag.WidgetType = toolkit.Stdout
Config.guiChan = make(chan toolkit.Action, 1)
go watchCallback()
}
func watchCallback() {
log(logInfo, "watchCallback() START")
for {
log(logNow, "watchCallback() restarted select for toolkit user events")
select {
case a := <-Config.guiChan:
if (a.ActionType == toolkit.UserQuit) {
log(logNow, "doUserEvent() User sent Quit()")
Config.rootNode.doCustom()
exit("wit/gui toolkit.UserQuit")
break
}
if (a.ActionType == toolkit.EnableDebug) {
log(logNow, "doUserEvent() Enable Debugging Window")
DebugWindow()
break
}
n := Config.rootNode.FindId(a.WidgetId)
if (n == nil) {
log(logError, "watchCallback() UNKNOWN widget id =", a.WidgetId, a.Name)
} else {
log(logNow, "watchCallback() FOUND widget id =", n.id, n.Name)
n.doUserEvent(a)
}
// this maybe a good idea?
// TODO: Throttle user events somehow
sleep(.1)
}
}
}
func (n *Node) doCustom() {
log(logNow, "doUserEvent() widget =", n.id, n.Name, n.WidgetType, n.B)
if (n.Custom == nil) {
log(debugError, "Custom() = nil. SKIPPING")
return
}
go n.Custom()
}
func (n *Node) doUserEvent(a toolkit.Action) {
log(logNow, "doUserEvent() node =", n.id, n.Name)
switch n.WidgetType {
case toolkit.Checkbox:
n.B = a.B
log(logNow, "doUserEvent() node =", n.id, n.Name, "set to:", n.B)
n.doCustom()
case toolkit.Button:
log(logNow, "doUserEvent() node =", n.id, n.Name, "button clicked")
n.doCustom()
case toolkit.Combobox:
n.S = a.S
log(logNow, "doUserEvent() node =", n.id, n.Name, "set to:", n.S)
n.doCustom()
case toolkit.Dropdown:
n.S = a.S
log(logNow, "doUserEvent() node =", n.id, n.Name, "set to:", n.S)
n.doCustom()
case toolkit.Textbox:
n.S = a.S
log(logNow, "doUserEvent() node =", n.id, n.Name, "set to:", n.S)
n.doCustom()
case toolkit.Spinner:
n.I = a.I
log(logNow, "doUserEvent() node =", n.id, n.Name, "set to:", n.I)
n.doCustom()
case toolkit.Slider:
n.I = a.I
log(logNow, "doUserEvent() node =", n.id, n.Name, "set to:", n.I)
n.doCustom()
case toolkit.Window:
log(logNow, "doUserEvent() node =", n.id, n.Name, "window closed")
n.doCustom()
default:
log(logNow, "doUserEvent() type =", n.WidgetType)
}
}
func (n *Node) LoadToolkit(name string) *Node {
log(logInfo, "LoadToolkit() START for name =", name)
plug := initPlugin(name)
if (plug == nil) {
return n
}
log(logInfo, "LoadToolkit() sending InitToolkit action to the plugin channel")
var a toolkit.Action
a.ActionType = toolkit.InitToolkit
plug.pluginChan <- a
sleep(.5) // temp hack until chan communication is setup
// TODO: find a new way to do this that is locking, safe and accurate
Config.rootNode.redraw(plug)
log(logInfo, "LoadToolkit() END for name =", name)
return n
}
func (n *Node) CloseToolkit(name string) bool {
log(logInfo, "CloseToolkit() for name =", name)
for _, plug := range allPlugins {
log(debugGui, "CloseToolkit() found", plug.name)
if (plug.name == name) {
log(debugNow, "CloseToolkit() sending close", name)
var a toolkit.Action
a.ActionType = toolkit.CloseToolkit
plug.pluginChan <- a
sleep(.5)
return true
}
}
return false
}
// There should only be one of these per application
// This is due to restrictions by being cross platform
// some toolkit's on some operating systems don't support more than one
// Keep things simple. Do the default expected thing whenever possible
func New() *Node {
return Config.rootNode
}
// try to load andlabs, if that doesn't work, fall back to the console
func (n *Node) Default() *Node {
// if DISPLAY isn't set, return since gtk can't load
// TODO: figure out how to check what to do in macos and mswindows
if (os.Getenv("DISPLAY") == "") {
if (n.LoadToolkit("gocui") == nil) {
log(logError, "New() failed to load gocui")
}
return n
}
if (n.LoadToolkit("andlabs") != nil) {
return n
}
n.LoadToolkit("gocui")
return n
}
// The window is destroyed but the application does not quit
func (n *Node) StandardClose() {
log(debugGui, "wit/gui Standard Window Close. name =", n.Name)
log(debugGui, "wit/gui Standard Window Close. n.Custom exit =", n.Custom)
}
Squashed commit of the following: commit 448abc843e2241bab6c399f7a836dccba1defc18 Author: Jeff Carr <jcarr@wit.com> Date: Sun Mar 12 08:35:28 2023 -0500 this should probably be a new release now Signed-off-by: Jeff Carr <jcarr@wit.com> commit a4064f7a6c5ac67437768aa2bc67c75dafc91c4c Author: Jeff Carr <jcarr@wit.com> Date: Sat Mar 11 03:18:23 2023 -0600 able to work on add 'Box' and play with 'Image' Signed-off-by: Jeff Carr <jcarr@wit.com> commit 6e59573d85e82ecb005805f50711dddc2df50480 Author: Jeff Carr <jcarr@wit.com> Date: Sat Mar 11 03:04:34 2023 -0600 rearrange widget debugging Signed-off-by: Jeff Carr <jcarr@wit.com> commit e0570de75c6eb1b4f49e541d9ef5d83ae4434d3d Author: Jeff Carr <jcarr@wit.com> Date: Sat Mar 11 02:29:20 2023 -0600 debugging is lots smarter Signed-off-by: Jeff Carr <jcarr@wit.com> commit ece32a1e43d91cd197d0a8497ad2f034c46126e1 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 21:38:23 2023 -0600 first pass on a node delete Signed-off-by: Jeff Carr <jcarr@wit.com> commit c91cb0eddb0f73f8dea9b21a16cd76c7e2c19a33 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 21:06:29 2023 -0600 can recreate window list Signed-off-by: Jeff Carr <jcarr@wit.com> commit 470f9dc26aefd3626b319264fe151aa48d4d5377 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 12:07:34 2023 -0600 attempt to ressurect mouse in the console plugin Signed-off-by: Jeff Carr <jcarr@wit.com> commit 747bb53e06dda458cc8cd77b665f4d9d07f5e925 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 10:47:14 2023 -0600 jesus. gocui actually builds and works again as a plugin it didn't take too much to change it Signed-off-by: Jeff Carr <jcarr@wit.com> commit 9283c65c8e9b8d2630b251ad952b6b52caddb307 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 07:26:53 2023 -0600 show/hide/etc for window widgets Signed-off-by: Jeff Carr <jcarr@wit.com> commit 5724cd7ffd8595ae049a7c9c21cb2f1a993c4b76 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 06:40:36 2023 -0600 compiles and runs Signed-off-by: Jeff Carr <jcarr@wit.com> commit 44a5e69ce17cb506adfe24ca72cc86caa9ebcc70 Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 05:57:15 2023 -0600 more debugging improvements Signed-off-by: Jeff Carr <jcarr@wit.com> commit b86f145f0252e7545b2e7fa78e1d5960cacb7bad Author: Jeff Carr <jcarr@wit.com> Date: Fri Mar 10 03:42:32 2023 -0600 set margin on tab's works Signed-off-by: Jeff Carr <jcarr@wit.com> commit d2218c08cf44acd5f017a8faa1439ee6d2fd46d5 Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 16:26:21 2023 -0600 ignore all *.so files Signed-off-by: Jeff Carr <jcarr@wit.com> commit e21934fff3cfea30b04df01bf0714f6927aa78f4 Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 16:25:15 2023 -0600 can't embed the toolkit/*.so files here Signed-off-by: Jeff Carr <jcarr@wit.com> commit f1e6c5fc9c8ca36db3ad6109d64612b6850fa856 Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 16:21:14 2023 -0600 andlabs group widget has Show() and Hide() Signed-off-by: Jeff Carr <jcarr@wit.com> commit e8487504aa76ca99c4891b777585a428fda0ef62 Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 16:07:56 2023 -0600 pass the node id into the plugin to use in channels Signed-off-by: Jeff Carr <jcarr@wit.com> commit 3667940a77af4e3855facb9247771d595477302f Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 14:20:21 2023 -0600 fix SetText() on Label Signed-off-by: Jeff Carr <jcarr@wit.com> commit 311d6be66db84b63fb7124df64e2e9be0f0b76a4 Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 14:06:46 2023 -0600 still compiles and runs Signed-off-by: Jeff Carr <jcarr@wit.com> commit ee4e9b21ef59a97f902c6dae2a57ac7b3063fe3b Author: Jeff Carr <jcarr@wit.com> Date: Thu Mar 9 11:02:34 2023 -0600 compiles Signed-off-by: Jeff Carr <jcarr@wit.com> Signed-off-by: Jeff Carr <jcarr@wit.com>
2023-03-12 08:47:16 -05:00
// The window is destroyed and the application exits
// TODO: properly exit the plugin since Quit() doesn't do it
func StandardExit() {
log("wit/gui Standard Window Exit. running os.Exit()")
log("StandardExit() attempt to exit each toolkit plugin")
for i, plug := range allPlugins {
log("NewButton()", i, plug)
}
exit(0)
}