package main import ( "fmt" "strings" "github.com/awesome-gocui/gocui" log "go.wit.com/log" "go.wit.com/toolkits/tree" "go.wit.com/widget" ) func makeDropdownView(ddItems string) *tree.Node { newNode := addDropdown() tk := newNode.TK.(*guiWidget) tk.labelN = ddItems tk.SetText(ddItems) 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 newNode } 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) } func addDropdown() *tree.Node { n := new(tree.Node) n.WidgetType = widget.Flag n.WidgetId = 2222 n.ParentId = 0 // store the internal toolkit information tk := new(guiWidget) tk.frame = true tk.labelN = "DropBox text" tk.node = n // copy the data from the action message tk.node.State.Label = "DropBox" // set the name used by gocui to the id tk.cuiName = "-1 dropbox" tk.color = &colorFlag // add this new widget on the binary tree tk.parent = me.treeRoot.TK.(*guiWidget) if tk.parent == nil { panic("addDropdown() didn't get treeRoot guiWidget") } else { tk.parent.children = append(tk.parent.children, tk) } n.TK = tk return n } func showDropdownItems(ddItems string) { for i, s := range strings.Split(ddItems, "\n") { log.Log(NOW, "showDropdownItems() found =", i, s) } 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 { log.Log(NOW, "new dns list should be set to:", ddItems) tk.labelN = ddItems tk.SetText(ddItems) tk.SetVisible(true) tk.v.Clear() fmt.Fprint(tk.v, ddItems) } } func dropdownClicked(mouseX, mouseH int) { tk := me.ddview.TK.(*guiWidget) 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) 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 { return gocui.ErrUnknownView } if tk.v == nil { return gocui.ErrUnknownView } tk.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 { return gocui.ErrUnknownView } var tk *guiWidget tk = me.ddview.TK.(*guiWidget) if tk.v == nil { return gocui.ErrUnknownView } tk.SetVisible(true) return nil } /* // if there is a drop down view active, treat it like a dialog box and close it if (hideDDview() == nil) { return nil } */ func (w *guiWidget) dropdownClicked(mouseW, mouseH int) { log.Log(NOW, "dropdownClicked() (w,h) =", mouseW, mouseH) w.SetVisible(false) } func dropdownUnclicked(mouseX, mouseH int) { tk := me.ddview.TK.(*guiWidget) 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) 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) } } } }