use crate::environment::LayoutDirection;
use super::direction::{HorizontalSide, InlineDirection};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum OverlayBand {
TextAffordance,
#[default]
Standard,
}
impl OverlayBand {
pub const fn dismissed_by_outside_press(self) -> bool {
matches!(self, OverlayBand::Standard)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SelectionHandleKind {
Caret,
Start,
End,
}
impl SelectionHandleKind {
pub const fn inline(self) -> Option<InlineDirection> {
match self {
SelectionHandleKind::Caret => None,
SelectionHandleKind::Start => Some(InlineDirection::Backward),
SelectionHandleKind::End => Some(InlineDirection::Forward),
}
}
pub const fn side(self, direction: LayoutDirection) -> Option<HorizontalSide> {
match self.inline() {
Some(inline) => Some(inline.side(direction)),
None => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
const LTR: LayoutDirection = LayoutDirection::LeftToRight;
const RTL: LayoutDirection = LayoutDirection::RightToLeft;
#[test]
fn selection_handles_map_to_physical_sides_by_direction() {
assert_eq!(
SelectionHandleKind::Start.side(LTR),
Some(HorizontalSide::Left)
);
assert_eq!(
SelectionHandleKind::Start.side(RTL),
Some(HorizontalSide::Right)
);
assert_eq!(
SelectionHandleKind::End.side(LTR),
Some(HorizontalSide::Right)
);
assert_eq!(
SelectionHandleKind::End.side(RTL),
Some(HorizontalSide::Left)
);
assert_eq!(SelectionHandleKind::Caret.side(LTR), None);
assert_eq!(SelectionHandleKind::Caret.side(RTL), None);
}
#[test]
fn the_two_handles_are_always_on_opposite_sides() {
for direction in [LTR, RTL] {
let start = SelectionHandleKind::Start.side(direction).unwrap();
let end = SelectionHandleKind::End.side(direction).unwrap();
assert_eq!(start, end.opposite(), "under {direction:?}");
}
}
#[test]
fn only_the_standard_band_answers_to_an_outside_press() {
assert!(OverlayBand::Standard.dismissed_by_outside_press());
assert!(!OverlayBand::TextAffordance.dismissed_by_outside_press());
assert_eq!(OverlayBand::default(), OverlayBand::Standard);
assert!(OverlayBand::TextAffordance < OverlayBand::Standard);
}
}