diff options
| author | Jeff Carr <[email protected]> | 2023-12-14 10:36:56 -0600 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2023-12-14 10:36:56 -0600 |
| commit | 282119d970faed3f8a60d5105a2f26ee14681ff4 (patch) | |
| tree | 1680731c899f0e147487b9ba4d50ace2f3e96eb1 /toolkit/gocui/click.go | |
| parent | 9d075afb1df62276dea06be4a188eaee8fc69420 (diff) | |
tabs, windows + gocui dropdown menu (almost)
dropdown menu figures out what text was clicked
dropdown menu movement changes line colors
dropdown menus force user to select a response
accidentally committed a binary
tab selection works
tab and window views almost working
tabs and windows almost working
window widgets selection works
better color handling
using gocui view.Visable flag
removal of old color setting code
still need an artificial delay for andlabs SetText()
catching more 'nil' errors
fixed the stupid duplicate tab problem in andlabs
figured out how andlabs had a tab/box mess
works on more than one domain
builds and runs again
debugging double tabs in andlabs gui
GO111MODULE compile notes
code reorg
further improvements
example cloudflare app does first successful dns update
add NewEntryLine() for single line entry boxes
Signed-off-by: Jeff Carr <[email protected]>
Diffstat (limited to 'toolkit/gocui/click.go')
| -rw-r--r-- | toolkit/gocui/click.go | 169 |
1 files changed, 121 insertions, 48 deletions
diff --git a/toolkit/gocui/click.go b/toolkit/gocui/click.go index 380b0a3..cb58bc3 100644 --- a/toolkit/gocui/click.go +++ b/toolkit/gocui/click.go @@ -1,17 +1,23 @@ package main import ( + "fmt" "github.com/awesome-gocui/gocui" "git.wit.org/wit/gui/toolkit" ) // set isCurrent = false everywhere -func UnsetCurrent(n *node) { +func unsetCurrent(n *node) { w := n.tk w.isCurrent = false + if n.WidgetType == toolkit.Tab { + // n.tk.color = &colorTab + // n.setColor() + } + for _, child := range n.children { - UnsetCurrent(child) + unsetCurrent(child) } } @@ -22,7 +28,14 @@ func (n *node) updateCurrent() { log("updateCurrent()", n.Name) if n.WidgetType == toolkit.Tab { if n.IsCurrent() { + // n.tk.color = &colorActiveT + n.setColor(&colorActiveT) + n.hideView() + n.showView() setCurrentTab(n) + } else { + // n.tk.color = &colorTab + // n.setColor() } return } @@ -47,7 +60,7 @@ func setCurrentWindow(n *node) { if n.WidgetType != toolkit.Window { return } - UnsetCurrent(me.rootNode) + unsetCurrent(me.rootNode) if n.hasTabs { // set isCurrent = true on the first tab @@ -66,7 +79,7 @@ func setCurrentTab(n *node) { if n.WidgetType != toolkit.Tab { return } - UnsetCurrent(me.rootNode) + unsetCurrent(me.rootNode) w.isCurrent = true p := n.parent.tk p.isCurrent = true @@ -83,14 +96,51 @@ func (n *node) doWidgetClick() { // me.rootNode.redoColor(true) me.rootNode.dumpTree(true) case toolkit.Window: - me.rootNode.hideWidgets() + if (me.currentWindow == n) { + return + } + if (me.currentWindow != nil) { + unsetCurrent(me.currentWindow) + me.currentWindow.setColor(&colorWindow) + me.currentWindow.hideWidgets() + } + n.hideWidgets() + me.currentWindow = n + // setCurrentWindow(n) // probably delete this + n.setColor(&colorActiveW) n.redoTabs(me.TabW, me.TabH) + for _, child := range n.children { + if (child.currentTab == true) { + log(true, "FOUND CURRENT TAB", child.Name) + setCurrentTab(child) + child.placeWidgets(me.RawW, me.RawH) + child.showWidgets() + return + } + } + /* FIXME: redo this if ! n.hasTabs { - setCurrentWindow(n) - n.placeWidgets(me.RawW, me.RawH) - n.showWidgets() } + */ case toolkit.Tab: + if (n.IsCurrent()) { + return // do nothing if you reclick on the already selected tab + } + // find the window and disable the active tab + p := n.parent + if (p != nil) { + p.hideWidgets() + p.redoTabs(me.TabW, me.TabH) + unsetCurrent(p) + for _, child := range p.children { + if child.WidgetType == toolkit.Tab { + child.setColor(&colorTab) + n.currentTab = false + } + } + } + n.currentTab = true + n.setColor(&colorActiveT) setCurrentTab(n) n.placeWidgets(me.RawW, me.RawH) n.showWidgets() @@ -118,6 +168,50 @@ func (n *node) doWidgetClick() { n.toggleTree() case toolkit.Button: n.doUserEvent() + case toolkit.Dropdown: + log(true, "do the dropdown here") + if (me.ddview == nil) { + me.ddview = addDropdown() + tk := me.ddview.tk + 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, "example.com\nwit.org\nwit.com") + me.ddview.SetVisible(true) + return + } + log(true, "doWidgetClick() visible =", me.ddview.Visible()) + if (me.ddview.Visible()) { + me.ddview.SetVisible(false) + me.baseGui.DeleteView("ddview") + me.ddview.tk.v = nil + } else { + var dnsList string + for i, s := range n.vals { + log(logNow, "AddText()", n.Name, i, s) + dnsList += s + "\n" + } + me.ddNode = n + log(logNow, "new dns list should be set to:", dnsList) + me.ddview.Text = dnsList + me.ddview.SetText(dnsList) + me.ddview.SetVisible(true) + } + for i, s := range n.vals { + log(logNow, "AddText()", n.Name, i, s) + } default: } } @@ -162,26 +256,15 @@ func click(g *gocui.Gui, v *gocui.View) error { n := findUnderMouse() if (n != nil) { log(logNow, "click() Found widget =", n.WidgetId, n.Name, ",", n.Text) + if (n.Name == "DropBox") { + log(logNow, "click() this is the dropdown menu. set a flag here what did I click? where is the mouse?") + log(logNow, "click() set a global dropdown clicked flag=true here") + me.ddClicked = true + } n.doWidgetClick() } else { log(logNow, "click() could not find node name =", v.Name()) } - /* - i, err := strconv.Atoi(v.Name()) - if (err != nil) { - log(logError, "click() Can't find widget. error =", err) - } else { - log(logVerbose, "click() ok v.Name() =", v.Name()) - n := me.rootNode.findWidgetId(i) - if (n == nil) { - log(logError, "click() CANT FIND VIEW in binary tree. v.Name =", v.Name()) - return nil - } - log(logNow, "click() Found widget =", n.WidgetId, n.Name, ",", n.Text) - n.doWidgetClick() - return nil - } - */ if _, err := g.SetCurrentView(v.Name()); err != nil { return err @@ -207,6 +290,17 @@ func findUnderMouse() *node { found = n } } + if (n == me.ddview) { + log(true, "findUnderMouse() found ddview") + if n.Visible() { + log(true, "findUnderMouse() and ddview is visable. hide it here. TODO: find highlighted row") + found = n + // find the actual value here and set the dropdown widget + me.baseGui.DeleteView("ddview") + } else { + log(true, "findUnderMouse() I was lying, actually it's not found") + } + } for _, child := range n.children { f(child) @@ -217,7 +311,7 @@ func findUnderMouse() *node { // TODO: pop up menu with a list of them for _, n := range widgets { //log(logNow, "ctrlDown() FOUND widget", widget.id, widget.name) - n.showWidgetPlacement(logNow, "ctrlDown() FOUND") + n.showWidgetPlacement(logNow, "findUnderMouse() FOUND") } return found } @@ -228,27 +322,6 @@ func ctrlDown(g *gocui.Gui, v *gocui.View) error { // var widgets []*node // var f func (n *node) found = findUnderMouse() - /* - w, h := g.MousePosition() - - // find buttons that are below where the mouse button click - f = func(n *node) { - widget := n.tk - // ignore widgets that are not visible - if n.Visible() { - if ((widget.gocuiSize.w0 <= w) && (w <= widget.gocuiSize.w1) && - (widget.gocuiSize.h0 <= h) && (h <= widget.gocuiSize.h1)) { - widgets = append(widgets, n) - found = n - } - } - - for _, child := range n.children { - f(child) - } - } - f(me.rootNode) - */ if (me.ctrlDown == nil) { setupCtrlDownWidget() me.ctrlDown.Text = found.Name @@ -266,9 +339,9 @@ func ctrlDown(g *gocui.Gui, v *gocui.View) error { cd.gocuiSize.w1 = newR.w1 cd.gocuiSize.h1 = newR.h1 if me.ctrlDown.Visible() { - me.ctrlDown.deleteView() + me.ctrlDown.hideView() } else { - me.ctrlDown.updateView() + me.ctrlDown.showView() } me.ctrlDown.showWidgetPlacement(logNow, "ctrlDown:") return nil |
