// 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 ( "strings" "github.com/awesome-gocui/gocui" log "go.wit.com/log" ) func (tk *guiWidget) forceSizes(r *rectType) { tk.gocuiSize.w0 = r.w0 tk.gocuiSize.w1 = r.w1 tk.gocuiSize.h0 = r.h0 tk.gocuiSize.h1 = r.h1 tk.full.w0 = r.w0 tk.full.w1 = r.w1 tk.full.h0 = r.h0 tk.full.h1 = r.h1 tk.force.w0 = r.w0 tk.force.w1 = r.w1 tk.force.h0 = r.h0 tk.force.h1 = r.h1 } func (callertk *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 } tk := me.textbox.tk r := new(rectType) // startW, startH := tk.Position() r.w0 = callertk.gocuiSize.w0 + 4 r.h0 = callertk.gocuiSize.h0 + 3 r.w1 = r.w0 + 24 r.h1 = r.h0 + 2 me.textbox.tk.forceSizes(r) me.textbox.tk.dumpWidget("after sizes") me.textbox.tk.Show() // actually makes the gocui view. TODO: redo this if me.textbox.tk.v == nil { log.Info("wtf went wrong") return } me.textbox.tk.setColorModal() me.textbox.tk.v.Editable = true me.textbox.tk.v.Wrap = true me.baseGui.SetView(me.textbox.tk.cuiName, r.w0, r.h0, r.w1, r.h1, 0) me.baseGui.SetCurrentView(me.textbox.tk.v.Name()) // bind the enter key to a function so we can close the textbox me.baseGui.SetKeybinding(me.textbox.tk.v.Name(), gocui.KeyEnter, gocui.ModNone, theCloseTheTextbox) me.textbox.active = true me.textbox.callerTK = callertk tk.dumpWidget("showTextbox()") } func theCloseTheTextbox(g *gocui.Gui, v *gocui.View) error { textboxClosed() return nil } // updates the text and sends an event back to the application func textboxClosed() { // get the text the user entered newtext := "testing" if me.textbox.tk.v == nil { newtext = "" } else { newtext = me.textbox.tk.v.ViewBuffer() } newtext = strings.TrimSpace(newtext) me.textbox.active = false me.textbox.tk.Hide() log.Info("textbox closed", newtext) if me.clock.tk.v != nil { me.baseGui.SetCurrentView("help") } else { me.baseGui.SetCurrentView("msg") } // change the text of the caller widget me.textbox.callerTK.SetText(newtext) me.textbox.callerTK.node.SetCurrentS(newtext) // send an event from the plugin with the new string me.myTree.SendUserEvent(me.textbox.callerTK.node) }