diff options
Diffstat (limited to 'click.go')
| -rw-r--r-- | click.go | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/click.go b/click.go new file mode 100644 index 0000000..6d8b20a --- /dev/null +++ b/click.go @@ -0,0 +1,357 @@ +package main + +import ( + "fmt" + "github.com/awesome-gocui/gocui" + "go.wit.com/lib/widget" + "go.wit.com/log" +) + +// set isCurrent = false everywhere +func unsetCurrent(n *node) { + w := n.tk + w.isCurrent = false + + if n.WidgetType == widget.Tab { + // n.tk.color = &colorTab + // n.setColor() + } + + for _, child := range n.children { + unsetCurrent(child) + } +} + +// 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 (n *node) updateCurrent() { + log.Log(NOW, "updateCurrent()", n.progname) + if n.WidgetType == widget.Tab { + if n.IsCurrent() { + // n.tk.color = &colorActiveT + n.setColor(&colorActiveT) + n.hideView() + n.showView() + setCurrentTab(n) + } else { + // n.tk.color = &colorTab + // n.setColor() + } + return + } + if n.WidgetType == widget.Window { + if n.IsCurrent() { + // setCurrentWindow(n) + } + return + } + if n.WidgetType == widget.Root { + return + } + n.parent.updateCurrent() +} + +// shows the widgets in a window +func setCurrentWindow(n *node) { + if n.IsCurrent() { + return + } + w := n.tk + if n.WidgetType != widget.Window { + return + } + unsetCurrent(me.rootNode) + + if n.hasTabs { + // set isCurrent = true on the first tab + for _, child := range n.children { + child.tk.isCurrent = true + break + } + } else { + w.isCurrent = true + } +} + +// shows the widgets in a tab +func setCurrentTab(n *node) { + w := n.tk + if n.WidgetType != widget.Tab { + return + } + unsetCurrent(me.rootNode) + w.isCurrent = true + p := n.parent.tk + p.isCurrent = true + log.Log(NOW, "setCurrent()", n.progname) +} + +func (n *node) doWidgetClick() { + switch n.WidgetType { + case widget.Root: + // THIS IS THE BEGINING OF THE LAYOUT + log.Log(NOW, "doWidgetClick()", n.progname) + redoWindows(0, 0) + case widget.Flag: + log.Log(NOW, "doWidgetClick() FLAG widget name =", n.progname) + log.Log(NOW, "doWidgetClick() if this is the dropdown menu, handle it here?") + case widget.Window: + if me.currentWindow == n { + return + } + if me.currentWindow != nil { + unsetCurrent(me.currentWindow) + me.currentWindow.setColor(&colorWindow) + me.currentWindow.hideWidgets() + } + n.hideWidgets() + me.currentWindow = n + // setCurrentWindow(n) // probably delete this + n.setColor(&colorActiveW) + n.redoTabs(me.TabW, me.TabH) + for _, child := range n.children { + if child.currentTab == true { + log.Log(NOW, "FOUND CURRENT TAB", child.progname) + setCurrentTab(child) + child.placeWidgets(me.RawW, me.RawH) + child.showWidgets() + return + } + } + /* FIXME: redo this + if ! n.hasTabs { + } + */ + case widget.Tab: + if n.IsCurrent() { + return // do nothing if you reclick on the already selected tab + } + // find the window and disable the active tab + p := n.parent + if p != nil { + p.hideWidgets() + p.redoTabs(me.TabW, me.TabH) + unsetCurrent(p) + for _, child := range p.children { + if child.WidgetType == widget.Tab { + child.setColor(&colorTab) + n.currentTab = false + } + } + } + n.currentTab = true + n.setColor(&colorActiveT) + setCurrentTab(n) + n.placeWidgets(me.RawW, me.RawH) + n.showWidgets() + case widget.Group: + // n.placeWidgets(p.tk.startH, newH) + n.toggleTree() + case widget.Checkbox: + if widget.GetBool(n.value) { + n.setCheckbox(false) + } else { + n.setCheckbox(true) + } + n.doUserEvent() + case widget.Grid: + newR := n.realGocuiSize() + + // w,h := n.logicalSize() + // w := newR.w1 - newR.w0 + // h := newR.h1 - newR.h0 + + n.placeGrid(newR.w0, newR.h0) + n.showWidgets() + case widget.Box: + // w.showWidgetPlacement(logNow, "drawTree()") + if n.direction == widget.Horizontal { + log.Log(NOW, "BOX IS HORIZONTAL", n.progname) + } else { + log.Log(NOW, "BOX IS VERTICAL", n.progname) + } + // n.placeWidgets() + n.toggleTree() + case widget.Button: + n.doUserEvent() + case widget.Dropdown: + log.Log(NOW, "do the dropdown here") + if me.ddview == nil { + me.ddview = addDropdown() + tk := me.ddview.tk + 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, "example.com\nwit.com") + me.ddview.SetVisible(true) + return + } + log.Log(NOW, "doWidgetClick() visible =", me.ddview.Visible()) + if me.ddview.Visible() { + me.ddview.SetVisible(false) + me.baseGui.DeleteView("ddview") + me.ddview.tk.v = nil + } else { + var dnsList string + for i, s := range n.vals { + log.Log(NOW, "AddText()", n.progname, i, s) + dnsList += s + "\n" + } + me.ddNode = n + log.Log(NOW, "new dns list should be set to:", dnsList) + me.ddview.label = dnsList + me.ddview.SetText(dnsList) + me.ddview.SetVisible(true) + } + for i, s := range n.vals { + log.Log(NOW, "AddText()", n.progname, i, s) + } + default: + } +} + +var toggle bool = true + +func (n *node) toggleTree() { + if toggle { + n.drawTree(toggle) + toggle = false + } else { + n.hideWidgets() + toggle = true + } +} + +// display the widgets in the binary tree +func (n *node) drawTree(draw bool) { + w := n.tk + if w == nil { + return + } + n.showWidgetPlacement(true, "drawTree()") + if draw { + // w.textResize() + n.showView() + } else { + n.deleteView() + } + + for _, child := range n.children { + child.drawTree(draw) + } +} + +func click(g *gocui.Gui, v *gocui.View) error { + // var l string + // var err error + + log.Log(INFO, "click() START", v.Name()) + // n := me.rootNode.findWidgetName(v.Name()) + n := findUnderMouse() + if n != nil { + log.Log(NOW, "click() Found widget =", n.WidgetId, n.progname, ",", n.label) + if n.progname == "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 + } + n.doWidgetClick() + } else { + log.Log(NOW, "click() could not find node name =", v.Name()) + } + + if _, err := g.SetCurrentView(v.Name()); err != nil { + log.Log(NOW, "click() END err =", err) + return err + } + + log.Log(NOW, "click() END") + return nil +} + +func findUnderMouse() *node { + var found *node + var widgets []*node + var f func(n *node) + w, h := me.baseGui.MousePosition() + + // 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 + } + } + if n == me.ddview { + log.Log(NOW, "findUnderMouse() found ddview") + if n.Visible() { + log.Log(NOW, "findUnderMouse() and ddview is visable. hide it here. TODO: find highlighted row") + found = n + // find the actual value here and set the dropdown widget + me.baseGui.DeleteView("ddview") + } else { + log.Log(NOW, "findUnderMouse() I was lying, actually it's not found") + } + } + + 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(true, "findUnderMouse() FOUND") + } + return found +} + +// find the widget under the mouse click +func ctrlDown(g *gocui.Gui, v *gocui.View) error { + var found *node + // var widgets []*node + // var f func (n *node) + found = findUnderMouse() + if me.ctrlDown == nil { + setupCtrlDownWidget() + me.ctrlDown.label = found.progname + me.ctrlDown.tk.cuiName = "ctrlDown" + // me.ctrlDown.parent = me.rootNode + } + cd := me.ctrlDown.tk + if found == nil { + found = me.rootNode + } + me.ctrlDown.label = found.progname + 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.hideView() + } else { + me.ctrlDown.showView() + } + me.ctrlDown.showWidgetPlacement(true, "ctrlDown:") + return nil +} |
