summaryrefslogtreecommitdiff
path: root/toolkit/gocui/click.go
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/gocui/click.go')
-rw-r--r--toolkit/gocui/click.go297
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
}