diff --git a/_demos/demo2.go b/_demos/demo2.go index 7418ff4..dbc753d 100644 --- a/_demos/demo2.go +++ b/_demos/demo2.go @@ -40,6 +40,34 @@ func showHideCursor(g *gocui.Gui, v *gocui.View) error { } +func cursorDown(g *gocui.Gui, v *gocui.View) error { + if v != nil { + v.SetCursor(v.CX, v.CY+1) + } + return nil +} + +func cursorUp(g *gocui.Gui, v *gocui.View) error { + if v != nil { + v.SetCursor(v.CX, v.CY-1) + } + return nil +} + +func cursorLeft(g *gocui.Gui, v *gocui.View) error { + if v != nil { + v.SetCursor(v.CX-1, v.CY) + } + return nil +} + +func cursorRight(g *gocui.Gui, v *gocui.View) error { + if v != nil { + v.SetCursor(v.CX+1, v.CY) + } + return nil +} + func keybindings(g *gocui.Gui) error { if err := g.SetKeybinding("", gocui.KeyCtrlM, 0, focusMain); err != nil { return err @@ -50,15 +78,28 @@ func keybindings(g *gocui.Gui) error { if err := g.SetKeybinding("", gocui.KeyCtrlL, 0, focusCmdLine); err != nil { return err } - if err := g.SetKeybinding("", gocui.KeyCtrlC, 0, quit); err != nil { + if err := g.SetKeybinding("", 'c', gocui.ModAlt, showHideCursor); err != nil { return err } - if err := g.SetKeybinding("", 'c', gocui.ModAlt, showHideCursor); err != nil { + if err := g.SetKeybinding("", 'j', 0, cursorDown); err != nil { + return err + } + if err := g.SetKeybinding("", 'k', 0, cursorUp); err != nil { + return err + } + if err := g.SetKeybinding("", 'h', 0, cursorLeft); err != nil { + return err + } + if err := g.SetKeybinding("", 'l', 0, cursorRight); err != nil { + return err + } + if err := g.SetKeybinding("main", gocui.KeyCtrlC, 0, quit); err != nil { return err } if err := g.SetKeybinding("main", 'q', 0, quit); err != nil { return err } + return nil } diff --git a/gui.go b/gui.go index 748bb7f..cd16e29 100644 --- a/gui.go +++ b/gui.go @@ -348,7 +348,7 @@ func (g *Gui) onKey(ev *termbox.Event) (err error) { for _, kb := range g.keybindings { if ev.Ch == kb.Ch && Key(ev.Key) == kb.Key && Modifier(ev.Mod) == kb.Mod && (kb.ViewName == "" || (g.CurrentView != nil && kb.ViewName == g.CurrentView.Name)) { - if err := kb.CB(g, nil); err != nil { + if err := kb.CB(g, g.CurrentView); err != nil { return err } } diff --git a/view.go b/view.go index 25a3cea..a50225a 100644 --- a/view.go +++ b/view.go @@ -1,6 +1,7 @@ package gocui import ( + "errors" "github.com/nsf/termbox-go" ) @@ -26,3 +27,16 @@ func NewView(name string, x0, y0, x1, y1 int) (v *View) { } return v } + +func (v *View) SetCursor(x, y int) (err error) { + if x < 0 || v.X0+x+1 >= v.X1 || y < 0 || v.Y0+y+1 >= v.Y1 { + return errors.New("invalid point") + } + v.CX = x + v.CY = y + return nil +} + +func (v *View) Write(p []byte) (n int, err error) { + return 0, nil +}