use crate::core::ObjectId;
use core::fmt;
#[derive(Default)]
pub struct PointerCaptureManager {
capturing_widget: Option<ObjectId>,
on_capture_released: Option<Box<dyn Fn(ObjectId)>>,
}
impl PointerCaptureManager {
pub fn new() -> Self {
Self::default()
}
pub fn capturing_widget(&self) -> Option<ObjectId> {
self.capturing_widget
}
pub fn set_capture(&mut self, widget_id: ObjectId) -> bool {
if self.capturing_widget == Some(widget_id) {
return false;
}
if let Some(old) = self.capturing_widget {
if let Some(ref cb) = self.on_capture_released {
(cb)(old);
}
}
self.capturing_widget = Some(widget_id);
true
}
pub fn release_capture(&mut self) -> bool {
if let Some(old) = self.capturing_widget {
self.capturing_widget = None;
if let Some(ref cb) = self.on_capture_released {
(cb)(old);
}
true
} else {
false
}
}
pub fn has_capture(&self, widget_id: ObjectId) -> bool {
self.capturing_widget == Some(widget_id)
}
pub fn set_on_capture_released(&mut self, cb: Box<dyn Fn(ObjectId)>) {
self.on_capture_released = Some(cb);
}
}
impl fmt::Debug for PointerCaptureManager {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PointerCaptureManager")
.field("capturing_widget", &self.capturing_widget)
.field("on_capture_released", &self.on_capture_released.as_ref().map(|_| "<callback>"))
.finish()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_manager_has_no_capture() {
let mgr = PointerCaptureManager::new();
assert!(mgr.capturing_widget().is_none());
}
#[test]
fn test_set_capture_returns_true_for_new_capture() {
let mut mgr = PointerCaptureManager::new();
assert!(mgr.set_capture(42));
assert_eq!(mgr.capturing_widget(), Some(42));
}
#[test]
fn test_set_capture_returns_false_for_same_widget() {
let mut mgr = PointerCaptureManager::new();
assert!(mgr.set_capture(42));
assert!(!mgr.set_capture(42)); }
#[test]
fn test_set_capture_replaces_previous_capture() {
let mut mgr = PointerCaptureManager::new();
mgr.set_capture(10);
assert!(mgr.set_capture(20)); assert_eq!(mgr.capturing_widget(), Some(20));
}
#[test]
fn test_release_capture_returns_true_when_capturing() {
let mut mgr = PointerCaptureManager::new();
mgr.set_capture(42);
assert!(mgr.release_capture());
assert!(mgr.capturing_widget().is_none());
}
#[test]
fn test_release_capture_returns_false_when_not_capturing() {
let mut mgr = PointerCaptureManager::new();
assert!(!mgr.release_capture());
}
#[test]
fn test_has_capture() {
let mut mgr = PointerCaptureManager::new();
assert!(!mgr.has_capture(42));
mgr.set_capture(42);
assert!(mgr.has_capture(42));
assert!(!mgr.has_capture(99));
mgr.release_capture();
assert!(!mgr.has_capture(42));
}
}