Skip to main content

ProgressBar

widget.ProgressBar renders a horizontal progress indicator for values between 0.0 and 1.0. It is a display-only widget with no interactive key bindings.

Basic usage

pb := widget.NewProgressBar()
pb.SetValue(0.65) // 65%

Percentage label

By default the percentage label is shown at the left edge. Use WithPercentage to control both visibility and position:

// Left (default) — " 65% ██████░░░░"
pb := widget.NewProgressBar().WithPercentage(true)

// Centre — "███ 65% ░░░░"
pb := widget.NewProgressBar().WithPercentage(true, oat.AnchorCenter)

// Right — "██████░░░░ 65%"
pb := widget.NewProgressBar().WithPercentage(true, oat.AnchorRight)

// Hidden
pb := widget.NewProgressBar().WithPercentage(false)

The anchor parameter is optional — omit it to get oat.AnchorLeft by default.

AnchorLayout
oat.AnchorLeft (default)Label precedes the bar: " 65% ██░░░░"
oat.AnchorCenterLabel stamped into the midpoint: "██ 65% ░░"
oat.AnchorRightLabel appended after the bar: "████░░ 65%"
note

WithShowPercent(bool) still works as a deprecated shorthand but does not let you set the anchor. Prefer WithPercentage.

Builder options

MethodDescription
WithPercentage(show bool, anchor ...oat.Anchor)Control label visibility and position (default true, AnchorLeft)
WithStyle(s latte.Style)Override the display style (colour, background)
WithID(id string)Set a stable identifier for Canvas.GetValue(id)
WithFillChar(r rune)Rune used for the filled portion (default )
WithEmptyChar(r rune)Rune used for the empty portion (default )
WithShowPercent(show bool)Deprecated — use WithPercentage instead

Custom fill characters

pb := widget.NewProgressBar().
WithFillChar('=').
WithEmptyChar('-').
WithPercentage(true, oat.AnchorRight)
// Renders as: ======---- 60%

Per-item colour

After theme application you can override the fill colour per-item using WithStyle:

pb := widget.NewProgressBar().
WithStyle(latte.Style{FG: latte.ColorRed})

SetStyle is still available as a deprecated alias for WithStyle when you need to mutate the style after construction (e.g. in a list renderer).

In a flex layout

ProgressBar grows to fill available horizontal space when given a flex weight:

row := layout.NewHBox()
row.AddChild(widget.NewText("Progress: "))
row.AddFlexChild(pb, 1)
row.AddChild(widget.NewText(" 4/10"))

Reading the value

v := pb.Progress() // float64, 0.0–1.0

ProgressBar also implements oat.ValueGetter: Canvas.GetValue(id) returns the current value as a float64.

Updating from a goroutine

SetValue is safe to call from any goroutine. Use widget.NotificationManager (via oat.WithNotificationManager) to trigger a re-render:

notifs := widget.NewNotificationManager()
app := oat.NewCanvas(
oat.WithBody(body),
oat.WithNotificationManager(notifs),
)

go func() {
for i := 0; i <= 100; i++ {
pb.SetValue(float64(i) / 100.0)
notifs.Push("", widget.NotificationKindInfo, time.Millisecond) // triggers re-render
time.Sleep(50 * time.Millisecond)
}
}()