110 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// 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
 | 
						|
 | 
						|
import (
 | 
						|
	"strconv"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
// Gauge is a progress bar like widget.
 | 
						|
// A simple example:
 | 
						|
/*
 | 
						|
  g := termui.NewGauge()
 | 
						|
  g.Percent = 40
 | 
						|
  g.Width = 50
 | 
						|
  g.Height = 3
 | 
						|
  g.BorderLabel = "Slim Gauge"
 | 
						|
  g.BarColor = termui.ColorRed
 | 
						|
  g.PercentColor = termui.ColorBlue
 | 
						|
*/
 | 
						|
 | 
						|
const ColorUndef Attribute = Attribute(^uint16(0))
 | 
						|
 | 
						|
type Gauge struct {
 | 
						|
	Block
 | 
						|
	Percent                 int
 | 
						|
	BarColor                Attribute
 | 
						|
	PercentColor            Attribute
 | 
						|
	PercentColorHighlighted Attribute
 | 
						|
	Label                   string
 | 
						|
	LabelAlign              Align
 | 
						|
}
 | 
						|
 | 
						|
// NewGauge return a new gauge with current theme.
 | 
						|
func NewGauge() *Gauge {
 | 
						|
	g := &Gauge{
 | 
						|
		Block:                   *NewBlock(),
 | 
						|
		PercentColor:            ThemeAttr("gauge.percent.fg"),
 | 
						|
		BarColor:                ThemeAttr("gauge.bar.bg"),
 | 
						|
		Label:                   "{{percent}}%",
 | 
						|
		LabelAlign:              AlignCenter,
 | 
						|
		PercentColorHighlighted: ColorUndef,
 | 
						|
	}
 | 
						|
 | 
						|
	g.Width = 12
 | 
						|
	g.Height = 5
 | 
						|
	return g
 | 
						|
}
 | 
						|
 | 
						|
// Buffer implements Bufferer interface.
 | 
						|
func (g *Gauge) Buffer() Buffer {
 | 
						|
	buf := g.Block.Buffer()
 | 
						|
 | 
						|
	// plot bar
 | 
						|
	w := g.Percent * g.innerArea.Dx() / 100
 | 
						|
	for i := 0; i < g.innerArea.Dy(); i++ {
 | 
						|
		for j := 0; j < w; j++ {
 | 
						|
			c := Cell{}
 | 
						|
			c.Ch = ' '
 | 
						|
			c.Bg = g.BarColor
 | 
						|
			if c.Bg == ColorDefault {
 | 
						|
				c.Bg |= AttrReverse
 | 
						|
			}
 | 
						|
			buf.Set(g.innerArea.Min.X+j, g.innerArea.Min.Y+i, c)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// plot percentage
 | 
						|
	s := strings.Replace(g.Label, "{{percent}}", strconv.Itoa(g.Percent), -1)
 | 
						|
	pry := g.innerArea.Min.Y + g.innerArea.Dy()/2
 | 
						|
	rs := str2runes(s)
 | 
						|
	var pos int
 | 
						|
	switch g.LabelAlign {
 | 
						|
	case AlignLeft:
 | 
						|
		pos = 0
 | 
						|
 | 
						|
	case AlignCenter:
 | 
						|
		pos = (g.innerArea.Dx() - strWidth(s)) / 2
 | 
						|
 | 
						|
	case AlignRight:
 | 
						|
		pos = g.innerArea.Dx() - strWidth(s) - 1
 | 
						|
	}
 | 
						|
	pos += g.innerArea.Min.X
 | 
						|
 | 
						|
	for i, v := range rs {
 | 
						|
		c := Cell{
 | 
						|
			Ch: v,
 | 
						|
			Fg: g.PercentColor,
 | 
						|
		}
 | 
						|
 | 
						|
		if w+g.innerArea.Min.X > pos+i {
 | 
						|
			c.Bg = g.BarColor
 | 
						|
			if c.Bg == ColorDefault {
 | 
						|
				c.Bg |= AttrReverse
 | 
						|
			}
 | 
						|
 | 
						|
			if g.PercentColorHighlighted != ColorUndef {
 | 
						|
				c.Fg = g.PercentColorHighlighted
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			c.Bg = g.Block.Bg
 | 
						|
		}
 | 
						|
 | 
						|
		buf.Set(1+pos+i, pry, c)
 | 
						|
	}
 | 
						|
	return buf
 | 
						|
}
 |