/// A trait for elements that can be toggled.////// Implement this for elements that are visually distinct/// when in two opposing states, like checkboxes or switches.pub trait Toggleable { /// Sets whether the element is selected. fn toggle_state(self, selected: bool) -> Self;}/// Represents the selection status of an element.#[derive(Debug, Default, PartialEq, Eq, Hash, Clone, Copy)]pub enum ToggleState { /// The element is not selected. #[default] Unselected, /// The selection state of the element is indeterminate. Indeterminate, /// The element is selected. Selected,}impl ToggleState { /// Returns the inverse of the current selection status. /// /// Indeterminate states become selected if inverted. pub fn inverse(&self) -> Self { match self { Self::Unselected | Self::Indeterminate => Self::Selected, Self::Selected => Self::Unselected, } }}impl From<bool> for ToggleState { fn from(selected: bool) -> Self { if selected { Self::Selected } else { Self::Unselected } }}impl From<Option<bool>> for ToggleState { fn from(selected: Option<bool>) -> Self { match selected { Some(true) => Self::Selected, Some(false) => Self::Unselected, None => Self::Unselected, } }}
/// A trait for elements that can be toggled.
///
/// Implement this for elements that are visually distinct
/// when in two opposing states, like checkboxes or switches.
pub trait Toggleable {
/// Sets whether the element is selected.
fn toggle_state(self, selected: bool) -> Self;
}
/// Represents the selection status of an element.
#[derive(Debug, Default, PartialEq, Eq, Hash, Clone, Copy)]
pub enum ToggleState {
/// The element is not selected.
#[default]
Unselected,
/// The selection state of the element is indeterminate.
Indeterminate,
/// The element is selected.
Selected,
}
impl ToggleState {
/// Returns the inverse of the current selection status.
///
/// Indeterminate states become selected if inverted.
pub fn inverse(&self) -> Self {
match self {
Self::Unselected | Self::Indeterminate => Self::Selected,
Self::Selected => Self::Unselected,
}
}
}
impl From<bool> for ToggleState {
fn from(selected: bool) -> Self {
if selected {
Self::Selected
} else {
Self::Unselected
}
}
}
impl From<Option<bool>> for ToggleState {
fn from(selected: Option<bool>) -> Self {
match selected {
Some(true) => Self::Selected,
Some(false) => Self::Unselected,
None => Self::Unselected,
}
}
}