1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.
- // Use of this source code is governed by a MIT license that can
- // be found in the LICENSE file.
- package termui
- // Par displays a paragraph.
- /*
- par := termui.NewPar("Simple Text")
- par.Height = 3
- par.Width = 17
- par.BorderLabel = "Label"
- */
- type Par struct {
- Block
- Text string
- TextFgColor Attribute
- TextBgColor Attribute
- WrapLength int // words wrap limit. Note it may not work properly with multi-width char
- }
- // NewPar returns a new *Par with given text as its content.
- func NewPar(s string) *Par {
- return &Par{
- Block: *NewBlock(),
- Text: s,
- TextFgColor: ThemeAttr("par.text.fg"),
- TextBgColor: ThemeAttr("par.text.bg"),
- WrapLength: 0,
- }
- }
- // Buffer implements Bufferer interface.
- func (p *Par) Buffer() Buffer {
- buf := p.Block.Buffer()
- fg, bg := p.TextFgColor, p.TextBgColor
- cs := DefaultTxBuilder.Build(p.Text, fg, bg)
- // wrap if WrapLength set
- if p.WrapLength < 0 {
- cs = wrapTx(cs, p.Width-2)
- } else if p.WrapLength > 0 {
- cs = wrapTx(cs, p.WrapLength)
- }
- y, x, n := 0, 0, 0
- for y < p.innerArea.Dy() && n < len(cs) {
- w := cs[n].Width()
- if cs[n].Ch == '\n' || x+w > p.innerArea.Dx() {
- y++
- x = 0 // set x = 0
- if cs[n].Ch == '\n' {
- n++
- }
- if y >= p.innerArea.Dy() {
- buf.Set(p.innerArea.Min.X+p.innerArea.Dx()-1,
- p.innerArea.Min.Y+p.innerArea.Dy()-1,
- Cell{Ch: '…', Fg: p.TextFgColor, Bg: p.TextBgColor})
- break
- }
- continue
- }
- buf.Set(p.innerArea.Min.X+x, p.innerArea.Min.Y+y, cs[n])
- n++
- x += w
- }
- return buf
- }
|