forked from cwtch.im/cwtch
107 lines
2.2 KiB
Go
107 lines
2.2 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"strings"
|
||
|
|
||
|
"github.com/jroimartin/gocui"
|
||
|
)
|
||
|
|
||
|
func editor(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) {
|
||
|
//state.HideHelp = true
|
||
|
|
||
|
//if state.Mode == modeEscape {
|
||
|
// escEditor(v, key, ch, mod)
|
||
|
// return
|
||
|
//}
|
||
|
|
||
|
if ch != 0 && mod == 0 {
|
||
|
v.EditWrite(ch)
|
||
|
}
|
||
|
|
||
|
switch key {
|
||
|
case gocui.KeyEsc:
|
||
|
//state.Mode = modeEscape
|
||
|
//state.KeepAutoscrolling = true
|
||
|
|
||
|
// Space, backspace, Del
|
||
|
case gocui.KeySpace:
|
||
|
v.EditWrite(' ')
|
||
|
case gocui.KeyBackspace, gocui.KeyBackspace2:
|
||
|
v.EditDelete(true)
|
||
|
moveAhead(v)
|
||
|
case gocui.KeyDelete:
|
||
|
v.EditDelete(false)
|
||
|
|
||
|
// Cursor movement
|
||
|
case gocui.KeyArrowLeft:
|
||
|
v.MoveCursor(-1, 0, false)
|
||
|
moveAhead(v)
|
||
|
case gocui.KeyArrowRight:
|
||
|
x, _ := v.Cursor()
|
||
|
x2, _ := v.Origin()
|
||
|
x += x2
|
||
|
buf := v.Buffer()
|
||
|
// I don't know really how this works, this was mostly obtained through trial
|
||
|
// and error. Anyway, this system impedes going on a newline by moving right.
|
||
|
// This is usually possible because once you write something to the buffer
|
||
|
// it automatically adds " \n", which is two characters. Sooo yeah.
|
||
|
if buf != "" && len(buf) > (x+2) {
|
||
|
v.MoveCursor(1, 0, false)
|
||
|
}
|
||
|
|
||
|
case gocui.KeyEnter:
|
||
|
buf := v.Buffer()
|
||
|
v.Clear()
|
||
|
v.SetCursor(0, 0)
|
||
|
|
||
|
if buf != "" {
|
||
|
buf = buf[:len(buf)-1]
|
||
|
}
|
||
|
if strings.TrimSpace(buf) != "" {
|
||
|
//state.PushAction(buf)
|
||
|
//state.ActionIndex = -1
|
||
|
}
|
||
|
|
||
|
enterActionConnect(buf)
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func setText(v *gocui.View, text string) {
|
||
|
v.Clear()
|
||
|
// Why are we doing this? Because normally when you write a line
|
||
|
// gocui adds " \n" at the end of it. Whe clearing and adding, though,
|
||
|
// the space isn't added back.
|
||
|
v.Write([]byte(text + " "))
|
||
|
v.SetCursor(len(text), 0)
|
||
|
}
|
||
|
|
||
|
// moveAhead displays the next 10 characters when moving backwards,
|
||
|
// in order to see where we're moving or what we're deleting.
|
||
|
func moveAhead(v *gocui.View) {
|
||
|
cX, _ := v.Cursor()
|
||
|
oX, _ := v.Origin()
|
||
|
if cX < 10 && oX > 0 {
|
||
|
newOX := oX - 10
|
||
|
forward := 10
|
||
|
if newOX < 0 {
|
||
|
forward += newOX
|
||
|
newOX = 0
|
||
|
}
|
||
|
v.SetOrigin(newOX, 0)
|
||
|
v.MoveCursor(forward, 0, false)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func enterActionConnect(buf string) {
|
||
|
//log.Printf("Connecting: %s",buf)
|
||
|
connect(buf)
|
||
|
}
|
||
|
|
||
|
func moveDown(v *gocui.View) {
|
||
|
_, yPos := v.Cursor()
|
||
|
if _, err := v.Line(yPos + 1); err == nil {
|
||
|
v.MoveCursor(0, 1, false)
|
||
|
}
|
||
|
}
|