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}