diff --git a/examples/background-tasks.rs b/examples/background-tasks.rs new file mode 100644 index 0000000..433a5fe --- /dev/null +++ b/examples/background-tasks.rs @@ -0,0 +1,56 @@ +//! This example shows how dynamic values make it easy to communicate state back +//! to widgets from multiple threads. + +use std::time::Duration; + +use gooey::animation::ZeroToOne; +use gooey::value::{Dynamic, Switchable}; +use gooey::widget::MakeWidget; +use gooey::widgets::progress::{Progress, Progressable}; +use gooey::Run; + +#[derive(Debug, Default, Eq, PartialEq)] +struct Task { + progress: Dynamic, +} + +fn main() -> gooey::Result { + let task = Dynamic::new(None::); + + task.switcher(|task, dynamic| { + if let Some(task) = task { + // A background thread is running, show a progress bar. + task.progress.clone().progress_bar().make_widget() + } else { + // There is no background task. Show a button that will start one. + "Start" + .into_button() + .on_click({ + let task = dynamic.clone(); + move |()| { + let background_task = Task::default(); + spawn_background_thread(&background_task.progress, &task); + task.set(Some(background_task)); + } + }) + .make_widget() + } + }) + .contain() + .centered() + .run() +} + +fn spawn_background_thread(progress: &Dynamic, task: &Dynamic>) { + let progress = progress.clone(); + let task = task.clone(); + std::thread::spawn(move || background_task(&progress, &task)); +} + +fn background_task(progress: &Dynamic, task: &Dynamic>) { + for i in 0_u8..=10 { + progress.set(Progress::Percent(ZeroToOne::new(f32::from(i) / 10.))); + std::thread::sleep(Duration::from_millis(100)); + } + task.set(None); +} diff --git a/src/widgets/progress.rs b/src/widgets/progress.rs index 99792eb..eea4829 100644 --- a/src/widgets/progress.rs +++ b/src/widgets/progress.rs @@ -52,9 +52,10 @@ impl ProgressBar { } /// A measurement of progress for an indicator widget like [`ProgressBar`]. -#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[derive(Clone, Copy, Debug, Eq, PartialEq, Default)] pub enum Progress { /// The task has an indeterminant length. + #[default] Indeterminant, /// The task is a specified amount complete. Percent(T),