You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lntop/ui/cursor/cursor.go

167 lines
2.5 KiB
Go

package cursor
type View interface {
Cursor() (int, int)
Origin() (int, int)
Speed() (right int, left int, down int, up int)
Limits() (pageSize int, fullSize int)
SetCursor(int, int) error
SetOrigin(int, int) error
}
func Down(v View) error {
if v == nil {
return nil
}
cx, cy := v.Cursor()
ox, oy := v.Origin()
_, _, sy, _ := v.Speed()
_, fs := v.Limits()
if cy+oy+sy >= fs {
return nil
}
err := v.SetCursor(cx, cy+sy)
if err != nil {
err := v.SetOrigin(ox, oy+sy)
if err != nil {
return err
}
}
return nil
}
func Up(v View) error {
if v == nil {
return nil
}
ox, oy := v.Origin()
cx, cy := v.Cursor()
_, _, _, sy := v.Speed()
err := v.SetCursor(cx, cy-sy)
if err != nil && oy >= sy {
err := v.SetOrigin(ox, oy-sy)
if err != nil {
return err
}
}
return nil
}
func Right(v View) error {
if v == nil {
return nil
}
cx, cy := v.Cursor()
sx, _, _, _ := v.Speed()
err := v.SetCursor(cx+sx, cy)
if err != nil {
ox, oy := v.Origin()
err := v.SetOrigin(ox+sx, oy)
if err != nil {
return err
}
}
return nil
}
func Left(v View) error {
if v == nil {
return nil
}
ox, oy := v.Origin()
cx, cy := v.Cursor()
_, sx, _, _ := v.Speed()
err := v.SetCursor(cx-sx, cy)
if err != nil {
err := v.SetCursor(0, cy)
if err != nil {
return err
}
if ox >= sx-cx {
err := v.SetOrigin(ox-sx+cx, oy)
if err != nil {
return err
}
}
}
return nil
}
func Home(v View) error {
if v == nil {
return nil
}
ox, _ := v.Origin()
cx, _ := v.Cursor()
v.SetCursor(cx, 0)
v.SetOrigin(ox, 0)
return nil
}
func End(v View) error {
if v == nil {
return nil
}
ps, fs := v.Limits()
if ps == 0 { // no pagination
return nil
}
if ps > fs {
ps = fs
}
ox, _ := v.Origin()
cx, _ := v.Cursor()
v.SetCursor(cx, ps-1)
v.SetOrigin(ox, fs-ps)
return nil
}
func PageDown(v View) error {
if v == nil {
return nil
}
ps, fs := v.Limits()
if ps == 0 { // no pagination
return nil
}
if ps > fs {
ps = fs
}
ox, oy := v.Origin()
cx, cy := v.Cursor()
ny := oy + cy + ps
if ny >= fs {
ny = fs - 1
}
if ny >= fs-ps {
v.SetOrigin(ox, fs-ps)
v.SetCursor(cx, ny-fs+ps)
} else {
v.SetOrigin(ox, ny-ps)
v.SetCursor(cx, ps-1)
}
return nil
}
func PageUp(v View) error {
if v == nil {
return nil
}
ox, oy := v.Origin()
cx, cy := v.Cursor()
ps, _ := v.Limits()
ny := oy + cy - ps
if ny <= 0 {
ny = 0
}
if ny <= ps {
v.SetOrigin(ox, 0)
v.SetCursor(cx, ny)
} else {
v.SetOrigin(ox, ny)
v.SetCursor(cx, 0)
}
return nil
}