2022-05-01 17:41:24 +03:00
|
|
|
package m
|
|
|
|
|
|
|
|
import (
|
2022-05-01 17:49:48 +03:00
|
|
|
"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
|
2024-01-09 19:28:49 +03:00
|
|
|
|
|
|
|
gotoLineString string
|
2024-01-09 15:38:52 +03:00
|
|
|
}
|
|
|
|
|
2024-01-09 19:28:49 +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
|
2024-01-09 19:28:49 +03:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2024-01-09 19:28:49 +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:
|
2024-01-09 19:28:49 +03:00
|
|
|
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:
|
2024-01-09 19:28:49 +03:00
|
|
|
if len(m.gotoLineString) == 0 {
|
2022-05-01 18:24:11 +03:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-01-09 19:28:49 +03:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2024-01-09 19:28:49 +03:00
|
|
|
func (m *PagerModeGotoLine) onRune(char rune) {
|
2024-01-09 15:38:52 +03:00
|
|
|
p := m.pager
|
|
|
|
|
2023-02-19 05:15:04 +03:00
|
|
|
if char == 'q' {
|
2024-01-09 15:38:52 +03:00
|
|
|
p.mode = PagerModeViewing{pager: p}
|
2023-02-19 05:15:04 +03:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-09-17 22:55:34 +03:00
|
|
|
if char == 'g' {
|
|
|
|
p.scrollPosition = newScrollPosition("Pager scroll position")
|
|
|
|
p.handleScrolledUp()
|
2024-01-09 15:38:52 +03:00
|
|
|
p.mode = PagerModeViewing{pager: p}
|
2023-09-17 22:55:34 +03:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-01-09 19:28:49 +03:00
|
|
|
newGotoLineString := m.gotoLineString + string(char)
|
2024-03-13 08:49:20 +03:00
|
|
|
newGotoLineNumber, err := strconv.Atoi(newGotoLineString)
|
2022-05-01 17:49:48 +03:00
|
|
|
if err != nil {
|
2022-05-02 07:57:48 +03:00
|
|
|
log.Debugf("Got non-number goto rune '%s'/0x%08x: %s", string(char), int32(char), err)
|
2022-05-01 17:49:48 +03:00
|
|
|
return
|
|
|
|
}
|
2024-03-13 08:49:20 +03:00
|
|
|
if newGotoLineNumber < 1 {
|
|
|
|
log.Debugf("Got non-positive goto line number: %d", newGotoLineNumber)
|
|
|
|
return
|
|
|
|
}
|
2022-05-01 17:49:48 +03:00
|
|
|
|
2024-01-09 19:28:49 +03:00
|
|
|
m.gotoLineString = newGotoLineString
|
2022-05-01 17:41:24 +03:00
|
|
|
}
|