com_croftsoft_lib_animation/frame_rater/updater/
mod.rs1use super::FrameRater;
15use com_croftsoft_lib_role::Updater;
16use core::cell::{Cell, Ref, RefCell};
17use std::rc::Rc;
18
19pub trait FrameRaterUpdaterInputs {
20 fn get_frame_rate_display_change_requested(&self) -> Option<bool>;
21 fn get_reset_requested(&self) -> bool;
22 fn get_time_to_update(&self) -> bool;
23 fn get_update_period_millis_changed(&self) -> Option<f64>;
24 fn get_update_time_millis(&self) -> f64;
25}
26
27pub struct FrameRaterUpdater {
28 frame_rate_display: Cell<bool>,
29 frame_rater: Rc<RefCell<dyn FrameRater>>,
30 inputs: Rc<RefCell<dyn FrameRaterUpdaterInputs>>,
31}
32
33impl FrameRaterUpdater {
34 pub fn new(
35 frame_rate_display: bool,
36 frame_rater: Rc<RefCell<dyn FrameRater>>,
37 inputs: Rc<RefCell<dyn FrameRaterUpdaterInputs>>,
38 ) -> Self {
39 Self {
40 frame_rate_display: Cell::new(frame_rate_display),
41 frame_rater,
42 inputs,
43 }
44 }
45}
46
47impl Updater for FrameRaterUpdater {
48 fn update(&self) {
49 let inputs: Ref<dyn FrameRaterUpdaterInputs> = self.inputs.borrow();
50 if let Some(frame_rate_display) =
51 inputs.get_frame_rate_display_change_requested()
52 {
53 self.frame_rate_display.set(frame_rate_display);
54 if frame_rate_display {
55 self.frame_rater.borrow_mut().clear();
56 }
57 }
58 if let Some(update_period_millis) =
59 inputs.get_update_period_millis_changed()
60 {
61 self
62 .frame_rater
63 .borrow_mut()
64 .update_frame_sample_size(update_period_millis);
65 }
66 if inputs.get_reset_requested() {
67 self.frame_rater.borrow_mut().clear();
68 return;
69 }
70 if inputs.get_time_to_update() && self.frame_rate_display.get() {
71 self
72 .frame_rater
73 .borrow_mut()
74 .sample(self.inputs.borrow().get_update_time_millis());
75 }
76 }
77}