package main import ( "github.com/awesome-gocui/gocui" "go.wit.com/widget" ) // returns the widget under the location on the screen func findByXY(widget *guiWidget, w int, h int) []*guiWidget { var widgets []*guiWidget if !widget.Visible() { // ignore widgets that are not visible } else { // check the location to see if this is under (W,H) // if it is, return this widget if (widget.gocuiSize.w0 <= w) && (w <= widget.gocuiSize.w1) && (widget.gocuiSize.h0 <= h) && (h <= widget.gocuiSize.h1) { widgets = append(widgets, widget) // log.Log(GOCUI, "findByXY() found", widget.WidgetType, w, h) } } // search through the children widgets in the binary tree for _, child := range widget.children { widgets = append(widgets, findByXY(child, w, h)...) } return widgets } func findUnderMouse() *guiWidget { w, h := me.baseGui.MousePosition() rootW := me.treeRoot.TK.(*guiWidget) widgets := findByXY(rootW, w, h) // search through all the widgets that were below the mouse click var found *guiWidget for _, w := range widgets { // 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 } } // return anything else that is interactive for _, w := range widgets { if w.WidgetType == widget.Button { return w } if w.WidgetType == widget.Combobox { return w } if w.WidgetType == widget.Checkbox { return w } w.showWidgetPlacement("findUnderMouse() found something unknown") found = w } // maybe something else was found return found } // find the widget under the mouse click func ctrlDown(g *gocui.Gui, v *gocui.View) error { var found *guiWidget // var widgets []*node // var f func (n *node) found = findUnderMouse() if me.ctrlDown == nil { setupCtrlDownWidget() var tk *guiWidget tk = me.ctrlDown.TK.(*guiWidget) tk.labelN = found.String() tk.cuiName = "ctrlDown" // me.ctrlDown.parent = me.rootNode } var tk *guiWidget tk = me.ctrlDown.TK.(*guiWidget) if found == nil { found = me.treeRoot.TK.(*guiWidget) } tk.labelN = found.String() newR := found.realGocuiSize() tk.gocuiSize.w0 = newR.w0 tk.gocuiSize.h0 = newR.h0 tk.gocuiSize.w1 = newR.w1 tk.gocuiSize.h1 = newR.h1 return nil }