Make ProgressBar fields private

This commit is contained in:
Trevor Slocum 2020-03-26 08:54:12 -07:00
parent 49d23a331a
commit aae1af2a19
6 changed files with 83 additions and 29 deletions

View file

@ -13,7 +13,7 @@ func ProgressBar(nextSlide func()) (title string, content cview.Primitive) {
verticalProgressBar := cview.NewProgressBar()
verticalProgressBar.SetBorder(true)
verticalProgressBar.Vertical = true
verticalProgressBar.SetVertical(true)
horizontalProgressBar := cview.NewProgressBar()
horizontalProgressBar.SetBorder(true)

View file

@ -15,7 +15,7 @@ func main() {
verticalProgressBar := cview.NewProgressBar()
verticalProgressBar.SetBorder(true)
verticalProgressBar.Vertical = true
verticalProgressBar.SetVertical(true)
horizontalProgressBar := cview.NewProgressBar()
horizontalProgressBar.SetBorder(true)

4
go.mod
View file

@ -5,8 +5,8 @@ go 1.12
require (
github.com/gdamore/tcell v1.3.0
github.com/lucasb-eyer/go-colorful v1.0.3
github.com/mattn/go-runewidth v0.0.8
github.com/mattn/go-runewidth v0.0.9
github.com/rivo/uniseg v0.1.0
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4 // indirect
golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775 // indirect
golang.org/x/text v0.3.2 // indirect
)

8
go.sum
View file

@ -10,14 +10,14 @@ github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tW
github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0=
github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756 h1:9nuHUbU8dRnRRfj9KjWUVrJeoexdbeMjttk6Oh1rD10=
golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4 h1:sfkvUWPNGwSV+8/fNqctR5lS2AqCSqYwXdrjCxp/dXo=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775 h1:TC0v2RSO1u2kn1ZugjrFXkRZAEaqMN/RW+OTZkBzmLE=
golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=

View file

@ -12,24 +12,27 @@ type ProgressBar struct {
*Box
// Rune to use when rendering the empty area of the progress bar.
EmptyRune rune
emptyRune rune
// Color of the empty area of the progress bar.
EmptyColor tcell.Color
emptyColor tcell.Color
// Rune to use when rendering the filled area of the progress bar.
FilledRune rune
filledRune rune
// Color of the filled area of the progress bar.
FilledColor tcell.Color
filledColor tcell.Color
// If set to true, instead of filling from left to right, the bar is filled
// from bottom to top.
Vertical bool
vertical bool
max int
// Current progress.
progress int
// Progress required to fill the bar.
max int
sync.Mutex
}
@ -37,14 +40,54 @@ type ProgressBar struct {
func NewProgressBar() *ProgressBar {
return &ProgressBar{
Box: NewBox().SetBackgroundColor(Styles.PrimitiveBackgroundColor),
EmptyRune: ' ',
EmptyColor: Styles.PrimitiveBackgroundColor,
FilledRune: tcell.RuneBlock,
FilledColor: Styles.PrimaryTextColor,
emptyRune: ' ',
emptyColor: Styles.PrimitiveBackgroundColor,
filledRune: tcell.RuneBlock,
filledColor: Styles.PrimaryTextColor,
max: 100,
}
}
// SetEmptyRune sets the rune used for the empty area of the progress bar.
func (p *ProgressBar) SetEmptyRune(empty rune) {
p.Lock()
defer p.Unlock()
p.emptyRune = empty
}
// SetEmptyColor sets the color of the empty area of the progress bar.
func (p *ProgressBar) SetEmptyColor(empty tcell.Color) {
p.Lock()
defer p.Unlock()
p.emptyColor = empty
}
// SetFilledRune sets the rune used for the filled area of the progress bar.
func (p *ProgressBar) SetFilledRune(filled rune) {
p.Lock()
defer p.Unlock()
p.filledRune = filled
}
// SetFilledColor sets the color of the filled area of the progress bar.
func (p *ProgressBar) SetFilledColor(filled tcell.Color) {
p.Lock()
defer p.Unlock()
p.filledColor = filled
}
// SetVertical sets the direction of the progress bar.
func (p *ProgressBar) SetVertical(vertical bool) {
p.Lock()
defer p.Unlock()
p.vertical = vertical
}
// SetMax sets the progress required to fill the bar.
func (p *ProgressBar) SetMax(max int) {
p.Lock()
@ -104,7 +147,7 @@ func (p *ProgressBar) Draw(screen tcell.Screen) {
barSize := height
maxLength := width
if p.Vertical {
if p.vertical {
barSize = width
maxLength = height
}
@ -116,17 +159,17 @@ func (p *ProgressBar) Draw(screen tcell.Screen) {
for i := 0; i < barSize; i++ {
for j := 0; j < barLength; j++ {
if p.Vertical {
screen.SetContent(x+i, y+(height-1-j), p.FilledRune, nil, tcell.StyleDefault.Foreground(p.FilledColor).Background(p.backgroundColor))
if p.vertical {
screen.SetContent(x+i, y+(height-1-j), p.filledRune, nil, tcell.StyleDefault.Foreground(p.filledColor).Background(p.backgroundColor))
} else {
screen.SetContent(x+j, y+i, p.FilledRune, nil, tcell.StyleDefault.Foreground(p.FilledColor).Background(p.backgroundColor))
screen.SetContent(x+j, y+i, p.filledRune, nil, tcell.StyleDefault.Foreground(p.filledColor).Background(p.backgroundColor))
}
}
for j := barLength; j < maxLength; j++ {
if p.Vertical {
screen.SetContent(x+i, y+(height-1-j), p.EmptyRune, nil, tcell.StyleDefault.Foreground(p.EmptyColor).Background(p.backgroundColor))
if p.vertical {
screen.SetContent(x+i, y+(height-1-j), p.emptyRune, nil, tcell.StyleDefault.Foreground(p.emptyColor).Background(p.backgroundColor))
} else {
screen.SetContent(x+j, y+i, p.EmptyRune, nil, tcell.StyleDefault.Foreground(p.EmptyColor).Background(p.backgroundColor))
screen.SetContent(x+j, y+i, p.emptyRune, nil, tcell.StyleDefault.Foreground(p.emptyColor).Background(p.backgroundColor))
}
}
}

View file

@ -2,7 +2,6 @@ package cview
import (
"bytes"
"fmt"
"regexp"
"strings"
"sync"
@ -90,7 +89,6 @@ type textViewIndex struct {
//
// See https://gitlab.com/tslocum/cview/wiki/TextView for an example.
type TextView struct {
sync.RWMutex
*Box
// The text buffer.
@ -170,6 +168,8 @@ type TextView struct {
// An optional function which is called when the user presses one of the
// following keys: Escape, Enter, Tab, Backtab.
done func(tcell.Key)
sync.RWMutex
}
// NewTextView returns a new text view.
@ -258,8 +258,11 @@ func (t *TextView) SetTextColor(color tcell.Color) *TextView {
// SetText sets the text of this text view to the provided string. Previously
// contained text will be removed.
func (t *TextView) SetText(text string) *TextView {
t.Clear()
fmt.Fprint(t, text)
t.Lock()
defer t.Unlock()
t.clear()
t.write([]byte(text))
return t
}
@ -413,6 +416,10 @@ func (t *TextView) Clear() *TextView {
t.Lock()
defer t.Unlock()
return t.clear()
}
func (t *TextView) clear() *TextView {
t.buffer = nil
t.recentBytes = nil
t.index = nil
@ -580,6 +587,10 @@ func (t *TextView) Write(p []byte) (n int, err error) {
}
defer t.Unlock()
return t.write(p)
}
func (t *TextView) write(p []byte) (n int, err error) {
// Copy data over.
newBytes := append(t.recentBytes, p...)
t.recentBytes = nil