diff --git a/lib/ui/context.go b/lib/ui/context.go index d7796bf..d450fd8 100644 --- a/lib/ui/context.go +++ b/lib/ui/context.go @@ -10,7 +10,9 @@ import ( // A context allows you to draw in a sub-region of the terminal type Context struct { + screen tcell.Screen viewport *views.ViewPort + x, y int } func (ctx *Context) X() int { @@ -35,7 +37,7 @@ func (ctx *Context) Height() int { func NewContext(width, height int, screen tcell.Screen) *Context { vp := views.NewViewPort(screen, 0, 0, width, height) - return &Context{vp} + return &Context{screen, vp, 0, 0} } func (ctx *Context) Subcontext(x, y, width, height int) *Context { @@ -47,7 +49,7 @@ func (ctx *Context) Subcontext(x, y, width, height int) *Context { panic(fmt.Errorf("Attempted to create context larger than parent")) } vp := views.NewViewPort(ctx.viewport, x, y, width, height) - return &Context{vp} + return &Context{ctx.screen, vp, ctx.x + x, ctx.y + y} } func (ctx *Context) SetCell(x, y int, ch rune, style tcell.Style) { @@ -105,10 +107,9 @@ func (ctx *Context) Fill(x, y, width, height int, rune rune, style tcell.Style) } func (ctx *Context) SetCursor(x, y int) { - // FIXME: Cursor needs to be set on tcell.Screen, or layout has to - // provide a CellModel - // cv := views.NewCellView() - // cv.Init() - // cv.SetView(ctx.viewport) - // cv.SetCursor(x, y) + ctx.screen.ShowCursor(ctx.x+x, ctx.y+y) +} + +func (ctx *Context) HideCursor() { + ctx.screen.HideCursor() } diff --git a/widgets/exline.go b/widgets/exline.go index ae83933..e0954d7 100644 --- a/widgets/exline.go +++ b/widgets/exline.go @@ -14,7 +14,9 @@ import ( type ExLine struct { command []rune commit func(cmd string) + ctx *ui.Context cancel func() + cells int index int scroll int @@ -24,6 +26,7 @@ type ExLine struct { func NewExLine(commit func(cmd string), cancel func()) *ExLine { return &ExLine{ cancel: cancel, + cells: -1, commit: commit, command: []rune{}, } @@ -40,10 +43,13 @@ func (ex *ExLine) Invalidate() { } func (ex *ExLine) Draw(ctx *ui.Context) { + ex.ctx = ctx // gross ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault) ctx.Printf(0, 0, tcell.StyleDefault, ":%s", string(ex.command)) cells := runewidth.StringWidth(string(ex.command[:ex.index])) - ctx.SetCursor(cells+1, 0) + if cells != ex.cells { + ctx.SetCursor(cells+1, 0) + } } func (ex *ExLine) insert(ch rune) { @@ -115,10 +121,10 @@ func (ex *ExLine) Event(event tcell.Event) bool { case tcell.KeyCtrlW: ex.deleteWord() case tcell.KeyEnter: - //ex.ctx.Screen().HideCursor() + ex.ctx.HideCursor() ex.commit(string(ex.command)) case tcell.KeyEsc, tcell.KeyCtrlC: - //ex.ctx.Screen().HideCursor() + ex.ctx.HideCursor() ex.cancel() default: if event.Rune() != 0 {