use crate::*;
#[derive(Clone, Copy, Data, New)]
pub struct UseProgress {
#[get(pub, type(copy))]
#[set(pub)]
pub value: Signal<i32>,
#[get(pub, type(copy))]
#[set(pub)]
pub running: Signal<bool>,
#[get(pub, type(copy))]
#[set(pub)]
pub handle: Signal<Option<IntervalHandle>>,
}
pub fn use_progress() -> UseProgress {
UseProgress::new(use_signal(|| 0), use_signal(|| false), use_signal(|| None))
}
pub fn progress_on_start(state: UseProgress) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Click, move |_event: NativeEvent| {
state.value.set(0);
state.running.set(true);
let handle_opt: Option<IntervalHandle> = state.handle.get();
if let Some(existing_handle) = handle_opt {
existing_handle.clear();
}
let value_signal: Signal<i32> = state.value;
let running_signal: Signal<bool> = state.running;
let handle_signal: Signal<Option<IntervalHandle>> = state.handle;
let new_handle: IntervalHandle = use_interval(30, move || {
if running_signal.get() {
let current: i32 = value_signal.get();
if current < 100 {
value_signal.set(current + 1);
} else {
running_signal.set(false);
}
}
});
handle_signal.set(Some(new_handle));
})
}
pub fn progress_on_reset(state: UseProgress) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Click, move |_event: NativeEvent| {
state.running.set(false);
let handle_opt: Option<IntervalHandle> = state.handle.get();
if let Some(existing_handle) = handle_opt {
existing_handle.clear();
}
state.handle.set(None);
state.value.set(0);
})
}
pub fn color_cycle_on_next(color_index: Signal<i32>) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Click, move |_event: NativeEvent| {
let current: i32 = color_index.get();
color_index.set((current + 1) % 5);
})
}