diff options
| author | Jeff Carr <[email protected]> | 2024-02-02 11:07:56 -0600 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2024-02-02 11:07:56 -0600 |
| commit | d6f1a45c77ca5f8fd92522166c488938797b706b (patch) | |
| tree | 39829cd2af37a1ef475868c873ed8ce59fb2b837 | |
| parent | dddef229dcab1cd2c5ab7101dc5a4781478c0a62 (diff) | |
rename dropdown related variables
Signed-off-by: Jeff Carr <[email protected]>
| -rw-r--r-- | add.go | 4 | ||||
| -rw-r--r-- | click.go | 115 | ||||
| -rw-r--r-- | dropdown.go | 122 | ||||
| -rw-r--r-- | mouse.go | 13 | ||||
| -rw-r--r-- | structs.go | 16 |
5 files changed, 91 insertions, 179 deletions
@@ -51,8 +51,8 @@ func addWidget(n *tree.Node) { wRoot.redoWindows(0, 0) // TODO: record the first window here? // do initial setup of helper widgets here: - if me.ddview == nil { - me.ddview = makeDropdownView("addWidget() ddview") + if me.dropdownV == nil { + me.dropdownV = makeDropdownView("addWidget() ddview") } return case widget.Tab: @@ -1,9 +1,10 @@ package main import ( + "errors" + "github.com/awesome-gocui/gocui" "go.wit.com/log" - "go.wit.com/toolkits/tree" "go.wit.com/widget" ) @@ -178,53 +179,13 @@ func (w *guiWidget) doWidgetClick() { w.toggleTree() case widget.Button: // doUserEvent(n) - me.myTree.SendUserEvent(w.node) + me.myTree.SendFromUser(w.node) case widget.Combobox: log.Log(NOW, "do the combobox here") - var ddItems string - for i, s := range w.vals { - log.Log(NOW, "ddItem:", w.String(), i, s) - ddItems += s + "\n" - } - if me.ddview == nil { - me.ddview = makeDropdownView(ddItems) - } - showDropdownItems(ddItems) - me.ddNode = w.node + w.showDropdown() case widget.Dropdown: log.Log(NOW, "do the dropdown here") - var ddItems string - for i, s := range w.vals { - log.Log(NOW, "ddItem:", w.String(), i, s) - ddItems += s + "\n" - } - /* - if me.ddview == nil { - me.ddview = makeDropdownView(ddItems) - } - */ - showDropdownItems(ddItems) - me.ddNode = w.node - /* - var tk *guiWidget - tk = me.ddview.TK.(*guiWidget) - log.Log(NOW, "doWidgetClick() visible =", tk.Visible()) - if tk.Visible() { - tk.SetVisible(false) - me.baseGui.DeleteView("ddview") - tk.v = nil - } else { - me.ddNode = w.node - log.Log(NOW, "new dns list should be set to:", ddItems) - tk.labelN = ddItems - tk.SetText(ddItems) - tk.SetVisible(true) - fmt.Fprint(tk.v, ddItems) - } - for i, s := range tk.vals { - log.Log(NOW, "AddText()", tk.String(), i, s) - } - */ + w.showDropdown() default: } } @@ -263,21 +224,18 @@ func click(g *gocui.Gui, v *gocui.View) error { // var l string // var err error - log.Log(INFO, "click() START", v.Name()) + log.Log(NOW, "click() START gocui name:", v.Name()) // n := me.rootNode.findWidgetName(v.Name()) - n := findUnderMouse() - var w *guiWidget - w = n.TK.(*guiWidget) - if w != nil { + w := findUnderMouse() + if w == nil { + log.Error(errors.New("click() could not find widget for view =" + v.Name())) + } else { log.Log(NOW, "click() Found widget =", w.node.WidgetId, w.String(), ",", w.labelN) if w.String() == "DropBox" { log.Log(NOW, "click() this is the dropdown menu. set a flag here what did I click? where is the mouse?") log.Log(NOW, "click() set a global dropdown clicked flag=true here") - me.ddClicked = true } w.doWidgetClick() - } else { - log.Log(NOW, "click() could not find node name =", v.Name()) } if _, err := g.SetCurrentView(v.Name()); err != nil { @@ -285,55 +243,57 @@ func click(g *gocui.Gui, v *gocui.View) error { return err } - log.Log(NOW, "click() END") + log.Log(NOW, "click() END gocui name:", v.Name()) return nil } -func findUnderMouse() *tree.Node { - var found *tree.Node - var widgets []*tree.Node - var f func(n *tree.Node) +func findUnderMouse() *guiWidget { + var widgets []*guiWidget + var f func(w *guiWidget) w, h := me.baseGui.MousePosition() - ddTK := me.ddview.TK.(*guiWidget) // if the dropdown view is visable, close it - if ddTK.Visible() { - ddTK.dropdownClicked(w, h) - return me.ddview + if me.dropdownV.Visible() { + me.dropdownV.dropdownClicked(w, h) + return me.dropdownV } // find buttons that are below where the mouse button click - f = func(n *tree.Node) { - var widget *guiWidget - widget = n.TK.(*guiWidget) - + f = func(widget *guiWidget) { // ignore widgets that are not visible if widget.Visible() { if (widget.gocuiSize.w0 <= w) && (w <= widget.gocuiSize.w1) && (widget.gocuiSize.h0 <= h) && (h <= widget.gocuiSize.h1) { - widgets = append(widgets, n) - found = n + widgets = append(widgets, widget) } } for _, child := range widget.children { - f(child.node) + f(child) } } - f(me.treeRoot) + rootW := me.treeRoot.TK.(*guiWidget) + f(rootW) + + var found *guiWidget // widgets has everything that matches - // TODO: pop up menu with a list of them - for _, n := range widgets { - //log(logNow, "ctrlDown() FOUND widget", widget.id, widget.name) - widget := n.TK.(*guiWidget) - widget.showWidgetPlacement("findUnderMouse() FOUND") + for _, w := range widgets { + w.showWidgetPlacement("findUnderMouse() FOUND") + // prioritize window buttons. This means if some code covers + // up the window widgets, then it will ignore everything else + // and allow the user (hopefully) to redraw or switch windows + // TODO: display the window widgets on top + if w.WidgetType == widget.Window { + return w + } + found = w } return found } // find the widget under the mouse click func ctrlDown(g *gocui.Gui, v *gocui.View) error { - var found *tree.Node + var found *guiWidget // var widgets []*node // var f func (n *node) found = findUnderMouse() @@ -349,11 +309,10 @@ func ctrlDown(g *gocui.Gui, v *gocui.View) error { var tk *guiWidget tk = me.ctrlDown.TK.(*guiWidget) if found == nil { - found = me.treeRoot + found = me.treeRoot.TK.(*guiWidget) } tk.labelN = found.String() - foundtk := found.TK.(*guiWidget) - newR := foundtk.realGocuiSize() + newR := found.realGocuiSize() tk.gocuiSize.w0 = newR.w0 tk.gocuiSize.h0 = newR.h0 tk.gocuiSize.w1 = newR.w1 diff --git a/dropdown.go b/dropdown.go index a12a929..cb0f38d 100644 --- a/dropdown.go +++ b/dropdown.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "strings" "github.com/awesome-gocui/gocui" log "go.wit.com/log" @@ -10,7 +9,7 @@ import ( "go.wit.com/widget" ) -func makeDropdownView(ddItems string) *tree.Node { +func makeDropdownView(ddItems string) *guiWidget { newNode := addDropdown() tk := newNode.TK.(*guiWidget) tk.labelN = ddItems @@ -25,40 +24,14 @@ func makeDropdownView(ddItems string) *tree.Node { tk.gocuiSize.w1, tk.gocuiSize.h1, 0) if tk.v == nil { - return newNode + return tk } tk.v.Wrap = true tk.v.Frame = true tk.v.Clear() fmt.Fprint(tk.v, ddItems) tk.SetVisible(true) - return newNode -} - -func makeDropdownViewOrig() { - if me.ddview != nil { - return - } - me.ddview = addDropdown() - // n.TK = initWidget(n) - var tk *guiWidget - tk = me.ddview.TK.(*guiWidget) - tk.gocuiSize.w0 = 20 - tk.gocuiSize.w1 = 40 - tk.gocuiSize.h0 = 10 - tk.gocuiSize.h1 = 25 - tk.v, _ = me.baseGui.SetView("ddview", - tk.gocuiSize.w0, - tk.gocuiSize.h0, - tk.gocuiSize.w1, - tk.gocuiSize.h1, 0) - if tk.v == nil { - return - } - tk.v.Wrap = true - tk.v.Frame = true - tk.v.Clear() - fmt.Fprint(tk.v, tk.labelN) + return tk } func addDropdown() *tree.Node { @@ -93,13 +66,14 @@ func addDropdown() *tree.Node { return n } -func showDropdownItems(ddItems string) { - for i, s := range strings.Split(ddItems, "\n") { - log.Log(NOW, "showDropdownItems() found =", i, s) +func (tk *guiWidget) showDropdown() { + var ddItems string + for i, s := range tk.vals { + log.Log(NOW, "showDropdown()", tk.String(), i, s) + ddItems += s + "\n" } - var tk *guiWidget - tk = me.ddview.TK.(*guiWidget) - log.Log(NOW, "doWidgetClick() visible =", tk.Visible()) + + log.Log(NOW, "showDropdown() visible =", tk.Visible()) if tk.Visible() { tk.SetVisible(false) me.baseGui.DeleteView("ddview") @@ -115,43 +89,41 @@ func showDropdownItems(ddItems string) { } func dropdownClicked(mouseX, mouseH int) { - tk := me.ddview.TK.(*guiWidget) + tk := me.dropdownV if tk.Visible() { log.Log(NOW, "hide DDview() Mouse really down at:", mouseX, mouseH) hideDDview() } else { log.Log(NOW, "show DDview() Mouse really down at:", mouseX, mouseH) + log.Log(NOW, "can you see the dropdown menu right now?") + log.Log(NOW, "if so, something is wrong. I think you can't see it") showDDview() } } func hideDDview() error { - var tk *guiWidget - tk = me.ddview.TK.(*guiWidget) w, h := me.baseGui.MousePosition() log.Log(NOW, "hide dropdown menu() view msgMouseDown (w,h) =", w, h) - if me.ddview == nil { + if me.dropdownV == nil { return gocui.ErrUnknownView } - if tk.v == nil { + if me.dropdownV.v == nil { return gocui.ErrUnknownView } - tk.SetVisible(false) + me.dropdownV.SetVisible(false) return nil } func showDDview() error { w, h := me.baseGui.MousePosition() log.Log(NOW, "show dropdown menu() view msgMouseDown (w,h) =", w, h) - if me.ddview == nil { + if me.dropdownV == nil { return gocui.ErrUnknownView } - var tk *guiWidget - tk = me.ddview.TK.(*guiWidget) - if tk.v == nil { + if me.dropdownV.v == nil { return gocui.ErrUnknownView } - tk.SetVisible(true) + me.dropdownV.SetVisible(true) return nil } @@ -168,38 +140,32 @@ func (w *guiWidget) dropdownClicked(mouseW, mouseH int) { } func dropdownUnclicked(mouseX, mouseH int) { - tk := me.ddview.TK.(*guiWidget) + tk := me.dropdownV log.Log(NOW, "mouseUp() view msgMouseDown (check here for dropdown menu click) (w,h) =", mouseX, mouseH) - if me.ddClicked { - me.ddClicked = false - log.Log(NOW, "mouseUp() ddview is the thing that was clicked", mouseX, mouseH) - log.Log(NOW, "mouseUp() find out what the string is here", mouseX, mouseH, tk.gocuiSize.h1) + log.Log(NOW, "mouseUp() ddview is the thing that was clicked", mouseX, mouseH) + log.Log(NOW, "mouseUp() find out what the string is here", mouseX, mouseH, tk.gocuiSize.h1) - var newZone string = "" - if me.ddNode != nil { - var ddtk *guiWidget - ddtk = me.ddview.TK.(*guiWidget) - value := mouseH - tk.gocuiSize.h0 - 1 - log.Log(NOW, "mouseUp() me.ddview.tk.gocuiSize.h1 =", tk.gocuiSize.h1) - log.Log(NOW, "mouseUp() me.ddNode.vals =", ddtk.vals) - valsLen := len(ddtk.vals) - log.Log(NOW, "mouseUp() value =", value, "valsLen =", valsLen) - log.Log(NOW, "mouseUp() me.ddNode.vals =", ddtk.vals) - if (value >= 0) && (value < valsLen) { - newZone = ddtk.vals[value] - log.Log(NOW, "mouseUp() value =", value, "newZone =", newZone) - } - } - hideDDview() - if newZone != "" { - if me.ddNode != nil { - var ddtk *guiWidget - ddtk = me.ddview.TK.(*guiWidget) - ddtk.SetText(newZone) - ddtk.value = newZone - // me.ddNode.doUserEvent() - me.myTree.SendUserEvent(me.ddNode) - } - } + var newZone string = "" + if me.dropdownW == nil { + return } + // try to compute the line item clicked here + /* + var ddtk *guiWidget + ddtk = me.ddview.TK.(*guiWidget) + value := mouseH - tk.gocuiSize.h0 - 1 + log.Log(NOW, "mouseUp() me.ddview.tk.gocuiSize.h1 =", tk.gocuiSize.h1) + log.Log(NOW, "mouseUp() me.ddNode.vals =", ddtk.vals) + valsLen := len(ddtk.vals) + log.Log(NOW, "mouseUp() value =", value, "valsLen =", valsLen) + log.Log(NOW, "mouseUp() me.ddNode.vals =", ddtk.vals) + if (value >= 0) && (value < valsLen) { + newZone = ddtk.vals[value] + log.Log(NOW, "mouseUp() value =", value, "newZone =", newZone) + } + */ + // send the event the user selected something from the dropdown + hideDDview() + me.dropdownW.SetText(newZone) + me.myTree.SendUserEvent(me.dropdownW.node) } @@ -37,10 +37,6 @@ func msgDown(g *gocui.Gui, v *gocui.View) error { } func mouseUp(g *gocui.Gui, v *gocui.View) error { - if me.ddview == nil { - me.ddview = makeDropdownView("mouseUp unclick") - } - w, h := g.MousePosition() dropdownUnclicked(w, h) @@ -68,12 +64,9 @@ func mouseDown(g *gocui.Gui, v *gocui.View) error { } globalMouseDown = true maxX, _ := g.Size() - test := findUnderMouse() - msg := fmt.Sprintf("Mouse really down at: %d,%d", mx, my) + "foobar" - if test == me.ddview { - dropdownClicked(mx, my) - return nil - } + findUnderMouse() + msg := fmt.Sprintf("mouseDown() Mouse really down at: %d,%d", mx, my) + dropdownClicked(mx, my) x := mx - len(msg)/2 if x < 0 { x = 0 @@ -43,18 +43,12 @@ type config struct { currentWindow *tree.Node // this is the current tab or window to show logStdout *tree.Node // where to show STDOUT helpLabel *gocui.View - ddview *tree.Node // the gocui view to select dropdrown lists - ddClicked bool // the dropdown menu view was clicked - ddNode *tree.Node // the dropdown menu is for this widget - /* - // this is the channel we send user events like - // mouse clicks or keyboard events back to the program - callback chan toolkit.Action - - // this is the channel we get requests to make widgets - pluginChan chan toolkit.Action - */ + // this is a floating widget that we show whenever the user clicks on a + // dropdown menu or combobox + // the dropdown widget to select dropdrown lists + dropdownV *guiWidget + dropdownW *guiWidget // grab the dropdown choices from this widget // When the widget has a frame, like a button, it adds 2 lines runes on each side // so you need 3 char spacing in each direction to not have them overlap |
