progressbar.go
func (b *ProgressBar) Draw() {
	if b.hidden {
		return
	}

	b.mtx.RLock()
	defer b.mtx.RUnlock()
	if b.max <= b.min {
		return
	}

	PushAttributes()
	defer PopAttributes()

	fgOff, fgOn := RealColor(b.fg, b.Style(), ColorProgressText), RealColor(b.fgActive, b.Style(), ColorProgressActiveText)
	bgOff, bgOn := RealColor(b.bg, b.Style(), ColorProgressBack), RealColor(b.bgActive, b.Style(), ColorProgressActiveBack)

	parts := []rune(SysObject(ObjProgressBar))
	cFilled, cEmpty := parts[0], parts[1]

	prc := 0
	if b.value >= b.max {
		prc = 100
	} else if b.value < b.max && b.value > b.min {
		prc = (100 * (b.value - b.min)) / (b.max - b.min)
	}

	var title string
	if b.direction == Horizontal && b.Title() != "" {
		title = b.Title()
		title = strings.Replace(title, "{{percent}}", strconv.Itoa(prc), -1)
		title = strings.Replace(title, "{{value}}", strconv.Itoa(b.value), -1)
		title = strings.Replace(title, "{{min}}", strconv.Itoa(b.min), -1)
		title = strings.Replace(title, "{{max}}", strconv.Itoa(b.max), -1)
	}

	x, y := b.Pos()
	w, h := b.Size()

	if b.direction == Horizontal {
		filled := prc * w / 100
		sFilled := strings.Repeat(string(cFilled), filled)
		sEmpty := strings.Repeat(string(cEmpty), w-filled)

		for yy := y; yy < y+h; yy++ {
			SetTextColor(fgOn)
			SetBackColor(bgOn)
			DrawRawText(x, yy, sFilled)
			SetTextColor(fgOff)
			SetBackColor(bgOff)
			DrawRawText(x+filled, yy, sEmpty)
		}

		if title != "" {
			shift, str := AlignText(title, w, b.align)
			titleClr := RealColor(b.titleFg, b.Style(), ColorProgressTitleText)
			var sOn, sOff string
			if filled == 0 || shift >= filled {
				sOff = str
			} else if w == filled || shift+xs.Len(str) < filled {
				sOn = str
			} else {
				r := filled - shift
				sOn = xs.Slice(str, 0, r)
				sOff = xs.Slice(str, r, -1)
			}
			SetTextColor(titleClr)
			if sOn != "" {
				SetBackColor(bgOn)
				DrawRawText(x+shift, y, sOn)
			}
			if sOff != "" {
				SetBackColor(bgOff)
				DrawRawText(x+shift+xs.Len(sOn), y, sOff)
			}
		}
	} else {
		filled := prc * h / 100
		sFilled := strings.Repeat(string(cFilled), w)
		sEmpty := strings.Repeat(string(cEmpty), w)
		for yy := y; yy < y+h-filled; yy++ {
			SetTextColor(fgOff)
			SetBackColor(bgOff)
			DrawRawText(x, yy, sEmpty)
		}
		for yy := y + h - filled; yy < y+h; yy++ {
			SetTextColor(fgOff)
			SetBackColor(bgOff)
			DrawRawText(x, yy, sFilled)
		}
	}
}
func (b *ProgressBar) Draw() {
	if b.hidden {
		return
	}

	b.mtx.RLock()
	defer b.mtx.RUnlock()
	if b.max <= b.min {
		return
	}

	PushAttributes()
	defer PopAttributes()

	fgOff, fgOn := RealColor(b.fg, b.Style(), ColorProgressText), RealColor(b.fgActive, b.Style(), ColorProgressActiveText)
	bgOff, bgOn := RealColor(b.bg, b.Style(), ColorProgressBack), RealColor(b.bgActive, b.Style(), ColorProgressActiveBack)

	parts := []rune(SysObject(ObjProgressBar))
	cFilled, cEmpty := parts[0], parts[1]

	prc := 0
	if b.value >= b.max {
		prc = 100
	} else if b.value < b.max && b.value > b.min {
		prc = (100 * (b.value - b.min)) / (b.max - b.min)
	}

	var title string
	if b.direction == Horizontal && b.Title() != "" {
		title = b.Title()
		title = strings.Replace(title, "{{percent}}", strconv.Itoa(prc), -1)
		title = strings.Replace(title, "{{value}}", strconv.Itoa(b.value), -1)
		title = strings.Replace(title, "{{min}}", strconv.Itoa(b.min), -1)
		title = strings.Replace(title, "{{max}}", strconv.Itoa(b.max), -1)
	}

	x, y := b.Pos()
	w, h := b.Size()

	if b.direction == Horizontal {
		filled := prc * w / 100
		sFilled := strings.Repeat(string(cFilled), filled)
		sEmpty := strings.Repeat(string(cEmpty), w-filled)

		for yy := y; yy < y+h; yy++ {
			SetTextColor(fgOn)
			SetBackColor(bgOn)
			DrawRawText(x, yy, sFilled)
			SetTextColor(fgOff)
			SetBackColor(bgOff)
			DrawRawText(x+filled, yy, sEmpty)
		}

		if title != "" {
			shift, str := AlignText(title, w, b.align)
			titleClr := RealColor(b.titleFg, b.Style(), ColorProgressTitleText)
			var sOn, sOff string
			if filled == 0 || shift >= filled {
				sOff = str
			} else if w == filled || shift+xs.Len(str) < filled {
				sOn = str
			} else {
				r := filled - shift
				sOn = xs.Slice(str, 0, r)
				sOff = xs.Slice(str, r, -1)
			}
			SetTextColor(titleClr)
			if sOn != "" {
				SetBackColor(bgOn)
				DrawRawText(x+shift, y, sOn)
			}
			if sOff != "" {
				SetBackColor(bgOff)
				DrawRawText(x+shift+xs.Len(sOn), y, sOff)
			}
		}
	} else {
		filled := prc * h / 100
		sFilled := strings.Repeat(string(cFilled), w)
		sEmpty := strings.Repeat(string(cEmpty), w)
		for yy := y; yy < y+h-filled; yy++ {
			SetTextColor(fgOff)
			SetBackColor(bgOff)
			DrawRawText(x, yy, sEmpty)
		}
		for yy := y + h - filled; yy < y+h; yy++ {
			SetTextColor(fgOff)
			SetBackColor(bgOff)
			DrawRawText(x, yy, sFilled)
		}
	}
}
func ( b * ProgressBar ) Draw ( ) { if b . hidden { return } b . mtx . RLock ( ) defer b . mtx . RUnlock ( ) if b . max <= b . min { return } PushAttributes ( ) defer PopAttributes ( ) fgOff , fgOn := RealColor ( b . fg , b . Style ( ) , ColorProgressText ) , RealColor ( b . fgActive , b . Style ( ) , ColorProgressActiveText ) bgOff , bgOn := RealColor ( b . bg , b . Style ( ) , ColorProgressBack ) , RealColor ( b . bgActive , b . Style ( ) , ColorProgressActiveBack ) parts := [ ] rune ( SysObject ( ObjProgressBar ) ) cFilled , cEmpty := parts [ 0 ] , parts [ 1 ] prc := 0 if b . value >= b . max { prc = 100 } else if b . value < b . max && b . value > b . min { prc = ( 100 * ( b . value - b . min ) ) / ( b . max - b . min ) } var title string if b . direction == Horizontal && b . Title ( ) != " " { title = b . Title ( ) title = strings . Replace ( title , " " , strconv . Itoa ( prc ) , - 1 ) title = strings . Replace ( title , " " , strconv . Itoa ( b . value ) , - 1 ) title = strings . Replace ( title , " " , strconv . Itoa ( b . min ) , - 1 ) title = strings . Replace ( title , " " , strconv . Itoa ( b . max ) , - 1 ) } x , y := b . Pos ( ) w , h := b . Size ( ) if b . direction == Horizontal { filled := prc * w / 100 sFilled := strings . Repeat ( string ( cFilled ) , filled ) sEmpty := strings . Repeat ( string ( cEmpty ) , w - filled ) for yy := y ; yy < y + h ; yy ++ { SetTextColor ( fgOn ) SetBackColor ( bgOn ) DrawRawText ( x , yy , sFilled ) SetTextColor ( fgOff ) SetBackColor ( bgOff ) DrawRawText ( x + filled , yy , sEmpty ) } if title != " " { shift , str := AlignText ( title , w , b . align ) titleClr := RealColor ( b . titleFg , b . Style ( ) , ColorProgressTitleText ) var sOn , sOff string if filled == 0 || shift >= filled { sOff = str } else if w == filled || shift + xs . Len ( str ) < filled { sOn = str } else { r := filled - shift sOn = xs . Slice ( str , 0 , r ) sOff = xs . Slice ( str , r , - 1 ) } SetTextColor ( titleClr ) if sOn != " " { SetBackColor ( bgOn ) DrawRawText ( x + shift , y , sOn ) } if sOff != " " { SetBackColor ( bgOff ) DrawRawText ( x + shift + xs . Len ( sOn ) , y , sOff ) } } } else { filled := prc * h / 100 sFilled := strings . Repeat ( string ( cFilled ) , w ) sEmpty := strings . Repeat ( string ( cEmpty ) , w ) for yy := y ; yy < y + h - filled ; yy ++ { SetTextColor ( fgOff ) SetBackColor ( bgOff ) DrawRawText ( x , yy , sEmpty ) } for yy := y + h - filled ; yy < y + h ; yy ++ { SetTextColor ( fgOff ) SetBackColor ( bgOff ) DrawRawText ( x , yy , sFilled ) } } }
// Repaint draws the control on its View surface.
// Horizontal ProgressBar supports custom title over the bar.
// One can set title using method SetTitle. There are a few
// predefined variables that can be used inside title to
// show value or total progress. Variable must be enclosed
// with double curly brackets. Available variables:
// percent - the current percentage rounded to closest integer
// value - raw ProgressBar value
// min - lower ProgressBar limit
// max - upper ProgressBar limit
// Examples:
//      pb.SetTitle("{{value}} of {{max}}")
//      pb.SetTitle("{{percent}}%")
Repaint draws the control on its View surface . Horizontal ProgressBar supports custom title over the bar . One can set title using method SetTitle . There are a few predefined variables that can be used inside title to show value or total progress . Variable must be enclosed with double curly brackets . Available variables : percent - the current percentage rounded to closest integer value - raw ProgressBar value min - lower ProgressBar limit max - upper ProgressBar limit Examples : pb . SetTitle ( {{ value }} of {{ max }} ) pb . SetTitle ( {{ percent }} % )