meli/ui/src/position.rs

60 lines
1.3 KiB
Rust

/*!
Simple type definitions and macro helper for a (x,y) position on the terminal and the areas they define.
An `Area` consists of two points: the upper left and bottom right corners.
*/
/// A `(x, y)` position on screen.
pub type Pos = (usize, usize);
#[inline(always)]
pub fn get_x(p: Pos) -> usize {
p.0
}
#[inline(always)]
pub fn get_y(p: Pos) -> usize {
p.1
}
#[inline(always)]
pub fn set_x(p: Pos, new_x: usize) -> Pos {
(new_x, p.1)
}
#[inline(always)]
pub fn set_y(p: Pos, new_y: usize) -> Pos {
(p.0, new_y)
}
/// An `Area` consists of two points: the upper left and bottom right corners.
pub type Area = (Pos, Pos);
#[macro_export]
macro_rules! upper_left { ($a:expr) => ( $a.0 ) }
#[macro_export]
macro_rules! bottom_right { ($a:expr) => ( $a.1 ) }
#[macro_export]
macro_rules! is_valid_area { ($a:expr) =>
{
{
let upper_left = upper_left!($a);
let bottom_right = bottom_right!($a);
if get_y(upper_left) > get_y(bottom_right) || get_x(upper_left) > get_x(bottom_right) {
false
} else {
true
}
}
}
}
/// A `(cols, rows)` size.
pub type Size = (usize, usize);
pub trait HasSize {
fn size(&self) -> Size;
}
pub trait HasPosition {
fn origin(&self) -> Pos;
fn set_origin(&mut self, new_origin: Pos);
}