Skip to content

Instantly share code, notes, and snippets.

@quantonganh
Last active April 8, 2023 15:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save quantonganh/88d14214cffcf226cfcd7bea5a17ecf3 to your computer and use it in GitHub Desktop.
Save quantonganh/88d14214cffcf226cfcd7bea5a17ecf3 to your computer and use it in GitHub Desktop.
rivo/tview: how to show an InputField at the current list item's position?
package main
import (
"strconv"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
const pageEditTitle = "editTitle"
func main() {
app := tview.NewApplication()
button := tview.NewButton("+ New chat")
button.SetBorder(true)
pages := tview.NewPages()
editTitleInputField := tview.NewInputField().
SetFieldWidth(40).
SetAcceptanceFunc(tview.InputFieldMaxLength(40))
modal := func(p tview.Primitive, currentIndex int) tview.Primitive {
return tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(tview.NewFlex().SetDirection(tview.FlexColumn).
AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(nil, 4+(currentIndex*2), 1, false).
AddItem(p, 1, 1, true).
AddItem(nil, 0, 1, false), 0, 1, true).
AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(nil, 0, 1, false).
AddItem(nil, 5, 1, false), 0, 3, false), 0, 1, true).
AddItem(nil, 1, 1, false)
}
list := tview.NewList()
list.SetTitle("History").SetBorder(true)
for i := 0; i < 50; i++ {
list.AddItem("item "+strconv.FormatInt(int64(i), 10), "", rune(0), nil)
}
list.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
currentIndex := list.GetCurrentItem()
currentTitle, _ := list.GetItemText(currentIndex)
switch event.Rune() {
case 'j':
if list.GetCurrentItem() < list.GetItemCount() {
list.SetCurrentItem(list.GetCurrentItem() + 1)
}
case 'k':
if list.GetCurrentItem() > 0 {
list.SetCurrentItem(list.GetCurrentItem() - 1)
}
case 'e':
editTitleInputField.SetText(currentTitle)
pages.AddPage(pageEditTitle, modal(editTitleInputField, currentIndex), true, false)
pages.ShowPage(pageEditTitle)
}
return event
})
textView := tview.NewTextView()
textView.SetTitle("Conversation").SetBorder(true)
textArea := tview.NewTextArea()
textArea.SetTitle("Question").SetBorder(true)
mainFlex := tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(tview.NewFlex().SetDirection(tview.FlexColumn).
AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(button, 3, 1, false).
AddItem(list, 0, 1, false), 0, 1, false).
AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(textView, 0, 1, false).
AddItem(textArea, 5, 1, false), 0, 3, false), 0, 1, false)
pages.
AddPage("main", mainFlex, true, true).
AddPage(pageEditTitle, modal(editTitleInputField, list.GetCurrentItem()), true, false)
if err := app.SetRoot(pages, true).SetFocus(list).Run(); err != nil {
panic(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment