From a75f0be4608991a85022981b3e033970ce40abb3 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Thu, 13 Feb 2025 17:52:43 -0600 Subject: [PATCH] a simpler time --- action.go | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ init.go | 68 +----------------------------------------- structs.go | 32 +++++++++++--------- 3 files changed, 106 insertions(+), 81 deletions(-) create mode 100644 action.go diff --git a/action.go b/action.go new file mode 100644 index 0000000..3ae03e4 --- /dev/null +++ b/action.go @@ -0,0 +1,87 @@ +// Although most code from WIT.COM Inc is under the GPL +// This code is more generic because it must be able +// to be used in any GUI plugin + +package tree + +import ( + "go.wit.com/log" + "go.wit.com/widget" +) + +// everything from the application goes through here +func (me *TreeInfo) doAction(a widget.Action) { + n := treeRoot.FindWidgetId(a.WidgetId) + switch a.ActionType { + case widget.Add: + if n == nil { + n := me.AddNode(&a) + me.Add(n) + return + } + log.Log(TREEWARN, "attempting to re-add widget", a.WidgetId, a.WidgetType, a.ActionType) + return + } + if n == nil { + // log.Log(TREEWARN, "tree.FindWidgetId() n == nil", a.WidgetId, a.WidgetType, a.ActionType) + // log.Log(TREEWARN, "tree.FindWidgetId() n == nil", a.State.CurrentS) + // log.Log(TREEWARN, "tree.FindWidgetId() n == nil. A bug in your application?") + log.Log(TREEWARN, "tree.doAction() bug in gui. trying to do action", a.ActionType, "before widget init() wId =", a.WidgetId) + return + } + + switch a.ActionType { + case widget.SetText: + log.Log(TREE, "tree.SetText() a.State.CurrentS =", a.State.CurrentS) + log.Log(TREE, "tree.SetText() a.State.DefaultS =", a.State.DefaultS) + log.Log(TREE, "tree.SetText() a.State.NewString =", a.State.NewString) + switch n.WidgetType { + case widget.Dropdown: + me.SetText(n, a.State.NewString) + case widget.Combobox: + me.SetText(n, a.State.NewString) + case widget.Textbox: + me.SetText(n, a.State.NewString) + case widget.Window: + me.SetTitle(n, a.State.Label) + default: + // buttons, checkboxes, groups, etc + me.SetLabel(n, a.State.Label) + } + case widget.AddText: + switch n.WidgetType { + case widget.Dropdown: + n.ddStrings = append(n.ddStrings, a.State.NewString) + me.AddText(n, a.State.NewString) + case widget.Combobox: + n.ddStrings = append(n.ddStrings, a.State.NewString) + me.AddText(n, a.State.NewString) + default: + log.Log(TREEWARN, "AddText() not supported on widget", n.WidgetType, n.String()) + } + case widget.Checked: + switch n.WidgetType { + case widget.Checkbox: + if me.SetChecked == nil { + log.Log(TREEWARN, "SetChecked() == nil in toolkit", me.PluginName) + } else { + me.SetChecked(n, a.State.Checked) + } + default: + log.Log(TREEWARN, "SetChecked() not supported on widget", n.WidgetType, n.String()) + } + case widget.Show: + n.State.Hidden = false + me.Show(n) + case widget.Hide: + n.State.Hidden = true + me.Hide(n) + case widget.Enable: + me.Enable(n) + case widget.Disable: + me.Disable(n) + default: + log.Log(TREEWARN, "tree.Action() unknown action", a.ActionType, "on wId", a.WidgetId) + // me.NodeAction(n, a.ActionType) + } +} diff --git a/init.go b/init.go index 0a94b3e..1896031 100644 --- a/init.go +++ b/init.go @@ -16,72 +16,6 @@ import ( var muAction sync.Mutex -// TODO: add checks for nil function pointers -func (me *TreeInfo) newAction(a widget.Action) { - n := treeRoot.FindWidgetId(a.WidgetId) - switch a.ActionType { - case widget.Add: - if n == nil { - n := me.AddNode(&a) - me.Add(n) - return - } - log.Log(TREEWARN, "attempting to re-add widget", a.WidgetId, a.WidgetType, a.ActionType) - return - } - if n == nil { - // log.Log(TREEWARN, "tree.FindWidgetId() n == nil", a.WidgetId, a.WidgetType, a.ActionType) - // log.Log(TREEWARN, "tree.FindWidgetId() n == nil", a.State.CurrentS) - // log.Log(TREEWARN, "tree.FindWidgetId() n == nil. This should not happen. Bug in gui or tree package?") - // log.Log(TREEWARN, "tree.FindWidgetId() n == nil. A bug in your application?") - return - } - - switch a.ActionType { - case widget.SetText: - log.Log(TREE, "tree.SetText() a.State.CurrentS =", a.State.CurrentS) - log.Log(TREE, "tree.SetText() a.State.DefaultS =", a.State.DefaultS) - log.Log(TREE, "tree.SetText() a.State.NewString =", a.State.NewString) - switch n.WidgetType { - case widget.Dropdown: - me.SetText(n, a.State.NewString) - case widget.Combobox: - me.SetText(n, a.State.NewString) - case widget.Textbox: - me.SetText(n, a.State.NewString) - case widget.Window: - me.SetTitle(n, a.State.Label) - default: - // buttons, checkboxes, groups, etc - me.SetLabel(n, a.State.Label) - } - case widget.AddText: - switch n.WidgetType { - case widget.Dropdown: - n.ddStrings = append(n.ddStrings, a.State.NewString) - me.AddText(n, a.State.NewString) - case widget.Combobox: - n.ddStrings = append(n.ddStrings, a.State.NewString) - me.AddText(n, a.State.NewString) - default: - log.Log(TREEWARN, "AddText() not supported on widget", n.WidgetType, n.String()) - } - case widget.Checked: - switch n.WidgetType { - case widget.Checkbox: - if me.SetChecked == nil { - log.Log(TREEWARN, "SetChecked() == nil in toolkit", me.PluginName) - } else { - me.SetChecked(n, a.State.Checked) - } - default: - log.Log(TREEWARN, "SetChecked() not supported on widget", n.WidgetType, n.String()) - } - default: - me.NodeAction(n, a.ActionType) - } -} - func (me *TreeInfo) catchActionChannel() { defer func() { if r := recover(); r != nil { @@ -102,7 +36,7 @@ func (me *TreeInfo) catchActionChannel() { case a := <-me.pluginChan: log.Verbose("catchActionChannel() on ", a.WidgetId, a.WidgetType, a.ProgName) muAction.Lock() - me.newAction(a) + me.doAction(a) muAction.Unlock() } } diff --git a/structs.go b/structs.go index 6b7516d..06730b7 100644 --- a/structs.go +++ b/structs.go @@ -17,21 +17,25 @@ import ( var treeRoot *Node type TreeInfo struct { - ok bool // indicates the plugin actually initialized - PluginName string // used to identify the plugin - config *ToolkitConfigs // protobuf of plugin settings - callback chan widget.Action // mouse clicks or keyboard events back to the program - pluginChan chan widget.Action // this is the channel we get requests to make widgets - NodeAction func(*Node, widget.ActionType) // deprecate - Add func(*Node) // add a new widget - AddText func(*Node, string) // add a string to a dropdown widget - SetText func(*Node, string) // set the text of a widget - SetTitle func(*Node, string) // update the title of a window or tab - SetLabel func(*Node, string) // update the "label" (aka "Name") for a widget - SetChecked func(*Node, bool) // set the state of a checkbox - ToolkitClose func() // shutdown and unload the plugin - ShowTable func(*Node) // attempt at sending a whole table + ok bool // indicates the plugin actually initialized + PluginName string // used to identify the plugin + config *ToolkitConfigs // protobuf of plugin settings + callback chan widget.Action // mouse clicks or keyboard events back to the program + pluginChan chan widget.Action // this is the channel we get requests to make widgets + Add func(*Node) // add a new widget + AddText func(*Node, string) // add a string to a dropdown widget + SetText func(*Node, string) // set the text of a widget + SetTitle func(*Node, string) // update the title of a window or tab + SetLabel func(*Node, string) // update the "label" (aka "Name") for a widget + SetChecked func(*Node, bool) // set the state of a checkbox + ToolkitClose func() // shutdown and unload the plugin + ShowTable func(*Node) // attempt at sending a whole table + Show func(*Node) // show a widget + Hide func(*Node) // hide a widget + Enable func(*Node) // enable a widget + Disable func(*Node) // disable a widget // NodeI interface{} // is an interface useful here? + // NodeAction func(*Node, widget.ActionType) // deprecate } type Node struct {