pub use euclid;
use euclid::*;
pub struct ScreenSpace;
pub type ScreenPoint = Point2D<f64, ScreenSpace>;
pub struct ClientSpace;
pub type ClientPoint = Point2D<f64, ClientSpace>;
pub struct ElementSpace;
pub type ElementPoint = Point2D<f64, ElementSpace>;
pub struct PageSpace;
pub type PagePoint = Point2D<f64, PageSpace>;
pub struct Pixels;
pub type PixelsSize = Size2D<f64, Pixels>;
pub type PixelsRect = Rect<f64, Pixels>;
pub type PixelsVector2D = Vector2D<f64, Pixels>;
pub type PixelsVector3D = Vector3D<f64, Pixels>;
pub struct Lines;
pub type LinesVector = Vector3D<f64, Lines>;
pub struct Pages;
pub type PagesVector = Vector3D<f64, Pages>;
#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
pub enum WheelDelta {
Pixels(PixelsVector3D),
Lines(LinesVector),
Pages(PagesVector),
}
impl WheelDelta {
pub fn from_web_attributes(delta_mode: u32, delta_x: f64, delta_y: f64, delta_z: f64) -> Self {
match delta_mode {
0 => WheelDelta::Pixels(PixelsVector3D::new(delta_x, delta_y, delta_z)),
1 => WheelDelta::Lines(LinesVector::new(delta_x, delta_y, delta_z)),
2 => WheelDelta::Pages(PagesVector::new(delta_x, delta_y, delta_z)),
_ => panic!("Invalid delta mode, {:?}", delta_mode),
}
}
pub fn pixels(x: f64, y: f64, z: f64) -> Self {
WheelDelta::Pixels(PixelsVector3D::new(x, y, z))
}
pub fn lines(x: f64, y: f64, z: f64) -> Self {
WheelDelta::Lines(LinesVector::new(x, y, z))
}
pub fn pages(x: f64, y: f64, z: f64) -> Self {
WheelDelta::Pages(PagesVector::new(x, y, z))
}
pub fn is_zero(&self) -> bool {
self.strip_units() == Vector3D::new(0., 0., 0.)
}
pub fn strip_units(&self) -> Vector3D<f64, UnknownUnit> {
match self {
WheelDelta::Pixels(v) => v.cast_unit(),
WheelDelta::Lines(v) => v.cast_unit(),
WheelDelta::Pages(v) => v.cast_unit(),
}
}
}
#[derive(Debug, PartialEq)]
pub struct Coordinates {
screen: ScreenPoint,
client: ClientPoint,
element: ElementPoint,
page: PagePoint,
}
impl Coordinates {
pub fn new(
screen: ScreenPoint,
client: ClientPoint,
element: ElementPoint,
page: PagePoint,
) -> Self {
Self {
screen,
client,
element,
page,
}
}
pub fn screen(&self) -> ScreenPoint {
self.screen
}
pub fn client(&self) -> ClientPoint {
self.client
}
pub fn element(&self) -> ElementPoint {
self.element
}
pub fn page(&self) -> PagePoint {
self.page
}
}