This commit is contained in:
Grail Finder
2024-11-14 20:02:13 +03:00
commit 3cbad31a16
7 changed files with 502 additions and 0 deletions

87
main.go Normal file
View File

@@ -0,0 +1,87 @@
package main
import (
"fmt"
"unicode"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
var (
normalMode = false
botRespMode = false
botMsg = "no"
indexLine = "Row: [yellow]%d[white], Column: [yellow]%d; normal mode: %v"
)
func isASCII(s string) bool {
for i := 0; i < len(s); i++ {
if s[i] > unicode.MaxASCII {
return false
}
}
return true
}
func main() {
app := tview.NewApplication()
textArea := tview.NewTextArea().
SetPlaceholder("Type your prompt...")
textArea.SetBorder(true).SetTitle("input")
textView := tview.NewTextView().
SetDynamicColors(true).
SetRegions(true).
SetChangedFunc(func() {
app.Draw()
})
textView.SetBorder(true).SetTitle("chat")
position := tview.NewTextView().
SetDynamicColors(true).
SetTextAlign(tview.AlignCenter)
flex := tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(textView, 0, 40, false).
AddItem(textArea, 0, 10, true).
AddItem(position, 0, 1, false)
updateStatusLine := func() {
fromRow, fromColumn, toRow, toColumn := textArea.GetCursor()
if fromRow == toRow && fromColumn == toColumn {
position.SetText(fmt.Sprintf(indexLine, fromRow, fromColumn, normalMode))
} else {
position.SetText(fmt.Sprintf("[red]From[white] Row: [yellow]%d[white], Column: [yellow]%d[white] - [red]To[white] Row: [yellow]%d[white], To Column: [yellow]%d; normal mode: %v", fromRow, fromColumn, toRow, toColumn, normalMode))
}
}
textArea.SetMovedFunc(updateStatusLine)
updateStatusLine()
textView.SetText("<🤖>: Hello! What can I do for you?")
app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
if botRespMode {
// do nothing while bot typing
return nil
}
if event.Key() == tcell.KeyEscape {
fromRow, fromColumn, _, _ := textArea.GetCursor()
position.SetText(fmt.Sprintf(indexLine, fromRow, fromColumn, normalMode))
// read all text into buffer
msgText := textArea.GetText()
if msgText != "" {
fmt.Fprintf(textView, "\n<user>: %s\n", msgText)
textArea.SetText("", true)
}
// update statue line
go chatRound(msgText, userRole, textView)
return nil
}
if isASCII(string(event.Rune())) {
// normalMode = false
// fromRow, fromColumn, _, _ := textArea.GetCursor()
// position.SetText(fmt.Sprintf(indexLine, fromRow, fromColumn, normalMode))
return event
}
return event
})
if err := app.SetRoot(flex,
true).EnableMouse(true).Run(); err != nil {
panic(err)
}
}