diff options
Diffstat (limited to 'toolkit/gocui/click.go')
| -rw-r--r-- | toolkit/gocui/click.go | 297 |
1 files changed, 147 insertions, 150 deletions
diff --git a/toolkit/gocui/click.go b/toolkit/gocui/click.go index 8802674..380b0a3 100644 --- a/toolkit/gocui/click.go +++ b/toolkit/gocui/click.go @@ -1,278 +1,275 @@ package main import ( - // "fmt" - // "errors" - "strconv" - "strings" - "github.com/awesome-gocui/gocui" "git.wit.org/wit/gui/toolkit" ) // set isCurrent = false everywhere -func UnsetCurrent(w *cuiWidget) { +func UnsetCurrent(n *node) { + w := n.tk w.isCurrent = false - for _, child := range w.children { + for _, child := range n.children { UnsetCurrent(child) } } -func updateCurrentTabs() { - me.rootNode.nextW = 0 - me.rootNode.nextH = 0 - me.rootNode.redoTabs(true) -} - // when adding a new widget, this will update the display // of the current widgets if that widget is supposed // to be in current display -func (w *cuiWidget) updateCurrent() { - if w.widgetType == toolkit.Tab { - if w.IsCurrent() { - setCurrentTab(w) +func (n *node) updateCurrent() { + log("updateCurrent()", n.Name) + if n.WidgetType == toolkit.Tab { + if n.IsCurrent() { + setCurrentTab(n) } return } - if w.widgetType == toolkit.Window { - if w.IsCurrent() { - setCurrentWindow(w) + if n.WidgetType == toolkit.Window { + if n.IsCurrent() { + // setCurrentWindow(n) } return } - if w.widgetType == toolkit.Root { + if n.WidgetType == toolkit.Root { return } - w.parent.updateCurrent() + n.parent.updateCurrent() } // shows the widgets in a window -func setCurrentWindow(w *cuiWidget) { - if w.widgetType != toolkit.Window { +func setCurrentWindow(n *node) { + if n.IsCurrent() { + return + } + w := n.tk + if n.WidgetType != toolkit.Window { return } UnsetCurrent(me.rootNode) - me.rootNode.hideWidgets() - - // THIS IS THE BEGINING OF THE LAYOUT - me.rootNode.nextW = 0 - me.rootNode.nextH = 0 - w.isCurrent = true - if w.hasTabs { + if n.hasTabs { // set isCurrent = true on the first tab - for _, child := range w.children { - child.isCurrent = true + for _, child := range n.children { + child.tk.isCurrent = true break } + } else { + w.isCurrent = true } - me.rootNode.redoTabs(true) - - w.placeWidgets() - w.showWidgets() } // shows the widgets in a tab -func setCurrentTab(w *cuiWidget) { - if w.widgetType != toolkit.Tab { +func setCurrentTab(n *node) { + w := n.tk + if n.WidgetType != toolkit.Tab { return } - me.current = w UnsetCurrent(me.rootNode) - me.rootNode.hideWidgets() w.isCurrent = true - w.parent.isCurrent = true - updateCurrentTabs() - w.placeWidgets() - w.showWidgets() + p := n.parent.tk + p.isCurrent = true + log("setCurrent()", n.Name) } -func (w *cuiWidget) doWidgetClick() { - switch w.widgetType { +func (n *node) doWidgetClick() { + switch n.WidgetType { case toolkit.Root: // THIS IS THE BEGINING OF THE LAYOUT - me.rootNode.nextW = 0 - me.rootNode.nextH = 0 - me.rootNode.redoTabs(true) + log("doWidgetClick()", n.Name) + redoWindows(0,0) case toolkit.Flag: // me.rootNode.redoColor(true) me.rootNode.dumpTree(true) case toolkit.Window: - setCurrentWindow(w) + me.rootNode.hideWidgets() + n.redoTabs(me.TabW, me.TabH) + if ! n.hasTabs { + setCurrentWindow(n) + n.placeWidgets(me.RawW, me.RawH) + n.showWidgets() + } case toolkit.Tab: - setCurrentTab(w) + setCurrentTab(n) + n.placeWidgets(me.RawW, me.RawH) + n.showWidgets() case toolkit.Group: - w.placeWidgets() - w.toggleTree() + // n.placeWidgets(p.tk.startH, newH) + n.toggleTree() case toolkit.Checkbox: - if (w.b) { - w.setCheckbox(false) + if (n.B) { + n.setCheckbox(false) } else { - w.setCheckbox(true) + n.setCheckbox(true) } - w.doUserEvent() + n.doUserEvent() case toolkit.Grid: - me.rootNode.hideWidgets() - w.placeGrid() - w.showWidgets() + n.placeGrid(n.tk.size.w0, n.tk.size.h0) + n.showWidgets() case toolkit.Box: // w.showWidgetPlacement(logNow, "drawTree()") - if (w.horizontal) { - log("BOX IS HORIZONTAL", w.name) + if (n.horizontal) { + log("BOX IS HORIZONTAL", n.Name) } else { - log("BOX IS VERTICAL", w.name) + log("BOX IS VERTICAL", n.Name) } - w.placeWidgets() - w.toggleTree() + // n.placeWidgets() + n.toggleTree() case toolkit.Button: - w.doUserEvent() + n.doUserEvent() default: } } -// this passes the user event back from the plugin -func (w *cuiWidget) doUserEvent() { - if (me.callback == nil) { - log(logError, "doUserEvent() no callback channel was configured") - return - } - var a toolkit.Action - a.WidgetId = w.id - a.Name = w.name - a.Text = w.text - a.B = w.b - a.ActionType = toolkit.User - me.callback <- a - log(logNow, "END: sent a button click callback()") -} - var toggle bool = true -func (w *cuiWidget) toggleTree() { +func (n *node) toggleTree() { if (toggle) { - w.drawTree(toggle) + n.drawTree(toggle) toggle = false } else { - w.hideWidgets() + n.hideWidgets() toggle = true } } // display the widgets in the binary tree -func (w *cuiWidget) drawTree(draw bool) { +func (n *node) drawTree(draw bool) { + w := n.tk if (w == nil) { return } - w.showWidgetPlacement(logNow, "drawTree()") + n.showWidgetPlacement(logNow, "drawTree()") if (draw) { // w.textResize() - w.showView() + n.showView() } else { - w.deleteView() + n.deleteView() } - for _, child := range w.children { + for _, child := range n.children { child.drawTree(draw) } } func click(g *gocui.Gui, v *gocui.View) error { // var l string - var err error + // var err error - log(logNow, "click() START", v.Name()) + log(logVerbose, "click() START", v.Name()) + // n := me.rootNode.findWidgetName(v.Name()) + n := findUnderMouse() + if (n != nil) { + log(logNow, "click() Found widget =", n.WidgetId, n.Name, ",", n.Text) + n.doWidgetClick() + } else { + log(logNow, "click() could not find node name =", v.Name()) + } + /* i, err := strconv.Atoi(v.Name()) if (err != nil) { - log(logNow, "click() Can't find widget. error =", err) + log(logError, "click() Can't find widget. error =", err) } else { - log(logNow, "click() ok v.Name() =", v.Name()) - w := findWidget(i, me.rootNode) - if (w == nil) { + 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 =", w.id, w.name, ",", w.text) - w.doWidgetClick() + 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 } - /* - _, cy := v.Cursor() - if l, err = v.Line(cy); err != nil { - l = "" - } - - maxX, maxY := g.Size() - if v, err := g.SetView("msg", maxX/2-10, maxY/2, maxX/2+10, maxY/2+2, 0); err == nil || errors.Is(err, gocui.ErrUnknownView) { - v.Clear() - v.SelBgColor = gocui.ColorCyan - v.SelFgColor = gocui.ColorBlack - fmt.Fprintln(v, l) - } - */ - - // this seems to delete the button(?) - // g.SetViewOnBottom(v.Name()) - log(logNow, "click() END") + log(logVerbose, "click() END") return nil } +func findUnderMouse() *node { + var found *node + var widgets []*node + var f func (n *node) + w, h := me.baseGui.MousePosition() -// display the widgets in the binary tree + // 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) + // 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) + n.showWidgetPlacement(logNow, "ctrlDown() FOUND") + } + return found +} + +// find the widget under the mouse click func ctrlDown(g *gocui.Gui, v *gocui.View) error { - var found *cuiWidget - var widgets []*cuiWidget - var f func (widget *cuiWidget) + var found *node + // 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(widget *cuiWidget) { - // if ((widget.logicalSize.w0 < w) && (w < widget.logicalSize.w1)) { - if ((widget.gocuiSize.w0 <= w) && (w <= widget.gocuiSize.w1) && - (widget.gocuiSize.h0 <= h) && (h <= widget.gocuiSize.h1)) { - widgets = append(widgets, widget) - found = widget + 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 widget.children { + for _, child := range n.children { f(child) } } f(me.rootNode) - var t string - for _, widget := range widgets { - // log(logNow, "ctrlDown() FOUND widget", widget.id, widget.name) - t += widget.cuiName + " " + widget.name + "\n" - widget.showWidgetPlacement(logNow, "ctrlDown() FOUND") - } - t = strings.TrimSpace(t) + */ if (me.ctrlDown == nil) { setupCtrlDownWidget() - me.ctrlDown.text = "ctrlDown" // t - me.ctrlDown.cuiName = "ctrlDown" - me.ctrlDown.parent = me.rootNode + me.ctrlDown.Text = found.Name + me.ctrlDown.tk.cuiName = "ctrlDown" + // me.ctrlDown.parent = me.rootNode } + cd := me.ctrlDown.tk if (found == nil) { found = me.rootNode } - // ? TODO: found.setRealSize() - me.ctrlDown.gocuiSize.w0 = found.startW - me.ctrlDown.gocuiSize.h0 = found.startH - me.ctrlDown.gocuiSize.w1 = me.ctrlDown.gocuiSize.w0 + found.realWidth - me.ctrlDown.gocuiSize.h1 = me.ctrlDown.gocuiSize.h0 + found.realHeight - if (me.ctrlDown.v == nil) { - me.ctrlDown.text = found.text - me.ctrlDown.showWidgetPlacement(logNow, "ctrlDown:") - me.ctrlDown.showView() - } else { + me.ctrlDown.Text = found.Name + newR := found.realGocuiSize() + cd.gocuiSize.w0 = newR.w0 + cd.gocuiSize.h0 = newR.h0 + cd.gocuiSize.w1 = newR.w1 + cd.gocuiSize.h1 = newR.h1 + if me.ctrlDown.Visible() { me.ctrlDown.deleteView() + } else { + me.ctrlDown.updateView() } - - log(logNow, "ctrlDown()", w, h) + me.ctrlDown.showWidgetPlacement(logNow, "ctrlDown:") return nil } |
