scl_core/
progress.rs

1//! 这里提供的特质用于报告异步进度
2
3/// 一个异步报告特质,用来给宿主提供目前异步程序的处理状态
4///
5/// 实现该特质时需要注意,当对象被克隆时,其响应也应当和原始对象一致。
6///
7/// 当进行调用时,如不需要报告进度可以使用 `None as Option<()>`(或本模块中的 `NR` 常量)来跳过报告
8pub trait Reporter: Clone + Send + Sync {
9    /// 返回一个和原始对象分离的报告对象,应当是一个全新的报告对象
10    ///
11    /// 所响应的进度不会同时上报给原始对象
12    #[must_use]
13    fn fork(&self) -> Self {
14        self.to_owned()
15    }
16
17    /// 返回一个报告会同时上报给原始报告的对象
18    #[must_use]
19    fn sub(&self) -> Self {
20        self.fork()
21    }
22
23    /// 发送信息,并根据情况相继上报给原始对象
24    fn send(&self, state: ReportState);
25
26    /// 发送信息,但是可变引用状态,并根据情况相继上报给原始对象
27    ///
28    /// 如果你的上报对象自身对不可变有限制可以考虑实现这个方法
29    fn send_mut(&mut self, state: ReportState) {
30        self.send(state)
31    }
32}
33
34pub(crate) trait Progress: Reporter {
35    fn set_message(&self, msg: String) {
36        self.send(ReportState::SetMessage(msg));
37    }
38    fn set_sub_message(&self, msg: String) {
39        self.send(ReportState::SetSubMessage(msg));
40    }
41    fn set_max_progress(&self, value: f64) {
42        self.send(ReportState::SetMaxProgress(value));
43    }
44    fn add_max_progress(&self, value: f64) {
45        self.send(ReportState::AddMaxProgress(value));
46    }
47    fn set_progress(&self, value: f64) {
48        self.send(ReportState::SetProgress(value));
49    }
50    fn add_progress(&self, value: f64) {
51        self.send(ReportState::AddProgress(value));
52    }
53    fn set_indeterminate_progress(&self) {
54        self.send(ReportState::SetIndeterminateProgress);
55    }
56    fn hide_progress(&self) {
57        self.send(ReportState::SetIndeterminateProgress);
58    }
59    fn remove_progress(self) {
60        self.send(ReportState::RemoveProgress);
61    }
62}
63
64impl<R: Reporter> Reporter for Option<R> {
65    fn fork(&self) -> Self {
66        self.as_ref().map(|s| s.fork())
67    }
68
69    fn sub(&self) -> Self {
70        self.as_ref().map(|s| s.sub())
71    }
72
73    fn send(&self, state: ReportState) {
74        if let Some(s) = &self {
75            s.send(state);
76        }
77    }
78
79    fn send_mut(&mut self, state: ReportState) {
80        if let Some(s) = self {
81            s.send_mut(state);
82        }
83    }
84}
85
86impl<R: Reporter> Progress for R {}
87
88/// 一个不会有任何响应的报告对象,如果宿主不需要获悉进度或状态可将这个传入参数
89pub const NR: Option<()> = None;
90
91impl Reporter for () {
92    fn send(&self, _: ReportState) {}
93}
94
95/// 核心库报告的异步进度的所有枚举
96#[derive(Debug, Clone)]
97pub enum ReportState {
98    /// 设置主要文字信息
99    SetMessage(String),
100    /// 设置次要文字信息
101    SetSubMessage(String),
102    /// 设置进度的最大值
103    SetMaxProgress(f64),
104    /// 增加/减少进度的最大值
105    AddMaxProgress(f64),
106    /// 设置当前进度
107    SetProgress(f64),
108    /// 增加/减少当前进度
109    AddProgress(f64),
110    /// 将进度设置为不定进度模式
111    SetIndeterminateProgress,
112    /// 隐藏此进度
113    HideProgress,
114    /// 删除此进度
115    RemoveProgress,
116}