1
1
mirror of https://github.com/walles/moar.git synced 2024-10-26 21:13:11 +03:00
moar/m/pagermode-go-to-line.go

91 lines
1.9 KiB
Go
Raw Permalink Normal View History

2022-05-01 17:41:24 +03:00
package m
import (
"strconv"
log "github.com/sirupsen/logrus"
2024-01-06 18:36:08 +03:00
"github.com/walles/moar/m/linenumbers"
2022-05-01 17:41:24 +03:00
"github.com/walles/moar/twin"
)
2024-01-09 15:38:52 +03:00
type PagerModeGotoLine struct {
pager *Pager
gotoLineString string
2024-01-09 15:38:52 +03:00
}
func (m *PagerModeGotoLine) drawFooter(_ string, _ string) {
2024-01-09 15:38:52 +03:00
p := m.pager
2022-05-01 17:42:49 +03:00
_, height := p.screen.Size()
pos := 0
for _, token := range "Go to line number: " + m.gotoLineString {
2022-05-01 17:42:49 +03:00
p.screen.SetCell(pos, height-1, twin.NewCell(token, twin.StyleDefault))
pos++
}
// Add a cursor
p.screen.SetCell(pos, height-1, twin.NewCell(' ', twin.StyleDefault.WithAttr(twin.AttrReverse)))
2022-05-01 17:41:24 +03:00
}
func (m *PagerModeGotoLine) onKey(key twin.KeyCode) {
2024-01-09 15:38:52 +03:00
p := m.pager
2022-05-01 18:24:11 +03:00
switch key {
case twin.KeyEnter:
newLineNumber, err := strconv.Atoi(m.gotoLineString)
2022-05-01 18:24:11 +03:00
if err == nil {
2024-01-06 18:36:08 +03:00
p.scrollPosition = NewScrollPositionFromLineNumber(
linenumbers.LineNumberFromOneBased(newLineNumber),
"onGotoLineKey",
)
2022-05-01 18:24:11 +03:00
}
2024-01-09 15:38:52 +03:00
p.mode = PagerModeViewing{pager: p}
2022-05-01 18:24:11 +03:00
case twin.KeyEscape:
2024-01-09 15:38:52 +03:00
p.mode = PagerModeViewing{pager: p}
2022-05-01 18:24:11 +03:00
case twin.KeyBackspace, twin.KeyDelete:
if len(m.gotoLineString) == 0 {
2022-05-01 18:24:11 +03:00
return
}
m.gotoLineString = removeLastChar(m.gotoLineString)
2022-05-01 18:24:11 +03:00
default:
log.Tracef("Unhandled goto key event %v, treating as a viewing key event", key)
2024-01-09 15:38:52 +03:00
p.mode = PagerModeViewing{pager: p}
p.mode.onKey(key)
2022-05-01 18:24:11 +03:00
}
2022-05-01 17:41:24 +03:00
}
func (m *PagerModeGotoLine) onRune(char rune) {
2024-01-09 15:38:52 +03:00
p := m.pager
if char == 'q' {
2024-01-09 15:38:52 +03:00
p.mode = PagerModeViewing{pager: p}
return
}
if char == 'g' {
p.scrollPosition = newScrollPosition("Pager scroll position")
p.handleScrolledUp()
2024-01-09 15:38:52 +03:00
p.mode = PagerModeViewing{pager: p}
return
}
newGotoLineString := m.gotoLineString + string(char)
newGotoLineNumber, err := strconv.Atoi(newGotoLineString)
if err != nil {
log.Debugf("Got non-number goto rune '%s'/0x%08x: %s", string(char), int32(char), err)
return
}
if newGotoLineNumber < 1 {
log.Debugf("Got non-positive goto line number: %d", newGotoLineNumber)
return
}
m.gotoLineString = newGotoLineString
2022-05-01 17:41:24 +03:00
}