From 371d184755126cd1d58ea5698eb27687ea80e3be Mon Sep 17 00:00:00 2001 From: gizak Date: Sat, 9 May 2015 19:37:44 -0400 Subject: [PATCH] Move gauge into widget folder --- gauge.go | 113 -------------------------------------- widget/gauge.go | 104 +++++++++++++++++++++++++---------- mbar.go => widget/mbar.go | 0 3 files changed, 75 insertions(+), 142 deletions(-) delete mode 100644 gauge.go rename mbar.go => widget/mbar.go (100%) diff --git a/gauge.go b/gauge.go deleted file mode 100644 index 986f4f3..0000000 --- a/gauge.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2015 Zack Guo . 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.Border.Label = "Slim Gauge" - g.BarColor = termui.ColorRed - g.PercentColor = termui.ColorBlue -*/ - -// Align is the position of the gauge's label. -type Align int - -// All supported positions. -const ( - AlignLeft Align = iota - AlignCenter - AlignRight -) - -type Gauge struct { - Block - Percent int - BarColor Attribute - PercentColor Attribute - Label string - LabelAlign Align -} - -// NewGauge return a new gauge with current theme. -func NewGauge() *Gauge { - g := &Gauge{ - Block: *NewBlock(), - PercentColor: theme.GaugePercent, - BarColor: theme.GaugeBar, - Label: "{{percent}}%", - LabelAlign: AlignCenter, - } - - g.Width = 12 - g.Height = 5 - return g -} - -// Buffer implements Bufferer interface. -func (g *Gauge) Buffer() []Point { - ps := g.Block.Buffer() - - // plot bar - w := g.Percent * g.innerWidth / 100 - for i := 0; i < g.innerHeight; i++ { - for j := 0; j < w; j++ { - p := Point{} - p.X = g.innerX + j - p.Y = g.innerY + i - p.Ch = ' ' - p.Bg = g.BarColor - if p.Bg == ColorDefault { - p.Bg |= AttrReverse - } - ps = append(ps, p) - } - } - - // plot percentage - s := strings.Replace(g.Label, "{{percent}}", strconv.Itoa(g.Percent), -1) - pry := g.innerY + g.innerHeight/2 - rs := str2runes(s) - var pos int - switch g.LabelAlign { - case AlignLeft: - pos = 0 - - case AlignCenter: - pos = (g.innerWidth - strWidth(s)) / 2 - - case AlignRight: - pos = g.innerWidth - strWidth(s) - } - - for i, v := range rs { - p := Point{} - p.X = 1 + pos + i - p.Y = pry - p.Ch = v - p.Fg = g.PercentColor - if w+g.innerX > pos+i { - p.Bg = g.BarColor - if p.Bg == ColorDefault { - p.Bg |= AttrReverse - } - - } else { - p.Bg = g.Block.BgColor - } - - ps = append(ps, p) - } - return g.Block.chopOverflow(ps) -} diff --git a/widget/gauge.go b/widget/gauge.go index 9b02ed5..986f4f3 100644 --- a/widget/gauge.go +++ b/widget/gauge.go @@ -2,10 +2,12 @@ // Use of this source code is governed by a MIT license that can // be found in the LICENSE file. -package widget +package termui -import "github.com/gizak/termui" -import "strconv" +import ( + "strconv" + "strings" +) // Gauge is a progress bar like widget. // A simple example: @@ -18,50 +20,94 @@ import "strconv" g.BarColor = termui.ColorRed g.PercentColor = termui.ColorBlue */ + +// Align is the position of the gauge's label. +type Align int + +// All supported positions. +const ( + AlignLeft Align = iota + AlignCenter + AlignRight +) + type Gauge struct { - termui.Block + Block Percent int - BarColor termui.Attribute - PercentColor termui.Attribute + BarColor Attribute + PercentColor Attribute + Label string + LabelAlign Align } // NewGauge return a new gauge with current theme. func NewGauge() *Gauge { g := &Gauge{ - Block: *termui.NewBlock(), - PercentColor: termui.Theme().GaugePercent, - BarColor: termui.Theme().GaugeBar} + Block: *NewBlock(), + PercentColor: theme.GaugePercent, + BarColor: theme.GaugeBar, + Label: "{{percent}}%", + LabelAlign: AlignCenter, + } + g.Width = 12 - g.Height = 3 + g.Height = 5 return g } // Buffer implements Bufferer interface. -func (g *Gauge) Buffer() termui.Buffer { - buf := g.Block.Buffer() - - inner := g.InnerBounds() - w := g.Percent * (inner.Dx() + 1) / 100 - s := strconv.Itoa(g.Percent) + "%" - tx := termui.TextCells(s, g.PercentColor, g.Bg) - - prx := inner.Min.X + (inner.Dx()+1)/2 - 1 - pry := inner.Min.Y + (inner.Dy()+1)/2 +func (g *Gauge) Buffer() []Point { + ps := g.Block.Buffer() // plot bar - for i := 0; i <= inner.Dy(); i++ { + w := g.Percent * g.innerWidth / 100 + for i := 0; i < g.innerHeight; i++ { for j := 0; j < w; j++ { - c := termui.Cell{' ', g.BarColor, g.BarColor} - buf.Set(inner.Min.X+j, inner.Min.Y+i, c) + p := Point{} + p.X = g.innerX + j + p.Y = g.innerY + i + p.Ch = ' ' + p.Bg = g.BarColor + if p.Bg == ColorDefault { + p.Bg |= AttrReverse + } + ps = append(ps, p) } } // plot percentage - for i, v := range tx { - if w > (inner.Dx()+1)/2-1+i { - v.Bg = g.BarColor - } - buf.Set(prx+i, pry, v) + s := strings.Replace(g.Label, "{{percent}}", strconv.Itoa(g.Percent), -1) + pry := g.innerY + g.innerHeight/2 + rs := str2runes(s) + var pos int + switch g.LabelAlign { + case AlignLeft: + pos = 0 + + case AlignCenter: + pos = (g.innerWidth - strWidth(s)) / 2 + + case AlignRight: + pos = g.innerWidth - strWidth(s) } - return buf + + for i, v := range rs { + p := Point{} + p.X = 1 + pos + i + p.Y = pry + p.Ch = v + p.Fg = g.PercentColor + if w+g.innerX > pos+i { + p.Bg = g.BarColor + if p.Bg == ColorDefault { + p.Bg |= AttrReverse + } + + } else { + p.Bg = g.Block.BgColor + } + + ps = append(ps, p) + } + return g.Block.chopOverflow(ps) } diff --git a/mbar.go b/widget/mbar.go similarity index 100% rename from mbar.go rename to widget/mbar.go