summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--add.go4
-rw-r--r--click.go115
-rw-r--r--dropdown.go122
-rw-r--r--mouse.go13
-rw-r--r--structs.go16
5 files changed, 91 insertions, 179 deletions
diff --git a/add.go b/add.go
index ed43ffa..54a1134 100644
--- a/add.go
+++ b/add.go
@@ -51,8 +51,8 @@ func addWidget(n *tree.Node) {
wRoot.redoWindows(0, 0)
// TODO: record the first window here?
// do initial setup of helper widgets here:
- if me.ddview == nil {
- me.ddview = makeDropdownView("addWidget() ddview")
+ if me.dropdownV == nil {
+ me.dropdownV = makeDropdownView("addWidget() ddview")
}
return
case widget.Tab:
diff --git a/click.go b/click.go
index 9b1f858..a2b61c5 100644
--- a/click.go
+++ b/click.go
@@ -1,9 +1,10 @@
package main
import (
+ "errors"
+
"github.com/awesome-gocui/gocui"
"go.wit.com/log"
- "go.wit.com/toolkits/tree"
"go.wit.com/widget"
)
@@ -178,53 +179,13 @@ func (w *guiWidget) doWidgetClick() {
w.toggleTree()
case widget.Button:
// doUserEvent(n)
- me.myTree.SendUserEvent(w.node)
+ me.myTree.SendFromUser(w.node)
case widget.Combobox:
log.Log(NOW, "do the combobox here")
- var ddItems string
- for i, s := range w.vals {
- log.Log(NOW, "ddItem:", w.String(), i, s)
- ddItems += s + "\n"
- }
- if me.ddview == nil {
- me.ddview = makeDropdownView(ddItems)
- }
- showDropdownItems(ddItems)
- me.ddNode = w.node
+ w.showDropdown()
case widget.Dropdown:
log.Log(NOW, "do the dropdown here")
- var ddItems string
- for i, s := range w.vals {
- log.Log(NOW, "ddItem:", w.String(), i, s)
- ddItems += s + "\n"
- }
- /*
- if me.ddview == nil {
- me.ddview = makeDropdownView(ddItems)
- }
- */
- showDropdownItems(ddItems)
- me.ddNode = w.node
- /*
- var tk *guiWidget
- tk = me.ddview.TK.(*guiWidget)
- log.Log(NOW, "doWidgetClick() visible =", tk.Visible())
- if tk.Visible() {
- tk.SetVisible(false)
- me.baseGui.DeleteView("ddview")
- tk.v = nil
- } else {
- me.ddNode = w.node
- log.Log(NOW, "new dns list should be set to:", ddItems)
- tk.labelN = ddItems
- tk.SetText(ddItems)
- tk.SetVisible(true)
- fmt.Fprint(tk.v, ddItems)
- }
- for i, s := range tk.vals {
- log.Log(NOW, "AddText()", tk.String(), i, s)
- }
- */
+ w.showDropdown()
default:
}
}
@@ -263,21 +224,18 @@ func click(g *gocui.Gui, v *gocui.View) error {
// var l string
// var err error
- log.Log(INFO, "click() START", v.Name())
+ log.Log(NOW, "click() START gocui name:", v.Name())
// n := me.rootNode.findWidgetName(v.Name())
- n := findUnderMouse()
- var w *guiWidget
- w = n.TK.(*guiWidget)
- if w != nil {
+ w := findUnderMouse()
+ if w == nil {
+ log.Error(errors.New("click() could not find widget for view =" + v.Name()))
+ } else {
log.Log(NOW, "click() Found widget =", w.node.WidgetId, w.String(), ",", w.labelN)
if w.String() == "DropBox" {
log.Log(NOW, "click() this is the dropdown menu. set a flag here what did I click? where is the mouse?")
log.Log(NOW, "click() set a global dropdown clicked flag=true here")
- me.ddClicked = true
}
w.doWidgetClick()
- } else {
- log.Log(NOW, "click() could not find node name =", v.Name())
}
if _, err := g.SetCurrentView(v.Name()); err != nil {
@@ -285,55 +243,57 @@ func click(g *gocui.Gui, v *gocui.View) error {
return err
}
- log.Log(NOW, "click() END")
+ log.Log(NOW, "click() END gocui name:", v.Name())
return nil
}
-func findUnderMouse() *tree.Node {
- var found *tree.Node
- var widgets []*tree.Node
- var f func(n *tree.Node)
+func findUnderMouse() *guiWidget {
+ var widgets []*guiWidget
+ var f func(w *guiWidget)
w, h := me.baseGui.MousePosition()
- ddTK := me.ddview.TK.(*guiWidget)
// if the dropdown view is visable, close it
- if ddTK.Visible() {
- ddTK.dropdownClicked(w, h)
- return me.ddview
+ if me.dropdownV.Visible() {
+ me.dropdownV.dropdownClicked(w, h)
+ return me.dropdownV
}
// find buttons that are below where the mouse button click
- f = func(n *tree.Node) {
- var widget *guiWidget
- widget = n.TK.(*guiWidget)
-
+ 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, n)
- found = n
+ widgets = append(widgets, widget)
}
}
for _, child := range widget.children {
- f(child.node)
+ f(child)
}
}
- f(me.treeRoot)
+ rootW := me.treeRoot.TK.(*guiWidget)
+ f(rootW)
+
+ var found *guiWidget
// 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)
- widget := n.TK.(*guiWidget)
- widget.showWidgetPlacement("findUnderMouse() FOUND")
+ for _, w := range widgets {
+ w.showWidgetPlacement("findUnderMouse() FOUND")
+ // 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
+ }
+ found = w
}
return found
}
// find the widget under the mouse click
func ctrlDown(g *gocui.Gui, v *gocui.View) error {
- var found *tree.Node
+ var found *guiWidget
// var widgets []*node
// var f func (n *node)
found = findUnderMouse()
@@ -349,11 +309,10 @@ func ctrlDown(g *gocui.Gui, v *gocui.View) error {
var tk *guiWidget
tk = me.ctrlDown.TK.(*guiWidget)
if found == nil {
- found = me.treeRoot
+ found = me.treeRoot.TK.(*guiWidget)
}
tk.labelN = found.String()
- foundtk := found.TK.(*guiWidget)
- newR := foundtk.realGocuiSize()
+ newR := found.realGocuiSize()
tk.gocuiSize.w0 = newR.w0
tk.gocuiSize.h0 = newR.h0
tk.gocuiSize.w1 = newR.w1
diff --git a/dropdown.go b/dropdown.go
index a12a929..cb0f38d 100644
--- a/dropdown.go
+++ b/dropdown.go
@@ -2,7 +2,6 @@ package main
import (
"fmt"
- "strings"
"github.com/awesome-gocui/gocui"
log "go.wit.com/log"
@@ -10,7 +9,7 @@ import (
"go.wit.com/widget"
)
-func makeDropdownView(ddItems string) *tree.Node {
+func makeDropdownView(ddItems string) *guiWidget {
newNode := addDropdown()
tk := newNode.TK.(*guiWidget)
tk.labelN = ddItems
@@ -25,40 +24,14 @@ func makeDropdownView(ddItems string) *tree.Node {
tk.gocuiSize.w1,
tk.gocuiSize.h1, 0)
if tk.v == nil {
- return newNode
+ return tk
}
tk.v.Wrap = true
tk.v.Frame = true
tk.v.Clear()
fmt.Fprint(tk.v, ddItems)
tk.SetVisible(true)
- return newNode
-}
-
-func makeDropdownViewOrig() {
- if me.ddview != nil {
- return
- }
- me.ddview = addDropdown()
- // n.TK = initWidget(n)
- var tk *guiWidget
- tk = me.ddview.TK.(*guiWidget)
- 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, tk.labelN)
+ return tk
}
func addDropdown() *tree.Node {
@@ -93,13 +66,14 @@ func addDropdown() *tree.Node {
return n
}
-func showDropdownItems(ddItems string) {
- for i, s := range strings.Split(ddItems, "\n") {
- log.Log(NOW, "showDropdownItems() found =", i, s)
+func (tk *guiWidget) showDropdown() {
+ var ddItems string
+ for i, s := range tk.vals {
+ log.Log(NOW, "showDropdown()", tk.String(), i, s)
+ ddItems += s + "\n"
}
- var tk *guiWidget
- tk = me.ddview.TK.(*guiWidget)
- log.Log(NOW, "doWidgetClick() visible =", tk.Visible())
+
+ log.Log(NOW, "showDropdown() visible =", tk.Visible())
if tk.Visible() {
tk.SetVisible(false)
me.baseGui.DeleteView("ddview")
@@ -115,43 +89,41 @@ func showDropdownItems(ddItems string) {
}
func dropdownClicked(mouseX, mouseH int) {
- tk := me.ddview.TK.(*guiWidget)
+ tk := me.dropdownV
if tk.Visible() {
log.Log(NOW, "hide DDview() Mouse really down at:", mouseX, mouseH)
hideDDview()
} else {
log.Log(NOW, "show DDview() Mouse really down at:", mouseX, mouseH)
+ log.Log(NOW, "can you see the dropdown menu right now?")
+ log.Log(NOW, "if so, something is wrong. I think you can't see it")
showDDview()
}
}
func hideDDview() error {
- var tk *guiWidget
- tk = me.ddview.TK.(*guiWidget)
w, h := me.baseGui.MousePosition()
log.Log(NOW, "hide dropdown menu() view msgMouseDown (w,h) =", w, h)
- if me.ddview == nil {
+ if me.dropdownV == nil {
return gocui.ErrUnknownView
}
- if tk.v == nil {
+ if me.dropdownV.v == nil {
return gocui.ErrUnknownView
}
- tk.SetVisible(false)
+ me.dropdownV.SetVisible(false)
return nil
}
func showDDview() error {
w, h := me.baseGui.MousePosition()
log.Log(NOW, "show dropdown menu() view msgMouseDown (w,h) =", w, h)
- if me.ddview == nil {
+ if me.dropdownV == nil {
return gocui.ErrUnknownView
}
- var tk *guiWidget
- tk = me.ddview.TK.(*guiWidget)
- if tk.v == nil {
+ if me.dropdownV.v == nil {
return gocui.ErrUnknownView
}
- tk.SetVisible(true)
+ me.dropdownV.SetVisible(true)
return nil
}
@@ -168,38 +140,32 @@ func (w *guiWidget) dropdownClicked(mouseW, mouseH int) {
}
func dropdownUnclicked(mouseX, mouseH int) {
- tk := me.ddview.TK.(*guiWidget)
+ tk := me.dropdownV
log.Log(NOW, "mouseUp() view msgMouseDown (check here for dropdown menu click) (w,h) =", mouseX, mouseH)
- if me.ddClicked {
- me.ddClicked = false
- log.Log(NOW, "mouseUp() ddview is the thing that was clicked", mouseX, mouseH)
- log.Log(NOW, "mouseUp() find out what the string is here", mouseX, mouseH, tk.gocuiSize.h1)
+ log.Log(NOW, "mouseUp() ddview is the thing that was clicked", mouseX, mouseH)
+ log.Log(NOW, "mouseUp() find out what the string is here", mouseX, mouseH, tk.gocuiSize.h1)
- var newZone string = ""
- if me.ddNode != nil {
- var ddtk *guiWidget
- ddtk = me.ddview.TK.(*guiWidget)
- value := mouseH - tk.gocuiSize.h0 - 1
- log.Log(NOW, "mouseUp() me.ddview.tk.gocuiSize.h1 =", tk.gocuiSize.h1)
- log.Log(NOW, "mouseUp() me.ddNode.vals =", ddtk.vals)
- valsLen := len(ddtk.vals)
- log.Log(NOW, "mouseUp() value =", value, "valsLen =", valsLen)
- log.Log(NOW, "mouseUp() me.ddNode.vals =", ddtk.vals)
- if (value >= 0) && (value < valsLen) {
- newZone = ddtk.vals[value]
- log.Log(NOW, "mouseUp() value =", value, "newZone =", newZone)
- }
- }
- hideDDview()
- if newZone != "" {
- if me.ddNode != nil {
- var ddtk *guiWidget
- ddtk = me.ddview.TK.(*guiWidget)
- ddtk.SetText(newZone)
- ddtk.value = newZone
- // me.ddNode.doUserEvent()
- me.myTree.SendUserEvent(me.ddNode)
- }
- }
+ var newZone string = ""
+ if me.dropdownW == nil {
+ return
}
+ // try to compute the line item clicked here
+ /*
+ var ddtk *guiWidget
+ ddtk = me.ddview.TK.(*guiWidget)
+ value := mouseH - tk.gocuiSize.h0 - 1
+ log.Log(NOW, "mouseUp() me.ddview.tk.gocuiSize.h1 =", tk.gocuiSize.h1)
+ log.Log(NOW, "mouseUp() me.ddNode.vals =", ddtk.vals)
+ valsLen := len(ddtk.vals)
+ log.Log(NOW, "mouseUp() value =", value, "valsLen =", valsLen)
+ log.Log(NOW, "mouseUp() me.ddNode.vals =", ddtk.vals)
+ if (value >= 0) && (value < valsLen) {
+ newZone = ddtk.vals[value]
+ log.Log(NOW, "mouseUp() value =", value, "newZone =", newZone)
+ }
+ */
+ // send the event the user selected something from the dropdown
+ hideDDview()
+ me.dropdownW.SetText(newZone)
+ me.myTree.SendUserEvent(me.dropdownW.node)
}
diff --git a/mouse.go b/mouse.go
index 2a8de70..eec39a0 100644
--- a/mouse.go
+++ b/mouse.go
@@ -37,10 +37,6 @@ func msgDown(g *gocui.Gui, v *gocui.View) error {
}
func mouseUp(g *gocui.Gui, v *gocui.View) error {
- if me.ddview == nil {
- me.ddview = makeDropdownView("mouseUp unclick")
- }
-
w, h := g.MousePosition()
dropdownUnclicked(w, h)
@@ -68,12 +64,9 @@ func mouseDown(g *gocui.Gui, v *gocui.View) error {
}
globalMouseDown = true
maxX, _ := g.Size()
- test := findUnderMouse()
- msg := fmt.Sprintf("Mouse really down at: %d,%d", mx, my) + "foobar"
- if test == me.ddview {
- dropdownClicked(mx, my)
- return nil
- }
+ findUnderMouse()
+ msg := fmt.Sprintf("mouseDown() Mouse really down at: %d,%d", mx, my)
+ dropdownClicked(mx, my)
x := mx - len(msg)/2
if x < 0 {
x = 0
diff --git a/structs.go b/structs.go
index fba741c..cd5bdb2 100644
--- a/structs.go
+++ b/structs.go
@@ -43,18 +43,12 @@ type config struct {
currentWindow *tree.Node // this is the current tab or window to show
logStdout *tree.Node // where to show STDOUT
helpLabel *gocui.View
- ddview *tree.Node // the gocui view to select dropdrown lists
- ddClicked bool // the dropdown menu view was clicked
- ddNode *tree.Node // the dropdown menu is for this widget
- /*
- // this is the channel we send user events like
- // mouse clicks or keyboard events back to the program
- callback chan toolkit.Action
-
- // this is the channel we get requests to make widgets
- pluginChan chan toolkit.Action
- */
+ // this is a floating widget that we show whenever the user clicks on a
+ // dropdown menu or combobox
+ // the dropdown widget to select dropdrown lists
+ dropdownV *guiWidget
+ dropdownW *guiWidget // grab the dropdown choices from this widget
// When the widget has a frame, like a button, it adds 2 lines runes on each side
// so you need 3 char spacing in each direction to not have them overlap