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  }