refac cursor

pull/10/head
Edouard Paris 5 years ago
parent 1d570872f0
commit f432f613d5

@ -8,6 +8,7 @@ import (
"github.com/edouardparis/lntop/app"
"github.com/edouardparis/lntop/events"
"github.com/edouardparis/lntop/logging"
"github.com/edouardparis/lntop/ui/cursor"
"github.com/edouardparis/lntop/ui/models"
"github.com/edouardparis/lntop/ui/views"
)
@ -26,7 +27,7 @@ func (c *controller) layout(g *gocui.Gui) error {
func (c *controller) cursorDown(g *gocui.Gui, v *gocui.View) error {
view := c.views.Get(v)
if view != nil {
return view.CursorDown()
return cursor.Down(view)
}
return nil
}
@ -34,7 +35,7 @@ func (c *controller) cursorDown(g *gocui.Gui, v *gocui.View) error {
func (c *controller) cursorUp(g *gocui.Gui, v *gocui.View) error {
view := c.views.Get(v)
if view != nil {
return view.CursorUp()
return cursor.Up(view)
}
return nil
}
@ -42,7 +43,7 @@ func (c *controller) cursorUp(g *gocui.Gui, v *gocui.View) error {
func (c *controller) cursorRight(g *gocui.Gui, v *gocui.View) error {
view := c.views.Get(v)
if view != nil {
return view.CursorRight()
return cursor.Right(view)
}
return nil
}
@ -50,7 +51,7 @@ func (c *controller) cursorRight(g *gocui.Gui, v *gocui.View) error {
func (c *controller) cursorLeft(g *gocui.Gui, v *gocui.View) error {
view := c.views.Get(v)
if view != nil {
return view.CursorLeft()
return cursor.Left(view)
}
return nil
}

@ -0,0 +1,84 @@
package cursor
type View interface {
Cursor() (int, int)
Origin() (int, int)
Speed() (int, int, int, int)
SetCursor(int, int) error
SetOrigin(int, int) error
}
func Down(v View) error {
if v == nil {
return nil
}
cx, cy := v.Cursor()
_, _, sy, _ := v.Speed()
err := v.SetCursor(cx, cy+sy)
if err != nil {
ox, oy := v.Origin()
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
}

@ -35,20 +35,24 @@ func (c *Channel) Wrap(v *gocui.View) view {
return c
}
func (c *Channel) CursorDown() error {
return cursorDown(c.view, 1)
func (c Channel) Origin() (int, int) {
return c.view.Origin()
}
func (c *Channel) CursorUp() error {
return cursorUp(c.view, 1)
func (c Channel) Cursor() (int, int) {
return c.view.Cursor()
}
func (c *Channel) CursorRight() error {
return cursorRight(c.view, 1)
func (c Channel) Speed() (int, int, int, int) {
return 1, 1, 1, 1
}
func (c *Channel) CursorLeft() error {
return cursorLeft(c.view, 1)
func (c *Channel) SetCursor(x, y int) error {
return c.view.SetCursor(x, y)
}
func (c *Channel) SetOrigin(x, y int) error {
return c.view.SetOrigin(x, y)
}
func (c *Channel) Set(g *gocui.Gui, x0, y0, x1, y1 int) error {

@ -43,6 +43,9 @@ type Channels struct {
columnsView *gocui.View
view *gocui.View
channels *models.Channels
ox, oy int
cx, cy int
}
type channelsColumn struct {
@ -52,12 +55,6 @@ type channelsColumn struct {
display func(*netmodels.Channel, ...color.Option) string
}
func (c Channels) Index() int {
_, oy := c.view.Origin()
_, cy := c.view.Cursor()
return cy + oy
}
func (c Channels) Name() string {
return CHANNELS
}
@ -67,60 +64,69 @@ func (c *Channels) Wrap(v *gocui.View) view {
return c
}
func (c *Channels) CursorDown() error {
return cursorDown(c.view, 1)
func (c Channels) Origin() (int, int) {
return c.ox, c.oy
}
func (c *Channels) CursorUp() error {
return cursorUp(c.view, 1)
func (c Channels) Cursor() (int, int) {
return c.cx, c.cy
}
func (c *Channels) CursorRight() error {
if c.current > len(c.columns)-1 {
return nil
func (c *Channels) SetCursor(cx, cy int) error {
err := c.columnsView.SetCursor(cx, 0)
if err != nil {
return err
}
speed := c.columns[c.current].width + 1
if c.current == len(c.columns)-1 {
speed := c.columns[c.current].width + 1
err := cursorRight(c.columnsView, speed)
if err != nil {
return err
}
err = cursorRight(c.view, speed)
if err != nil {
return err
}
err = cursorLeft(c.columnsView, speed)
if err != nil {
return err
}
err = c.view.SetCursor(cx, cy)
if err != nil {
return err
}
return cursorLeft(c.view, speed)
if cx > c.cx && c.current < len(c.columns) {
c.current++
} else if cx <= c.cx && c.current != 0 {
c.current--
}
c.current++
err := cursorRight(c.columnsView, speed)
c.cx, c.cy = cx, cy
return nil
}
func (c *Channels) SetOrigin(ox, oy int) error {
err := c.columnsView.SetOrigin(ox, 0)
if err != nil {
return err
}
err = c.view.SetOrigin(ox, oy)
if err != nil {
return err
}
if ox > c.ox && c.current < len(c.columns) {
c.current++
}
return cursorRight(c.view, speed)
c.ox, c.oy = ox, oy
return nil
}
func (c *Channels) CursorLeft() error {
if c.current == 0 {
return nil
func (c *Channels) Speed() (int, int, int, int) {
if c.current > len(c.columns)-1 {
return 0, c.columns[c.current-1].width + 1, 1, 1
}
speed := c.columns[c.current-1].width + 1
c.current--
err := cursorLeft(c.columnsView, speed)
if err != nil {
return err
if c.current == 0 {
return c.columns[0].width + 1, 0, 1, 1
}
return c.columns[c.current].width + 1,
c.columns[c.current-1].width + 1,
1, 1
}
return cursorLeft(c.view, speed)
func (c Channels) Index() int {
_, oy := c.Origin()
_, cy := c.Cursor()
return cy + oy
}
func (c Channels) Delete(g *gocui.Gui) error {

@ -1,74 +0,0 @@
package views
import "github.com/jroimartin/gocui"
func cursorDown(v *gocui.View, speed int) error {
if v == nil {
return nil
}
cx, cy := v.Cursor()
err := v.SetCursor(cx, cy+speed)
if err != nil {
ox, oy := v.Origin()
err := v.SetOrigin(ox, oy+speed)
if err != nil {
return err
}
}
return nil
}
func cursorUp(v *gocui.View, speed int) error {
if v == nil {
return nil
}
ox, oy := v.Origin()
cx, cy := v.Cursor()
err := v.SetCursor(cx, cy-speed)
if err != nil && oy >= speed {
err := v.SetOrigin(ox, oy-speed)
if err != nil {
return err
}
}
return nil
}
func cursorRight(v *gocui.View, speed int) error {
if v == nil {
return nil
}
cx, cy := v.Cursor()
err := v.SetCursor(cx+speed, cy)
if err != nil {
ox, oy := v.Origin()
err := v.SetOrigin(ox+speed, oy)
if err != nil {
return err
}
}
return nil
}
func cursorLeft(v *gocui.View, speed int) error {
if v == nil {
return nil
}
ox, oy := v.Origin()
cx, cy := v.Cursor()
err := v.SetCursor(cx-speed, cy)
if err != nil {
err := v.SetCursor(0, cy)
if err != nil {
return err
}
if ox >= speed-cx {
err := v.SetOrigin(ox-speed+cx, oy)
if err != nil {
return err
}
}
}
return nil
}

@ -30,20 +30,24 @@ func (h Help) Delete(g *gocui.Gui) error {
return g.DeleteView(HELP)
}
func (h *Help) CursorDown() error {
return cursorDown(h.view, 1)
func (h Help) Origin() (int, int) {
return h.view.Origin()
}
func (h *Help) CursorUp() error {
return cursorUp(h.view, 1)
func (h Help) Cursor() (int, int) {
return h.view.Cursor()
}
func (h *Help) CursorRight() error {
return cursorRight(h.view, 1)
func (h Help) Speed() (int, int, int, int) {
return 1, 1, 1, 1
}
func (h *Help) CursorLeft() error {
return cursorLeft(h.view, 1)
func (h *Help) SetCursor(x, y int) error {
return h.view.SetCursor(x, y)
}
func (h *Help) SetOrigin(x, y int) error {
return h.view.SetOrigin(x, y)
}
func (h Help) Set(g *gocui.Gui, x0, y0, x1, y1 int) error {

@ -29,20 +29,24 @@ func (h *Menu) Wrap(v *gocui.View) view {
return h
}
func (h *Menu) CursorDown() error {
return cursorDown(h.view, 1)
func (h Menu) Origin() (int, int) {
return h.view.Origin()
}
func (h *Menu) CursorUp() error {
return cursorUp(h.view, 1)
func (h Menu) Cursor() (int, int) {
return h.view.Cursor()
}
func (h *Menu) CursorRight() error {
return nil
func (h Menu) Speed() (int, int, int, int) {
return 1, 1, 1, 1
}
func (h *Menu) CursorLeft() error {
return nil
func (h *Menu) SetCursor(x, y int) error {
return h.view.SetCursor(x, y)
}
func (h *Menu) SetOrigin(x, y int) error {
return h.view.SetOrigin(x, y)
}
func (h Menu) Current() string {

@ -35,20 +35,24 @@ func (c *Transaction) Wrap(v *gocui.View) view {
return c
}
func (c *Transaction) CursorDown() error {
return cursorDown(c.view, 1)
func (c Transaction) Origin() (int, int) {
return c.view.Origin()
}
func (c *Transaction) CursorUp() error {
return cursorUp(c.view, 1)
func (c Transaction) Cursor() (int, int) {
return c.view.Cursor()
}
func (c *Transaction) CursorRight() error {
return cursorRight(c.view, 1)
func (c Transaction) Speed() (int, int, int, int) {
return 1, 1, 1, 1
}
func (c *Transaction) CursorLeft() error {
return cursorLeft(c.view, 1)
func (c *Transaction) SetCursor(x, y int) error {
return c.view.SetCursor(x, y)
}
func (c *Transaction) SetOrigin(x, y int) error {
return c.view.SetOrigin(x, y)
}
func (c *Transaction) Set(g *gocui.Gui, x0, y0, x1, y1 int) error {

@ -34,6 +34,9 @@ type Transactions struct {
columnsView *gocui.View
view *gocui.View
transactions *models.Transactions
ox, oy int
cx, cy int
}
type transactionsColumn struct {
@ -57,58 +60,63 @@ func (c *Transactions) Wrap(v *gocui.View) view {
return c
}
func (c *Transactions) CursorDown() error {
return cursorDown(c.view, 1)
func (c Transactions) Origin() (int, int) {
return c.ox, c.oy
}
func (c *Transactions) CursorUp() error {
return cursorUp(c.view, 1)
func (c Transactions) Cursor() (int, int) {
return c.cx, c.cy
}
func (c *Transactions) CursorRight() error {
if c.current > len(c.columns)-1 {
return nil
func (c *Transactions) SetCursor(cx, cy int) error {
err := c.columnsView.SetCursor(cx, 0)
if err != nil {
return err
}
speed := c.columns[c.current].width + 1
if c.current == len(c.columns)-1 {
speed := c.columns[c.current].width + 1
err := cursorRight(c.columnsView, speed)
if err != nil {
return err
}
err = cursorRight(c.view, speed)
if err != nil {
return err
}
err = cursorLeft(c.columnsView, speed)
if err != nil {
return err
}
return cursorLeft(c.view, speed)
}
c.current++
err := cursorRight(c.columnsView, speed)
err = c.view.SetCursor(cx, cy)
if err != nil {
return err
}
return cursorRight(c.view, speed)
if cx > c.cx && c.current < len(c.columns) {
c.current++
} else if cx <= c.cx && c.current != 0 {
c.current--
}
c.cx, c.cy = cx, cy
return nil
}
func (c *Transactions) CursorLeft() error {
if c.current == 0 {
return nil
func (c *Transactions) SetOrigin(ox, oy int) error {
err := c.columnsView.SetOrigin(ox, 0)
if err != nil {
return err
}
speed := c.columns[c.current-1].width + 1
c.current--
err := cursorLeft(c.columnsView, speed)
err = c.view.SetOrigin(ox, oy)
if err != nil {
return err
}
return cursorLeft(c.view, speed)
if ox > c.ox && c.current < len(c.columns) {
c.current++
}
c.ox, c.oy = ox, oy
return nil
}
func (c *Transactions) Speed() (int, int, int, int) {
if c.current > len(c.columns)-1 {
return 0, c.columns[c.current-1].width + 1, 1, 1
}
if c.current == 0 {
return c.columns[0].width + 1, 0, 1, 1
}
return c.columns[c.current].width + 1,
c.columns[c.current-1].width + 1,
1, 1
}
func (c Transactions) Delete(g *gocui.Gui) error {

@ -10,10 +10,11 @@ import (
type view interface {
Set(*gocui.Gui, int, int, int, int) error
Wrap(*gocui.View) view
CursorLeft() error
CursorRight() error
CursorUp() error
CursorDown() error
SetCursor(int, int) error
SetOrigin(int, int) error
Origin() (int, int)
Speed() (int, int, int, int)
Cursor() (int, int)
Name() string
Delete(*gocui.Gui) error
}

Loading…
Cancel
Save