com_croftsoft_lib_animation/frame_rater/updater/
mod.rs

1// =============================================================================
2//! - Frame Rate Updater
3//!
4//! # Metadata
5//! - Copyright: © 2023 [`CroftSoft Inc`]
6//! - Author: [`David Wallace Croft`]
7//! - Created: 2023-03-01
8//! - Updated: 2023-09-02
9//!
10//! [`CroftSoft Inc`]: https://www.croftsoft.com/
11//! [`David Wallace Croft`]: https://www.croftsoft.com/people/david/
12// =============================================================================
13
14use 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}