170 lines
4.5 KiB
Go
170 lines
4.5 KiB
Go
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
|
|
// Use of this source code is governed by the GPL 3.0
|
|
|
|
package main
|
|
|
|
// simulates a dropdown menu in gocui
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
log "go.wit.com/log"
|
|
"go.wit.com/toolkits/tree"
|
|
"go.wit.com/widget"
|
|
)
|
|
|
|
// create a new widget in the binary tree
|
|
func makeNewFlagWidget(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.setColorInput()
|
|
|
|
// add this new widget on the binary tree
|
|
tk.parent = me.treeRoot.TK.(*guiWidget)
|
|
if tk.parent == nil {
|
|
panic("makeNewFlagWidget() didn't get treeRoot guiWidget")
|
|
} else {
|
|
tk.parent.children = append(tk.parent.children, tk)
|
|
}
|
|
|
|
n.TK = tk
|
|
return tk
|
|
}
|
|
|
|
func (tk *guiWidget) showDropdown() {
|
|
if me.dropdown.tk == nil {
|
|
// should only happen once
|
|
me.dropdown.tk = makeNewFlagWidget(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()
|
|
me.dropdown.active = false
|
|
|
|
// 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 = makeNewFlagWidget(me.textbox.wId)
|
|
me.textbox.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.setColorInput()
|
|
me.textbox.tk.Show()
|
|
me.textbox.active = true
|
|
me.textbox.callerTK = tk
|
|
r := me.textbox.tk.gocuiSize
|
|
me.textbox.tk.full.w0 = r.w0
|
|
me.textbox.tk.full.w1 = r.w1
|
|
me.textbox.tk.full.h0 = r.h0
|
|
me.textbox.tk.full.h1 = r.h1
|
|
me.textbox.tk.dumpWidget("showTextbox()")
|
|
}
|
|
|
|
// updates the text and sends an event back to the application
|
|
func (tk *guiWidget) textboxClosed() {
|
|
tk.Hide()
|
|
me.textbox.active = false
|
|
|
|
// get the text the user entered
|
|
newname := tk.GetText()
|
|
|
|
// change the text of the caller widget
|
|
me.textbox.callerTK.SetText(newname)
|
|
me.textbox.callerTK.node.SetCurrentS(newname)
|
|
|
|
// send an event from the plugin with the new string
|
|
me.myTree.SendUserEvent(me.textbox.callerTK.node)
|
|
}
|