ratatui_interact/utils/
mouse_capture.rs1use std::io::{self, Write};
26
27use crossterm::{
28 event::{DisableMouseCapture, EnableMouseCapture},
29 execute,
30};
31
32#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38pub struct MouseCaptureState {
39 enabled: bool,
41}
42
43impl MouseCaptureState {
44 pub fn new(enabled: bool) -> Self {
49 Self { enabled }
50 }
51
52 pub fn enabled() -> Self {
54 Self::new(true)
55 }
56
57 pub fn disabled() -> Self {
59 Self::new(false)
60 }
61
62 pub fn is_enabled(&self) -> bool {
64 self.enabled
65 }
66
67 pub fn is_copy_mode(&self) -> bool {
71 !self.enabled
72 }
73
74 pub fn set_enabled(&mut self, enabled: bool) {
76 self.enabled = enabled;
77 }
78
79 pub fn toggle(&mut self) -> bool {
81 self.enabled = !self.enabled;
82 self.enabled
83 }
84}
85
86impl Default for MouseCaptureState {
87 fn default() -> Self {
88 Self::enabled()
89 }
90}
91
92pub fn enable_mouse_capture<W: Write>(writer: &mut W) -> io::Result<()> {
99 execute!(writer, EnableMouseCapture)
100}
101
102pub fn disable_mouse_capture<W: Write>(writer: &mut W) -> io::Result<()> {
110 execute!(writer, DisableMouseCapture)
111}
112
113pub fn toggle_mouse_capture<W: Write>(
128 writer: &mut W,
129 state: &mut MouseCaptureState,
130) -> io::Result<bool> {
131 let new_enabled = state.toggle();
132 if new_enabled {
133 enable_mouse_capture(writer)?;
134 } else {
135 disable_mouse_capture(writer)?;
136 }
137 Ok(new_enabled)
138}
139
140pub fn set_mouse_capture<W: Write>(
150 writer: &mut W,
151 state: &mut MouseCaptureState,
152 enabled: bool,
153) -> io::Result<()> {
154 if state.is_enabled() != enabled {
155 state.set_enabled(enabled);
156 if enabled {
157 enable_mouse_capture(writer)?;
158 } else {
159 disable_mouse_capture(writer)?;
160 }
161 }
162 Ok(())
163}
164
165#[cfg(test)]
166mod tests {
167 use super::*;
168
169 #[test]
170 fn test_mouse_capture_state_new() {
171 let enabled = MouseCaptureState::new(true);
172 assert!(enabled.is_enabled());
173 assert!(!enabled.is_copy_mode());
174
175 let disabled = MouseCaptureState::new(false);
176 assert!(!disabled.is_enabled());
177 assert!(disabled.is_copy_mode());
178 }
179
180 #[test]
181 fn test_mouse_capture_state_constructors() {
182 let enabled = MouseCaptureState::enabled();
183 assert!(enabled.is_enabled());
184
185 let disabled = MouseCaptureState::disabled();
186 assert!(!disabled.is_enabled());
187 }
188
189 #[test]
190 fn test_mouse_capture_state_default() {
191 let state = MouseCaptureState::default();
192 assert!(state.is_enabled());
193 }
194
195 #[test]
196 fn test_mouse_capture_state_toggle() {
197 let mut state = MouseCaptureState::enabled();
198 assert!(state.is_enabled());
199
200 let result = state.toggle();
201 assert!(!result);
202 assert!(!state.is_enabled());
203 assert!(state.is_copy_mode());
204
205 let result = state.toggle();
206 assert!(result);
207 assert!(state.is_enabled());
208 }
209
210 #[test]
211 fn test_mouse_capture_state_set_enabled() {
212 let mut state = MouseCaptureState::enabled();
213
214 state.set_enabled(false);
215 assert!(!state.is_enabled());
216
217 state.set_enabled(true);
218 assert!(state.is_enabled());
219 }
220
221 #[test]
222 fn test_enable_mouse_capture() {
223 let mut buffer = Vec::new();
224 enable_mouse_capture(&mut buffer).unwrap();
225 assert!(!buffer.is_empty());
227 }
228
229 #[test]
230 fn test_disable_mouse_capture() {
231 let mut buffer = Vec::new();
232 disable_mouse_capture(&mut buffer).unwrap();
233 assert!(!buffer.is_empty());
235 }
236
237 #[test]
238 fn test_toggle_mouse_capture() {
239 let mut buffer = Vec::new();
240 let mut state = MouseCaptureState::enabled();
241
242 let result = toggle_mouse_capture(&mut buffer, &mut state).unwrap();
244 assert!(!result);
245 assert!(state.is_copy_mode());
246
247 buffer.clear();
249 let result = toggle_mouse_capture(&mut buffer, &mut state).unwrap();
250 assert!(result);
251 assert!(state.is_enabled());
252 }
253
254 #[test]
255 fn test_set_mouse_capture() {
256 let mut buffer = Vec::new();
257 let mut state = MouseCaptureState::enabled();
258
259 set_mouse_capture(&mut buffer, &mut state, true).unwrap();
261 assert!(buffer.is_empty());
262
263 set_mouse_capture(&mut buffer, &mut state, false).unwrap();
265 assert!(!buffer.is_empty());
266 assert!(state.is_copy_mode());
267 }
268}