got the strings for a dropdown widget (finally. only took me 4 years)
This commit is contained in:
parent
9f38585892
commit
1d32c5da2b
21
dropdown.go
21
dropdown.go
|
@ -156,12 +156,29 @@ func (w *guiWidget) dropdownClicked(mouseW, mouseH int) string {
|
|||
}
|
||||
|
||||
func dropdownUnclicked(mouseX, mouseH int) {
|
||||
log.Log(GOCUI, "dropdownUnclicked() mouseup: got inside me.dropdown handler? wxh =", mouseX, mouseH)
|
||||
var d *guiWidget
|
||||
|
||||
// log.Log(GOCUI, "dropdownUnclicked() mouseup: got inside me.dropdown handler? wxh =", mouseX, mouseH)
|
||||
if me.dropdownV == nil {
|
||||
log.Log(GOCUI, "mouseUp() dropdownV = nil", mouseX, mouseH)
|
||||
log.Log(GOCUI, "mouseUp() dropdownV = nil. you don't have a fake dropdown window to make visible", mouseX, mouseH)
|
||||
return
|
||||
}
|
||||
tk := me.dropdownV
|
||||
log.Log(GOCUI, fmt.Sprintf("dropdownUnclicked at apparently (w=%d h=%d)", mouseX, mouseH))
|
||||
log.Log(GOCUI, "dropdownUnclicked() find out what the string is here", mouseX, mouseH, tk.gocuiSize.h1)
|
||||
|
||||
rootW := me.treeRoot.TK.(*guiWidget)
|
||||
// examine everything under X & Y on the screen)
|
||||
for i, w := range findByXY(rootW, mouseX, mouseH) {
|
||||
log.Log(GOCUI, "dropdownUnclicked()", i, w.WidgetType)
|
||||
if w.WidgetType == widget.Dropdown {
|
||||
d = w
|
||||
break
|
||||
}
|
||||
}
|
||||
if d == nil {
|
||||
log.Log(GOCUI, fmt.Sprintf("dropdownUnclicked() there was no dropdown widget at (w=%d h=%d)", mouseX, mouseH))
|
||||
return
|
||||
}
|
||||
log.Log(GOCUI, "dropdownUnclicked()", d.node.Strings(), "end")
|
||||
}
|
||||
|
|
|
@ -160,84 +160,3 @@ func click(g *gocui.Gui, v *gocui.View) error {
|
|||
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
|
||||
}
|
||||
|
|
|
@ -0,0 +1,96 @@
|
|||
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
|
||||
}
|
Loading…
Reference in New Issue