diff options
| author | Jeff Carr <[email protected]> | 2025-01-31 08:57:32 -0600 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-01-31 13:47:45 -0600 |
| commit | 1a1881aa4e39e256126972c0cbe7f0db93ee20ec (patch) | |
| tree | 7afff73f1c2a594e71628f435644530ba05a4c0f /eventMouseClick.go | |
| parent | 75a5c7bf728d02bcf5accd1360c99a9c6edc0b91 (diff) | |
name changes after I haven't looked at this code for some time
Diffstat (limited to 'eventMouseClick.go')
| -rw-r--r-- | eventMouseClick.go | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/eventMouseClick.go b/eventMouseClick.go new file mode 100644 index 0000000..919ed87 --- /dev/null +++ b/eventMouseClick.go @@ -0,0 +1,243 @@ +package main + +import ( + "errors" + + "github.com/awesome-gocui/gocui" + "go.wit.com/log" + "go.wit.com/widget" +) + +func (w *guiWidget) doWidgetClick() { + switch w.WidgetType { + /* + case widget.Root: + // THIS IS THE BEGINING OF THE LAYOUT + log.Log(GOCUI, "doWidgetClick()", w.String()) + wRoot := me.treeRoot.TK.(*guiWidget) + wRoot.redoWindows(0, 0) + case widget.Flag: + log.Log(GOCUI, "doWidgetClick() FLAG widget name =", w.String()) + log.Log(GOCUI, "doWidgetClick() if this is the dropdown menu, handle it here?") + */ + case widget.Window: + log.Log(GOCUI, "doWidgetClick() START on window", w.String()) + // if the user clicked on the current window, do nothing + /* Ignore this for now and redraw the window anyway + if me.currentWindow == w { + if !w.active { + return + } + } + */ + + // if there is a current window, hide it + if me.currentWindow != nil { + me.currentWindow.setColor(&colorWindow) + me.currentWindow.hideWidgets() + me.currentWindow.isCurrent = false + } + + // now set this window as the current window + me.currentWindow = w + me.currentWindow.isCurrent = true + + // draw the current window + log.Log(GOCUI, "doWidgetClick() set currentWindow to", w.String()) + w.setColor(&colorActiveW) + w.DrawAt(3, 2) + w.placeWidgets(3, 2) // compute the sizes & places for each widget + w.active = false + w.showWidgets() + /* + hideFake() + showDebug = true + */ + case widget.Group: + if w.active { + w.active = false + w.placeWidgets(w.startW, w.startH) + w.showWidgets() + } else { + w.active = true + for _, child := range w.children { + child.hideWidgets() + } + } + // w.dumpTree("click end") + case widget.Checkbox: + if w.node.State.Checked { + log.Log(WARN, "checkbox is being set to false") + w.node.State.Checked = false + w.setCheckbox() + } else { + log.Log(WARN, "checkbox is being set to true") + w.node.State.Checked = true + w.setCheckbox() + } + me.myTree.SendUserEvent(w.node) + case widget.Grid: + newR := w.realGocuiSize() + + // w,h := n.logicalSize() + // w := newR.w1 - newR.w0 + // h := newR.h1 - newR.h0 + + w.placeGrid(newR.w0, newR.h0) + w.showWidgets() + case widget.Box: + // w.showWidgetPlacement(logNow, "drawTree()") + if w.node.State.Direction == widget.Horizontal { + log.Log(GOCUI, "BOX IS HORIZONTAL", w.String()) + } else { + log.Log(GOCUI, "BOX IS VERTICAL", w.String()) + } + w.placeWidgets(w.startW, w.startH) + w.toggleTree() + case widget.Button: + // doUserEvent(n) + me.myTree.SendFromUser(w.node) + case widget.Combobox: + log.Log(GOCUI, "do the combobox here") + w.showDropdown() + me.dropdownW = w + case widget.Dropdown: + log.Log(GOCUI, "do the dropdown here") + w.showDropdown() + me.dropdownW = w + default: + } +} + +func click(g *gocui.Gui, v *gocui.View) error { + mouseW, mouseH := me.baseGui.MousePosition() + + log.Log(GOCUI, "click() START gocui name:", v.Name(), mouseW, mouseH) + w := findUnderMouse() + + // if the dropdown view is visible, process it no matter what + if me.dropdownV.Visible() { + me.dropdownV.dropdownClicked(mouseW, mouseH) + } + if w == me.dropdownV { + return nil + } + + if w == nil { + log.Error(errors.New("click() could not find widget for view =" + v.Name())) + } else { + log.Log(GOCUI, "click() Found widget =", w.node.WidgetId, w.String(), ",", w.labelN) + w.doWidgetClick() + } + + rootTK := me.treeRoot.TK.(*guiWidget) + realTK := rootTK.findWidgetByView(v) + if realTK == nil { + log.Error(errors.New("toolkit click() out of reality with gocui. v.Name() not in binary tree " + v.Name())) + log.Log(GOCUI, "click() END FAILURE ON gocui v.Name =", v.Name()) + // return nil // otherwise gocui exits + } + + // double check the widget view really still exists + nameTK := rootTK.findWidgetByName(v.Name()) + if nameTK == nil { + log.Error(errors.New("toolkit click() out of reality with gocui. v.Name() not in binary tree " + v.Name())) + return nil + } + if nameTK.v == nil { + log.Log(GOCUI, "click() maybe this widget has had it's view distroyed?", nameTK.cuiName, nameTK.WidgetType) + log.Log(GOCUI, "yep. it's gone now") + return nil + } + + // SetCurrentView dies if it's sent an non-existent view + if _, err := g.SetCurrentView(v.Name()); err != nil { + log.Log(GOCUI, "click() END v.Name =", v.Name(), "err =", err) + // return err // return causes gocui.MainLoop() to exit. Do we ever want that to happen here? + return nil + } + + log.Log(GOCUI, "click() END gocui name:", v.Name()) + return nil +} + +func findUnderMouse() *guiWidget { + var widgets []*guiWidget + var f func(w *guiWidget) + w, h := me.baseGui.MousePosition() + + // find buttons that are below where the mouse button click + 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, widget) + } + } + + for _, child := range widget.children { + f(child) + } + } + rootW := me.treeRoot.TK.(*guiWidget) + f(rootW) + + // 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 +} |
