uiio_element/
progress.rs

1use serde::Serialize;
2use uiio::flow::EventFlow;
3use uiio::fqn::Fqn;
4use uiio::tracer::Tracer;
5
6#[derive(Serialize, Clone)]
7pub struct ProgressValue {
8    progress: u32,
9}
10
11impl EventFlow for ProgressValue {
12    fn class() -> &'static str {
13        "uiio.elements.progress"
14    }
15}
16
17pub struct Progress {
18    tracer: Tracer<ProgressValue>,
19    current: u64,
20    total: u64,
21    value: ProgressValue,
22}
23
24impl Progress {
25    pub fn new(fqn: Fqn, total: u64) -> Self {
26        let value = ProgressValue { progress: 0 };
27        let tracer = Tracer::new(fqn, &value);
28        Self {
29            tracer,
30            current: 0,
31            total,
32            value,
33        }
34    }
35
36    pub fn set_value(&mut self, value: u64) {
37        self.current = value;
38        let prev_value = self.value.progress;
39        let new_value = (self.current * 100 / self.total) as u32;
40        if prev_value != new_value {
41            self.value.progress = new_value;
42            self.tracer.trace(&self.value);
43        }
44    }
45}