github.com/xyproto/u-root@v6.0.1-0.20200302025726-5528e0c77a3c+incompatible/cmds/core/elvish/edit/ui/render.go (about) 1 package ui 2 3 // Renderer wraps the Render method. 4 type Renderer interface { 5 // Render renders onto a Buffer. 6 Render(b *Buffer) 7 } 8 9 // Render creates a new Buffer with the given width, and lets a Renderer render 10 // onto it. 11 func Render(r Renderer, width int) *Buffer { 12 if r == nil { 13 return nil 14 } 15 b := NewBuffer(width) 16 r.Render(b) 17 return b 18 } 19 20 // NewModeLineRenderer returns a Renderer for a mode line. 21 func NewModeLineRenderer(title, filter string) Renderer { 22 return modeLineRenderer{title, filter} 23 } 24 25 type modeLineRenderer struct { 26 title string 27 filter string 28 } 29 30 func (ml modeLineRenderer) Render(b *Buffer) { 31 b.WriteString(ml.title, styleForMode.String()) 32 b.WriteSpaces(1, "") 33 b.WriteString(ml.filter, styleForFilter.String()) 34 b.Dot = b.Cursor() 35 } 36 37 func NewModeLineWithScrollBarRenderer(base Renderer, n, low, high int) Renderer { 38 return &modeLineWithScrollBarRenderer{base, n, low, high} 39 } 40 41 type modeLineWithScrollBarRenderer struct { 42 base Renderer 43 n, low, high int 44 } 45 46 func (ml modeLineWithScrollBarRenderer) Render(b *Buffer) { 47 ml.base.Render(b) 48 49 scrollbarWidth := b.Width - CellsWidth(b.Lines[len(b.Lines)-1]) - 2 50 if scrollbarWidth >= 3 { 51 b.WriteSpaces(1, "") 52 writeHorizontalScrollbar(b, ml.n, ml.low, ml.high, scrollbarWidth) 53 } 54 }