From a38bd44a7adddec00a07d9c227c7efc05912d3ee Mon Sep 17 00:00:00 2001 From: Edouard Paris Date: Fri, 22 Mar 2019 09:36:13 +0100 Subject: [PATCH] ui: add controller --- cli/cli.go | 2 +- ui/controller.go | 86 ++++++++++++++++++++++++++++++++++++++++++++++++ ui/ui.go | 85 +++-------------------------------------------- 3 files changed, 92 insertions(+), 81 deletions(-) create mode 100644 ui/controller.go diff --git a/cli/cli.go b/cli/cli.go index f2dda0c..234e767 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -54,7 +54,7 @@ func run(c *cli.Context) error { a := &app.App{Network: network} - return ui.New(a).Run() + return ui.Run(context.Background(), a) } func getNetworkFromConfig(c *cli.Context) (*network.Network, error) { diff --git a/ui/controller.go b/ui/controller.go new file mode 100644 index 0000000..7c1c166 --- /dev/null +++ b/ui/controller.go @@ -0,0 +1,86 @@ +package ui + +import ( + "context" + + "github.com/edouardparis/lntop/app" + "github.com/edouardparis/lntop/ui/views" + "github.com/jroimartin/gocui" +) + +type controller struct { + app *app.App + channels *views.Channels +} + +func (c *controller) layout(g *gocui.Gui) error { + maxX, maxY := g.Size() + return c.channels.Set(g, 0, maxY/8, maxX-1, maxY-1) +} + +func cursorDown(g *gocui.Gui, v *gocui.View) error { + if v != nil { + cx, cy := v.Cursor() + if err := v.SetCursor(cx, cy+1); err != nil { + ox, oy := v.Origin() + if err := v.SetOrigin(ox, oy+1); err != nil { + return err + } + } + } + return nil +} + +func cursorUp(g *gocui.Gui, v *gocui.View) error { + if v != nil { + ox, oy := v.Origin() + cx, cy := v.Cursor() + if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 { + if err := v.SetOrigin(ox, oy-1); err != nil { + return err + } + } + } + return nil +} + +func (c *controller) Refresh(ctx context.Context) func(*gocui.Gui) error { + return func(g *gocui.Gui) error { + channels, err := c.app.Network.ListChannels(ctx) + if err != nil { + return err + } + c.channels.Update(channels) + return nil + } +} + +func quit(g *gocui.Gui, v *gocui.View) error { + return gocui.ErrQuit +} + +func (c *controller) setKeyBinding(g *gocui.Gui) error { + err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit) + if err != nil { + return err + } + + err = g.SetKeybinding("", gocui.KeyArrowUp, gocui.ModNone, cursorUp) + if err != nil { + return err + } + + err = g.SetKeybinding("", gocui.KeyArrowDown, gocui.ModNone, cursorDown) + if err != nil { + return err + } + + return nil +} + +func newController(app *app.App) *controller { + return &controller{ + app: app, + channels: views.NewChannels(), + } +} diff --git a/ui/ui.go b/ui/ui.go index 3447fe7..3b1e93d 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -6,15 +6,9 @@ import ( "github.com/jroimartin/gocui" "github.com/edouardparis/lntop/app" - "github.com/edouardparis/lntop/ui/views" ) -type Ui struct { - app *app.App - channels *views.Channels -} - -func (u *Ui) Run() error { +func Run(ctx context.Context, app *app.App) error { g, err := gocui.NewGui(gocui.OutputNormal) if err != nil { return err @@ -22,14 +16,15 @@ func (u *Ui) Run() error { defer g.Close() g.Cursor = true - g.SetManagerFunc(u.layout) + ctrl := newController(app) + g.SetManagerFunc(ctrl.layout) - err = u.setKeyBinding(g) + err = ctrl.setKeyBinding(g) if err != nil { return err } - g.Update(u.Refresh) + g.Update(ctrl.Refresh(ctx)) err = g.MainLoop() if err != nil && err != gocui.ErrQuit { @@ -38,73 +33,3 @@ func (u *Ui) Run() error { return err } - -func (u *Ui) setKeyBinding(g *gocui.Gui) error { - err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit) - if err != nil { - return err - } - - err = g.SetKeybinding("", gocui.KeyArrowUp, gocui.ModNone, cursorUp) - if err != nil { - return err - } - - err = g.SetKeybinding("", gocui.KeyArrowDown, gocui.ModNone, cursorDown) - if err != nil { - return err - } - - return nil -} - -func cursorDown(g *gocui.Gui, v *gocui.View) error { - if v != nil { - cx, cy := v.Cursor() - if err := v.SetCursor(cx, cy+1); err != nil { - ox, oy := v.Origin() - if err := v.SetOrigin(ox, oy+1); err != nil { - return err - } - } - } - return nil -} - -func cursorUp(g *gocui.Gui, v *gocui.View) error { - if v != nil { - ox, oy := v.Origin() - cx, cy := v.Cursor() - if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 { - if err := v.SetOrigin(ox, oy-1); err != nil { - return err - } - } - } - return nil -} - -func (u *Ui) Refresh(g *gocui.Gui) error { - channels, err := u.app.Network.ListChannels(context.Background()) - if err != nil { - return err - } - u.channels.Update(channels) - return nil -} - -func (u *Ui) layout(g *gocui.Gui) error { - maxX, maxY := g.Size() - return u.channels.Set(g, 0, maxY/8, maxX-1, maxY-1) -} - -func quit(g *gocui.Gui, v *gocui.View) error { - return gocui.ErrQuit -} - -func New(app *app.App) *Ui { - return &Ui{ - app: app, - channels: views.NewChannels(), - } -}