#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum FocusTarget<O = ()> {
CanvasField(usize),
InternalCanvasField(usize),
Button(usize),
Section(usize),
SectionItem {
section: usize,
item: usize,
},
Overlay(O),
ModalItem(usize),
Custom(String),
}
impl<O> FocusTarget<O> {
pub fn is_canvas(&self) -> bool {
matches!(
self,
FocusTarget::CanvasField(_) | FocusTarget::InternalCanvasField(_)
)
}
pub fn is_button(&self) -> bool {
matches!(self, FocusTarget::Button(_))
}
pub fn is_overlay(&self) -> bool {
matches!(self, FocusTarget::Overlay(_) | FocusTarget::ModalItem(_))
}
pub fn is_top_level_navigable(&self) -> bool {
!matches!(self, FocusTarget::InternalCanvasField(_))
}
}
impl<O: Clone> FocusTarget<O> {
pub fn to_overlay(&self) -> Option<O> {
match self {
FocusTarget::Overlay(kind) => Some(kind.clone()),
_ => None,
}
}
}