use crate::*;
pub(crate) fn use_progress() -> UseProgress {
UseProgress::new(use_signal(|| 0), use_signal(|| false), use_signal(|| None))
}
pub(crate) fn progress_on_start(state: UseProgress) -> Option<Rc<dyn Fn(Event)>> {
Some(Rc::new(move |_event: Event| {
state.get_value().set(0);
state.get_running().set(true);
let handle_opt: Option<IntervalHandle> = state.get_handle().get();
if let Some(existing_handle) = handle_opt {
existing_handle.clear();
}
let value_signal: Signal<i32> = state.get_value();
let running_signal: Signal<bool> = state.get_running();
let handle_signal: Signal<Option<IntervalHandle>> = state.get_handle();
let new_handle: IntervalHandle = use_interval(16, move || {
if running_signal.get() {
let current: i32 = value_signal.get();
if current < 100 {
let next: i32 = (current + 2).min(100);
value_signal.set(next);
} else {
running_signal.set(false);
}
}
});
handle_signal.set(Some(new_handle));
}))
}
pub(crate) fn progress_on_reset(state: UseProgress) -> Option<Rc<dyn Fn(Event)>> {
Some(Rc::new(move |_event: Event| {
state.get_running().set(false);
let handle_opt: Option<IntervalHandle> = state.get_handle().get();
if let Some(existing_handle) = handle_opt {
existing_handle.clear();
}
state.get_handle().set(None);
state.get_value().set(0);
}))
}
pub(crate) fn color_cycle_on_next(color_index: Signal<i32>) -> Option<Rc<dyn Fn(Event)>> {
Some(Rc::new(move |_event: Event| {
let current: i32 = color_index.get();
color_index.set((current + 1) % 5);
}))
}