#[derive(Debug, Clone, Default)]
pub struct FocusManager {
ring: Vec<String>,
focused: Option<usize>,
}
impl FocusManager {
pub fn new() -> Self {
Self::default()
}
pub fn clear(&mut self) {
self.ring.clear();
self.focused = None;
}
pub fn register(&mut self, agent_id: impl Into<String>) {
self.ring.push(agent_id.into());
}
pub fn focused_id(&self) -> Option<&str> {
self.focused
.and_then(|i| self.ring.get(i))
.map(|s| s.as_str())
}
pub fn is_focused(&self, agent_id: &str) -> bool {
self.focused_id() == Some(agent_id)
}
pub fn focus_next(&mut self) {
if self.ring.is_empty() {
return;
}
self.focused = Some(match self.focused {
Some(i) => (i + 1) % self.ring.len(),
None => 0,
});
}
pub fn focus_previous(&mut self) {
if self.ring.is_empty() {
return;
}
self.focused = Some(match self.focused {
Some(0) => self.ring.len() - 1,
Some(i) => i - 1,
None => self.ring.len() - 1,
});
}
pub fn focus_id(&mut self, agent_id: &str) -> bool {
if let Some(i) = self.ring.iter().position(|id| id == agent_id) {
self.focused = Some(i);
true
} else {
false
}
}
pub fn blur(&mut self) {
self.focused = None;
}
pub fn len(&self) -> usize {
self.ring.len()
}
pub fn is_empty(&self) -> bool {
self.ring.is_empty()
}
pub fn ids(&self) -> &[String] {
&self.ring
}
}