package main import ( "runtime/debug" "sync" "go.wit.com/log" "go.wit.com/toolkits/tree" "go.wit.com/widget" "go.wit.com/dev/andlabs/ui" // the _ means we only need this for the init() _ "go.wit.com/dev/andlabs/ui/winmanifest" ) var uiMainUndef bool = true var uiMain sync.Once var muAction sync.Mutex func queueAction(n *tree.Node, atype widget.ActionType) { ui.QueueMain(func() { newAction(n, atype) }) } func queueAdd(n *tree.Node) { ui.QueueMain(func() { newAdd(n) }) } func queueSetTitle(n *tree.Node, s string) { ui.QueueMain(func() { SetText(n, s) }) } func queueSetLabel(n *tree.Node, s string) { ui.QueueMain(func() { SetText(n, s) }) } func queueSetText(n *tree.Node, s string) { ui.QueueMain(func() { SetText(n, s) }) } func queueAddText(n *tree.Node, s string) { ui.QueueMain(func() { AddText(n, s) }) } func queueSetChecked(n *tree.Node, b bool) { ui.QueueMain(func() { setChecked(n, b) }) } func queueToolkitClose() { ui.QueueMain(func() { ui.Quit() }) } /* func queueMain(currentA widget.Action) { // this never happends defer func() { if r := recover(); r != nil { log.Log("YAHOOOO Recovered in queueMain() application:", r) log.Println("Recovered from panic:", r) log.Println("Stack trace:") debug.PrintStack() me.myTree.SendToolkitPanic() } }() // andlabs puts this inside the gofunction over there // probably this should be changed around here // and only andlabs stuff should be sent there? // it's easier to code it this way however // also, if it dies here, it get's caught // usually, this is where it dies log.Log(ANDLABS, "about to send action into the andlabs ui.QueueMain()") ui.QueueMain(func() { processAction(¤tA) }) } */ func guiMain() { defer func() { if r := recover(); r != nil { log.Log(WARN, "YAHOOOO Recovered in guiMain application:", r) log.Log(WARN, "Recovered from panic:", r) log.Log(WARN, "Stack trace:") debug.PrintStack() me.myTree.SendToolkitPanic() return } }() ui.Main(func() { // this is a bad hack for now. // a better way would be to spawn ui.Main on the first actual window // that is supposed to be displayed placeholderUI() // if nothing is working, run this instead to make // sure you have something // demoUI() }) } func Init() { log.Log(WARN, "Init() TODO: move init() to here") } // This is important. This sets the defaults for the gui. Without this, there isn't correct padding, etc func init() { log.Log(INFO, "Init() START") log.Log(INFO, "Init()") // Can you pass values to a plugin init() ? Otherwise, there is no way to safely print // log.Log(INFO, "init() Setting defaultBehavior = true") // setDefaultBehavior(true) me.myTree = tree.New() me.myTree.PluginName = "andlabs" // me.myTree.ActionFromChannel = queueMain me.myTree.NodeAction = queueAction me.myTree.Add = queueAdd me.myTree.SetTitle = queueSetTitle me.myTree.SetLabel = queueSetLabel me.myTree.SetText = queueSetText me.myTree.AddText = queueAddText me.myTree.SetChecked = queueSetChecked me.myTree.ToolkitClose = queueToolkitClose // TODO: this is messed up. run ui.Main() from the first add? Initialize it with an empty thing first? // fake out the OS toolkit by making a fake window. This is probably needed for macos & windows // actually, this probably breaks the macos build go guiMain() } func main() { }