Skip to content

Multi Bar

MultiBar renders multiple progress bars and spinners together, either sequentially or in parallel.

zig
const mb = try loaders.MultiBar.init(allocator, io, config);

Config

zig
pub const MultiBarConfig = struct {
    mode: Mode = .parallel,   // .parallel | .sequential
    interval_ms: u32 = 30,
    hide_bar_when_complete: bool = false,  // hide finished/failed trackers
};

Methods

MethodDescription
init(allocator, io, config) !MultiBarCreate.
deinit()Stop the render thread (if any).
addBar(ProgressBarConfig) !usizeAdd a bar; returns its index.
addSpinner(SpinnerConfig) !usizeAdd a spinner; returns its index.
getBar(index) *ProgressBarAccess a bar by index.
getSpinner(index) *SpinnerAccess a spinner by index.
count() usizeNumber of trackers.
run() !voidStart rendering all trackers.
finishAll(FinishConfig)Finish every tracker.

Example

zig
var mb = try loaders.MultiBar.init(allocator, io, .{
    .mode = .parallel,
});
defer mb.deinit();

_ = try mb.addBar(.{
    .total = 100,
    .style = .{ .filled = "#", .empty = "-" },
    .template = "Task A: {bar} {percent}%",
});
_ = try mb.addBar(.{
    .total = 100,
    .style = .{ .filled = "=", .empty = " " },
    .template = "Task B: {bar} {percent}%",
});
_ = try mb.addSpinner(.{
    .frames = &.{ "|", "/", "-", "\\" },
    .template = "{frame} {text}",
    .text = "Side task",
});

try mb.run();

const a = mb.getBar(0);
const b = mb.getBar(1);
// ... update a / b / spinner ...

mb.finishAll(.{ .newline = true });

Released under the MIT License.