Expand description
Provides functions to set up and update a progress bar.
A progress bar has a label, a maximum progress value, and its current progress, which
starts at zero. The maximum and current progress values are constrained to be of type
usize
. However, convenience methods are provided for the common case of a progress bar
for the timeline that take f64
time values and rounds them to nearest integers for you.
Only one progress bar can be active at a time. If you try to set a second progress bar, the
new progress bar will replace this first. This is useful if you want to track the progress
of a simulation in multiple phases. Keep in mind, however, that if you define a timeline
progress bar, the Context
will try to update it in its event loop with the current time,
which might not be what you want if you have replaced the progress bar with a new one.
§Timeline Progress Bar
/// Initialize the progress bar with the maximum time until the simulation ends.
pub fn init_timeline_progress_bar(max_time: f64);
/// Updates the progress bar with the current time. Finalizes the progress bar when
/// `current_time >= max_time`.
pub fn update_timeline_progress(mut current_time: f64);
§Custom Progress Bar
If the timeline is not a good indication of progress for your simulation, you can set up a custom progress bar.
/// Initializes a custom progress bar with the given label and max value.
pub fn init_custom_progress_bar(label: &str, max_value: usize);
/// Updates the current value of the custom progress bar.
pub fn update_custom_progress(current_value: usize);
/// Increments the custom progress bar by 1. Use this if you don't want to keep track of the
/// current value.
pub fn increment_custom_progress()
§Custom Example: People Infected
Suppose you want a progress bar that tracks how much of the population has been infected (or infected and then recovered). You first initialize a custom progress bar before executing the simulation.
use crate::progress_bar::{init_custom_progress_bar};
init_custom_progress_bar("People Infected", POPULATION_SIZE);
To update the progress bar, we need to listen to the infection status property change event.
use crate::progress_bar::{increment_custom_progress};
// You might already have this event defined for other purposes.
pub type InfectionStatusEvent = PersonPropertyChangeEvent<InfectionStatus>;
// This will handle the status change event, updating the progress bar
// if there is a new infection.
fn handle_infection_status_change(context: &mut Context, event: InfectionStatusEvent) {
// We only increment the progress bar when a new infection occurs.
if (InfectionStatusValue::Susceptible, InfectionStatusValue::Infected)
== (event.previous, event.current)
{
increment_custom_progress();
}
}
// Be sure to subscribe to the event when you initialize the context.
pub fn init(context: &mut Context) -> Result<(), IxaError> {
// ... other initialization code ...
context.subscribe_to_event::<InfectionStatusEvent>(handle_infection_status_change);
// ...
Ok(())
}
Functions§
- increment_
custom_ progress - Increments the custom progress bar by 1. Use this if you don’t want to keep track of the current value.
- init_
custom_ progress_ bar - Initializes a custom progress bar with the given label and max value.
- init_
timeline_ progress_ bar - Initialize the progress bar with the maximum time until the simulation ends.
- update_
custom_ progress - Updates the current value of the custom progress bar.