aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/gizak/termui/par.go
blob: c01bd0020f4634a53be07e2215af03bc7f013a17 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Copyright 2016 Zack Guo <gizak@icloud.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.Border.Label = "Label"
*/
type Par struct {
    Block
    Text        string
    TextFgColor Attribute
    TextBgColor Attribute
}

// 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"),
    }
}

// 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)

    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
}