ravenrs_widgets/
full_screen.rs1use std::cell::Cell;
4use std::fmt;
5use std::rc::Rc;
6
7pub trait FullScreenProvider {
11 fn is_on(&self) -> bool;
13
14 fn set(&self, on: bool);
16
17 fn available(&self) -> bool {
20 true
21 }
22}
23
24#[derive(Debug, Default)]
26struct Remembered(Cell<bool>);
27
28impl FullScreenProvider for Remembered {
29 fn is_on(&self) -> bool {
30 self.0.get()
31 }
32
33 fn set(&self, on: bool) {
34 self.0.set(on);
35 }
36}
37
38#[derive(Clone)]
49#[cfg_attr(feature = "live", ravenrs_live::expose(part = "fields"))]
50pub struct FullScreen {
51 provider: Rc<dyn FullScreenProvider>,
52}
53
54#[cfg_attr(feature = "live", ravenrs_live::expose)]
55impl FullScreen {
56 pub fn new(provider: impl FullScreenProvider + 'static) -> Self {
58 Self { provider: Rc::new(provider) }
59 }
60
61 pub fn is_on(&self) -> bool {
63 self.provider.is_on()
64 }
65
66 pub fn set(&self, on: bool) {
68 self.provider.set(on);
69 }
70
71 pub fn toggle(&self) {
73 self.set(!self.is_on());
74 }
75
76 pub fn available(&self) -> bool {
78 self.provider.available()
79 }
80}
81
82impl Default for FullScreen {
83 fn default() -> Self {
84 Self::new(Remembered::default())
85 }
86}
87
88impl fmt::Debug for FullScreen {
89 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
90 f.debug_struct("FullScreen").field("on", &self.is_on()).finish_non_exhaustive()
91 }
92}