Feat: copy msg to clipboard; empty text to cancel edit; notify

This commit is contained in:
Grail Finder
2024-11-20 08:55:56 +03:00
parent aaf0566636
commit 74669b58fe
2 changed files with 46 additions and 15 deletions

45
main.go
View File

@@ -102,6 +102,12 @@ func main() {
editArea.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { editArea.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
if event.Key() == tcell.KeyEscape && editMode { if event.Key() == tcell.KeyEscape && editMode {
editedMsg := editArea.GetText() editedMsg := editArea.GetText()
if editedMsg == "" {
notifyUser("edit", "no edit provided")
pages.RemovePage("editArea")
editMode = false
return nil
}
chatBody.Messages[selectedIndex].Content = editedMsg chatBody.Messages[selectedIndex].Content = editedMsg
// change textarea // change textarea
textView.SetText(chatToText(showSystemMsgs)) textView.SetText(chatToText(showSystemMsgs))
@@ -120,22 +126,25 @@ func main() {
return return
}) })
indexPickWindow.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { indexPickWindow.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
if event.Key() == tcell.KeyEnter { si := indexPickWindow.GetText()
si := indexPickWindow.GetText() selectedIndex, err = strconv.Atoi(si)
selectedIndex, err = strconv.Atoi(si) if err != nil {
if err != nil { logger.Error("failed to convert provided index", "error", err, "si", si)
logger.Error("failed to convert provided index", "error", err, "si", si) }
} if len(chatBody.Messages) <= selectedIndex && selectedIndex < 0 {
if len(chatBody.Messages) <= selectedIndex && selectedIndex < 0 { logger.Warn("chosen index is out of bounds", "index", selectedIndex)
logger.Warn("chosen index is out of bounds", "index", selectedIndex) return nil
return nil }
} m := chatBody.Messages[selectedIndex]
if editMode && event.Key() == tcell.KeyEnter {
pages.AddPage("editArea", editArea, true, true) pages.AddPage("editArea", editArea, true, true)
m := chatBody.Messages[selectedIndex]
// editArea.SetText(m.ToText(selectedIndex), true)
editArea.SetText(m.Content, true) editArea.SetText(m.Content, true)
editMode = true }
// editArea.SetText(si, true) if !editMode && event.Key() == tcell.KeyEnter {
// TODO: add notification that text was copied
copyToClipboard(m.Content)
notification := fmt.Sprintf("msg '%s' was copied to the clipboard", m.Content[:30])
notifyUser("copied", notification)
} }
return event return event
}) })
@@ -172,8 +181,8 @@ func main() {
} }
if event.Key() == tcell.KeyF4 { if event.Key() == tcell.KeyF4 {
// edit msg // edit msg
pages.AddPage("getIndex", indexPickWindow, true, true)
editMode = true editMode = true
pages.AddPage("getIndex", indexPickWindow, true, true)
return nil return nil
} }
if event.Key() == tcell.KeyF5 { if event.Key() == tcell.KeyF5 {
@@ -186,6 +195,12 @@ func main() {
botRespMode = false botRespMode = false
return nil return nil
} }
if event.Key() == tcell.KeyF7 {
// copy msg to clipboard
editMode = false
pages.AddPage("getIndex", indexPickWindow, true, true)
return nil
}
// cannot send msg in editMode or botRespMode // cannot send msg in editMode or botRespMode
if event.Key() == tcell.KeyEscape && !editMode && !botRespMode { if event.Key() == tcell.KeyEscape && !editMode && !botRespMode {
fromRow, fromColumn, _, _ := textArea.GetCursor() fromRow, fromColumn, _, _ := textArea.GetCursor()

View File

@@ -4,6 +4,8 @@ import (
"elefant/models" "elefant/models"
"encoding/json" "encoding/json"
"fmt" "fmt"
"os/exec"
"strings"
"time" "time"
) )
@@ -90,3 +92,17 @@ func loadOldChatOrGetNew() []models.MessagesStory {
} }
return history return history
} }
func copyToClipboard(text string) error {
cmd := exec.Command("xclip", "-selection", "clipboard")
cmd.Stdin = nil
cmd.Stdout = nil
cmd.Stderr = nil
cmd.Stdin = strings.NewReader(text)
return cmd.Run()
}
func notifyUser(topic, message string) error {
cmd := exec.Command("notify-send", topic, message)
return cmd.Run()
}