summaryrefslogtreecommitdiff
path: root/treeWidget.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-01-31 09:02:35 -0600
committerJeff Carr <[email protected]>2025-01-31 13:47:45 -0600
commit9f38585892d08690dde1b67b9a01006af308a949 (patch)
tree6f1d57dbee43651a85f7104fbfe9b08bb22afab0 /treeWidget.go
parent1a1881aa4e39e256126972c0cbe7f0db93ee20ec (diff)
I'm trying to make this clearer to understand
Diffstat (limited to 'treeWidget.go')
-rw-r--r--treeWidget.go198
1 files changed, 198 insertions, 0 deletions
diff --git a/treeWidget.go b/treeWidget.go
new file mode 100644
index 0000000..d72f957
--- /dev/null
+++ b/treeWidget.go
@@ -0,0 +1,198 @@
+package main
+
+import (
+ "strconv"
+
+ "github.com/awesome-gocui/gocui"
+ "go.wit.com/log"
+ "go.wit.com/toolkits/tree"
+ "go.wit.com/widget"
+)
+
+func initWidget(n *tree.Node) *guiWidget {
+ var w *guiWidget
+ w = new(guiWidget)
+
+ w.node = n
+ w.cuiName = strconv.Itoa(w.node.WidgetId) + " TK"
+ w.WidgetType = n.WidgetType
+ w.labelN = n.State.Label
+ if w.labelN == "" {
+ // remove this debugging hack once things are stable and fixed
+ w.labelN = n.GetProgName()
+ }
+ w.frame = true
+ w.enable = n.State.Enable
+
+ if n.WidgetType == widget.Root {
+ log.Log(INFO, "setupWidget() FOUND ROOT w.id =", n.WidgetId)
+ }
+
+ if n.WidgetType == widget.Grid {
+ w.widths = make(map[int]int) // how tall each row in the grid is
+ w.heights = make(map[int]int) // how wide each column in the grid is
+ }
+
+ p := n.Parent
+ if p == nil {
+ log.Log(ERROR, "parent == nil", w.String(), n.WidgetId, w.WidgetType)
+ return w
+ }
+ if p.TK == nil {
+ log.Log(ERROR, "parent.TK == nil", w.String(), n.WidgetId, w.WidgetType)
+ return w
+ }
+
+ // set the parent and append to parent children
+ var ptk *guiWidget
+ ptk = p.TK.(*guiWidget)
+ w.parent = ptk
+ ptk.children = append(ptk.children, w)
+ return w
+}
+
+func setupCtrlDownWidget() {
+ a := new(widget.Action)
+ a.ProgName = "ctrlDown"
+ a.WidgetType = widget.Dialog
+ a.WidgetId = -1
+ a.ParentId = 0
+ // n := addNode(a)
+ n := me.myTree.AddNode(a)
+
+ me.ctrlDown = n
+}
+
+func (w *guiWidget) deleteView() {
+ // make sure the view isn't really there
+ log.Log(GOCUI, "deleteView()", w.cuiName, w.WidgetType, w.node.WidgetId)
+ me.baseGui.DeleteView(w.cuiName)
+ w.v = nil
+}
+
+func (w *guiWidget) IsCurrent() bool {
+ if w.node.WidgetType == widget.Tab {
+ return w.isCurrent
+ }
+ if w.node.WidgetType == widget.Window {
+ log.Log(GOCUI, "IsCurrent() found current window", w.cuiName, w.String())
+ log.Log(GOCUI, "IsCurrent() window w.isCurrent =", w.isCurrent)
+ return w.isCurrent
+ }
+ if w.node.WidgetType == widget.Root {
+ return false
+ }
+ return w.parent.IsCurrent()
+}
+
+func (tk *guiWidget) String() string {
+ return tk.node.String()
+}
+
+func (tk *guiWidget) Visible() bool {
+ if tk == nil {
+ return false
+ }
+ if tk.v == nil {
+ return false
+ }
+ tk.v.Visible = true
+ return true
+}
+
+func (w *guiWidget) Show() {
+ // always should the dropdown widget
+ if w == me.dropdownV {
+ me.dropdownV.drawView()
+ return
+ }
+
+ // don't display fake widgets
+ if w.isFake {
+ return
+ }
+
+ // if this isn't in the binary tree
+ // it's some internal widget so always display those
+ if w.node == nil {
+ w.drawView()
+ return
+ }
+
+ // always show window titles
+ if w.node.WidgetType == widget.Window {
+ w.drawView()
+ return
+ }
+
+ if w.node.WidgetType == widget.Dropdown {
+ log.Log(NOW, "Show() dropdown", w.cuiName, w.String())
+ log.Log(NOW, "Show() dropdown n.Strings() =", w.node.Strings())
+ }
+ if w.node.WidgetType == widget.Combobox {
+ log.Log(NOW, "Show() dropdown", w.cuiName, w.String())
+ log.Log(NOW, "Show() dropdown n.Strings() =", w.node.Strings())
+ }
+
+ // if the widget is not in the current displayed windo
+ // then ignore it
+ log.Log(GOCUI, "Show() widget =", w.cuiName, w.String())
+ log.Log(GOCUI, "Show() w.IsCurrent() returned", w.IsCurrent())
+ if !w.IsCurrent() {
+ log.Log(GOCUI, "Show() NOT drawing", w.cuiName, w.String())
+ return
+ }
+ log.Log(GOCUI, "Show() drawing", w.cuiName, w.String())
+
+ // finally, check if the widget State is hidden or not
+ if w.node.Hidden() {
+ // don't display hidden widgets
+ return
+ }
+
+ // okay, if you made it this far, then display the widget
+ w.drawView()
+}
+
+func (tk *guiWidget) Hide() {
+ tk.deleteView()
+}
+
+func (tk *guiWidget) SetVisible(b bool) {
+ if b {
+ tk.Show()
+ } else {
+ tk.Hide()
+ }
+}
+
+func (tk *guiWidget) findWidgetByName(name string) *guiWidget {
+ if tk.cuiName == name {
+ return tk
+ }
+ for _, child := range tk.children {
+ found := child.findWidgetByName(name)
+ if found != nil {
+ return found
+ }
+ }
+ return nil
+}
+
+func (tk *guiWidget) findWidgetByView(v *gocui.View) *guiWidget {
+ if tk.v == v {
+ return tk
+ }
+ if tk.cuiName == v.Name() {
+ log.Log(NOW, "findWidget() error. names are mismatched or out of sync", tk.cuiName)
+ log.Log(NOW, "findWidget() or maybe the view has been deleted")
+ // return tk
+ }
+ for _, child := range tk.children {
+ found := child.findWidgetByView(v)
+ if found != nil {
+ return found
+ }
+ }
+ return nil
+}