// Copyright 2017-2025 WIT.COM Inc. All rights reserved. // Use of this source code is governed by the GPL 3.0 package main import ( "fmt" "strings" log "go.wit.com/log" "go.wit.com/toolkits/tree" "go.wit.com/widget" ) // simulates a dropdown menu in gocui /* func addInternalTK(wId int) *guiWidget { n := addDropdownNew(wId) tk := n.TK.(*guiWidget) tk.internal = true return tk } */ func addInternalTK(wId int) *guiWidget { n := new(tree.Node) n.WidgetType = widget.Flag n.WidgetId = wId n.ParentId = 0 // store the internal toolkit information tk := new(guiWidget) tk.frame = true tk.node = n if tk.node.Parent == nil { tk.node.Parent = me.treeRoot } // set the name used by gocui to the id tk.cuiName = fmt.Sprintf("%d DR", wId) tk.color = &colorFlag // add this new widget on the binary tree tk.parent = me.treeRoot.TK.(*guiWidget) if tk.parent == nil { panic("addInternalNode() didn't get treeRoot guiWidget") } else { tk.parent.children = append(tk.parent.children, tk) } n.TK = tk tk.internal = true return tk } func (tk *guiWidget) showDropdown() { if me.dropdown.tk == nil { // should only happen once me.dropdown.tk = addInternalTK(me.dropdown.wId) me.dropdown.tk.dumpWidget("init() dropdown") } if me.dropdown.tk == nil { log.Log(GOCUI, "showDropdown() Is Broken!") return } // todo: fix this after switching to protobuf me.dropdown.items = []string{} // zero out whatever was there before for i, s := range tk.node.Strings() { log.Log(GOCUI, "showDropdown()", tk.String(), i, s) me.dropdown.items = append(me.dropdown.items, s) } log.Log(GOCUI, "new dropdown items should be set to:", me.dropdown.items) startW, startH := tk.Position() log.Log(GOCUI, "showDropdown() SHOWING AT W,H=", startW, startH) me.dropdown.tk.Hide() me.dropdown.tk.MoveToOffset(startW+3, startH+2) me.dropdown.tk.labelN = strings.Join(me.dropdown.items, "\n") me.dropdown.tk.Show() me.dropdown.active = true me.dropdown.callerTK = tk me.dropdown.tk.dumpWidget("showDropdown()") } // if there is a drop down view active, treat it like a dialog box and close it func (w *guiWidget) dropdownClicked(mouseW, mouseH int) string { w.Hide() // only need height to figure out what line in the dropdown menu the user clicked _, startH := w.Position() itemNumber := mouseH - startH items := me.dropdown.items // log.Log(GOCUI, "dropdownClicked() look for item", itemNumber, "len(items) =", len(items)) if itemNumber < 1 { return "" } if len(items) >= itemNumber { // log.Log(GOCUI, "dropdownClicked() found", items[itemNumber-1]) if items[itemNumber-1] != "" { if me.dropdown.tk != nil { // log.Log(GOCUI, "dropdownClicked() send event for", me.dropdownW.cuiName, me.dropdownW.node.WidgetType) me.dropdown.callerTK.SetText(items[itemNumber-1]) me.dropdown.callerTK.node.SetCurrentS(items[itemNumber-1]) me.myTree.SendUserEvent(me.dropdown.callerTK.node) } } return items[itemNumber-1] } return "" } func dropdownUnclicked(w, h int) { var d *guiWidget // examine everything under X & Y on the screen) for _, tk := range findByXY(w, h) { // tk.dumpWidget("dropdownUnclicked()") if tk.node.WidgetType == widget.Dropdown { d = tk } } if d == nil { // log.Log(GOCUI, fmt.Sprintf("dropdownUnclicked() there was no dropdown widget at (w=%d h=%d)", mouseW, mouseH)) return } // log.Log(GOCUI, "dropdownUnclicked()", d.node.Strings(), "end. now try to enable me.dropdownV") } func (tk *guiWidget) showTextbox() { if me.textbox.tk == nil { // should only happen once me.textbox.tk = addInternalTK(me.textbox.wId) me.dropdown.tk.dumpWidget("init() textbox") } if me.textbox.tk == nil { log.Log(GOCUI, "showTextbox() Is Broken") return } startW, startH := tk.Position() // log.Log(GOCUI, "showTextbox() SHOWING AT W,H=", startW, startH) me.textbox.tk.MoveToOffset(startW+3, startH+2) me.textbox.tk.labelN = "holy cow" me.textbox.tk.Show() me.textbox.active = true me.textbox.callerTK = tk me.textbox.tk.dumpWidget("showTextbox()") }