sbom_tools/tui/viewmodel/
overlay.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum OverlayKind {
9 Help,
11 Export,
13 Legend,
15}
16
17#[derive(Debug, Clone, Default)]
37pub struct OverlayState {
38 current: Option<OverlayKind>,
40}
41
42impl OverlayState {
43 pub fn new() -> Self {
45 Self { current: None }
46 }
47
48 pub fn has_overlay(&self) -> bool {
50 self.current.is_some()
51 }
52
53 pub fn is_showing(&self, kind: OverlayKind) -> bool {
55 self.current == Some(kind)
56 }
57
58 pub fn current(&self) -> Option<OverlayKind> {
60 self.current
61 }
62
63 pub fn show(&mut self, kind: OverlayKind) {
65 self.current = Some(kind);
66 }
67
68 pub fn close(&mut self) {
70 self.current = None;
71 }
72
73 pub fn close_all(&mut self) {
75 self.current = None;
76 }
77
78 pub fn toggle(&mut self, kind: OverlayKind) {
82 if self.current == Some(kind) {
83 self.current = None;
84 } else {
85 self.current = Some(kind);
86 }
87 }
88
89 pub fn toggle_help(&mut self) {
91 self.toggle(OverlayKind::Help);
92 }
93
94 pub fn toggle_export(&mut self) {
96 self.toggle(OverlayKind::Export);
97 }
98
99 pub fn toggle_legend(&mut self) {
101 self.toggle(OverlayKind::Legend);
102 }
103
104 pub fn show_help(&self) -> bool {
108 self.is_showing(OverlayKind::Help)
109 }
110
111 pub fn show_export(&self) -> bool {
113 self.is_showing(OverlayKind::Export)
114 }
115
116 pub fn show_legend(&self) -> bool {
118 self.is_showing(OverlayKind::Legend)
119 }
120}
121
122#[cfg(test)]
123mod tests {
124 use super::*;
125
126 #[test]
127 fn test_overlay_state_new() {
128 let state = OverlayState::new();
129 assert!(!state.has_overlay());
130 assert!(state.current().is_none());
131 }
132
133 #[test]
134 fn test_overlay_state_show() {
135 let mut state = OverlayState::new();
136
137 state.show(OverlayKind::Help);
138 assert!(state.has_overlay());
139 assert!(state.is_showing(OverlayKind::Help));
140 assert!(state.show_help());
141 assert!(!state.show_export());
142 assert!(!state.show_legend());
143 }
144
145 #[test]
146 fn test_overlay_state_mutual_exclusion() {
147 let mut state = OverlayState::new();
148
149 state.show(OverlayKind::Help);
150 assert!(state.is_showing(OverlayKind::Help));
151
152 state.show(OverlayKind::Export);
153 assert!(state.is_showing(OverlayKind::Export));
154 assert!(!state.is_showing(OverlayKind::Help));
155
156 state.show(OverlayKind::Legend);
157 assert!(state.is_showing(OverlayKind::Legend));
158 assert!(!state.is_showing(OverlayKind::Export));
159 }
160
161 #[test]
162 fn test_overlay_state_toggle() {
163 let mut state = OverlayState::new();
164
165 state.toggle(OverlayKind::Help);
167 assert!(state.is_showing(OverlayKind::Help));
168
169 state.toggle(OverlayKind::Help);
171 assert!(!state.has_overlay());
172
173 state.toggle(OverlayKind::Help);
175 state.toggle(OverlayKind::Export);
176 assert!(state.is_showing(OverlayKind::Export));
177 assert!(!state.is_showing(OverlayKind::Help));
178 }
179
180 #[test]
181 fn test_overlay_state_close() {
182 let mut state = OverlayState::new();
183
184 state.show(OverlayKind::Help);
185 assert!(state.has_overlay());
186
187 state.close();
188 assert!(!state.has_overlay());
189 }
190
191 #[test]
192 fn test_overlay_state_close_all() {
193 let mut state = OverlayState::new();
194
195 state.show(OverlayKind::Legend);
196 state.close_all();
197 assert!(!state.has_overlay());
198 }
199
200 #[test]
201 fn test_overlay_state_convenience_toggles() {
202 let mut state = OverlayState::new();
203
204 state.toggle_help();
205 assert!(state.show_help());
206
207 state.toggle_export();
208 assert!(state.show_export());
209 assert!(!state.show_help());
210
211 state.toggle_legend();
212 assert!(state.show_legend());
213 assert!(!state.show_export());
214 }
215}