Struct tuig_iosys::XY
source · pub struct XY(pub usize, pub usize);
Expand description
A position or size, with an X and a Y component.
You can do most arithmetic with XY
that you could with integers, both elementwise with other XY
s (e.g.
XY(2, 3) * XY(4, 5) == XY(8, 15)
) and with scalars (e.g. XY(2, 3) * 4 == XY(8, 12)
).
XY
s aren’t totally ordered because the components can be ordered differently, e.g. XY(1, 5)
and XY(2, 3)
,
the x is less but the y is greater. However, some methods (where it makes sense) are provided separately from
Ord
, and they operate elementwise, e.g. Self::clamp
.
When used as a position, XY(0, 0)
is at the top left of the screen, and XY(0, 1)
is just below it – the usual
“graphics axes”.
Tuple Fields§
§0: usize
§1: usize
Implementations§
source§impl XY
impl XY
sourcepub const fn x(&self) -> usize
pub const fn x(&self) -> usize
The X component
Examples found in repository?
examples/list-actions.rs (line 11)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
fn list_events(mut sys: Box<dyn IoSystem>) {
let mut log = vec!["press escape to exit when you're done".to_owned()];
let mut screen = Screen::new(sys.size());
loop {
screen.resize(sys.size());
for (line, row) in log.iter().rev().zip((0..screen.size().y()).rev()) {
for (char, col) in line.chars().zip(0..screen.size().x()) {
screen[row][col] = Cell::of(char);
}
}
sys.draw(&screen).expect("failed to render screen");
match sys.input().expect("failed to get input") {
Action::Closed | Action::KeyPress { key: Key::Escape } => break,
Action::Error(e) => panic!("{1}: {:?}", e, "got an error for input"),
other => log.push(format!("{:?}", other)),
}
if log.len() > screen.size().y() {
let diff = log.len() - screen.size().y();
log.drain(..diff);
}
}
sys.stop();
}
More examples
examples/color-demo.rs (line 48)
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
fn color_demo(mut sys: Box<dyn IoSystem>) {
let color_width = Color::all()
.into_iter()
.map(|c| format!("{:?}", c).len())
.max()
.unwrap();
let mut lines: Vec<Vec<Cell>> = Color::all()
.into_iter()
.map(|bg| {
let mut line = vec![];
for fg in Color::all() {
let text = format!("{:?} on {1:<2$} ", fg, format!("{:?}", bg), color_width);
line.extend(text.chars().map(move |c| Cell::of(c).fg(fg).bg(bg)));
}
line
})
.collect();
let width: usize = lines.iter().map(|l| l.len()).max().unwrap() + 5;
for line in &mut lines {
let bg = line[0].get_fmt().bg;
line.extend(repeat(Cell::of(' ').bg(bg)).take(width - line.len()));
}
let mut screen = Screen::new(XY(0, 0));
let mut pos = 0;
let mut moving = true;
'main: loop {
while let Some(action) = sys.poll_input().unwrap() {
match action {
Action::Closed | Action::KeyPress { key: Key::Escape } => break 'main,
Action::KeyPress {
key: Key::Char(' '),
} => moving = !moving,
_ => (),
}
}
if moving || sys.size() != screen.size() {
screen.resize(sys.size());
for row in 0..screen.size().y() {
let o_row = (row + pos) % lines.len();
for col in 0..screen.size().x() {
let o_col = (col + pos * 3) % width;
screen[row][col] = lines[o_row][o_col].clone();
}
}
sys.draw(&screen).expect("failed to render screen");
}
if moving {
pos += 1;
thread::sleep(Duration::from_millis(250));
} else {
thread::sleep(Duration::from_millis(50));
}
}
sys.stop();
}
sourcepub const fn y(&self) -> usize
pub const fn y(&self) -> usize
The Y component
Examples found in repository?
examples/list-actions.rs (line 10)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
fn list_events(mut sys: Box<dyn IoSystem>) {
let mut log = vec!["press escape to exit when you're done".to_owned()];
let mut screen = Screen::new(sys.size());
loop {
screen.resize(sys.size());
for (line, row) in log.iter().rev().zip((0..screen.size().y()).rev()) {
for (char, col) in line.chars().zip(0..screen.size().x()) {
screen[row][col] = Cell::of(char);
}
}
sys.draw(&screen).expect("failed to render screen");
match sys.input().expect("failed to get input") {
Action::Closed | Action::KeyPress { key: Key::Escape } => break,
Action::Error(e) => panic!("{1}: {:?}", e, "got an error for input"),
other => log.push(format!("{:?}", other)),
}
if log.len() > screen.size().y() {
let diff = log.len() - screen.size().y();
log.drain(..diff);
}
}
sys.stop();
}
More examples
examples/color-demo.rs (line 46)
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
fn color_demo(mut sys: Box<dyn IoSystem>) {
let color_width = Color::all()
.into_iter()
.map(|c| format!("{:?}", c).len())
.max()
.unwrap();
let mut lines: Vec<Vec<Cell>> = Color::all()
.into_iter()
.map(|bg| {
let mut line = vec![];
for fg in Color::all() {
let text = format!("{:?} on {1:<2$} ", fg, format!("{:?}", bg), color_width);
line.extend(text.chars().map(move |c| Cell::of(c).fg(fg).bg(bg)));
}
line
})
.collect();
let width: usize = lines.iter().map(|l| l.len()).max().unwrap() + 5;
for line in &mut lines {
let bg = line[0].get_fmt().bg;
line.extend(repeat(Cell::of(' ').bg(bg)).take(width - line.len()));
}
let mut screen = Screen::new(XY(0, 0));
let mut pos = 0;
let mut moving = true;
'main: loop {
while let Some(action) = sys.poll_input().unwrap() {
match action {
Action::Closed | Action::KeyPress { key: Key::Escape } => break 'main,
Action::KeyPress {
key: Key::Char(' '),
} => moving = !moving,
_ => (),
}
}
if moving || sys.size() != screen.size() {
screen.resize(sys.size());
for row in 0..screen.size().y() {
let o_row = (row + pos) % lines.len();
for col in 0..screen.size().x() {
let o_col = (col + pos * 3) % width;
screen[row][col] = lines[o_row][o_col].clone();
}
}
sys.draw(&screen).expect("failed to render screen");
}
if moving {
pos += 1;
thread::sleep(Duration::from_millis(250));
} else {
thread::sleep(Duration::from_millis(50));
}
}
sys.stop();
}
Trait Implementations§
source§impl AddAssign for XY
impl AddAssign for XY
source§fn add_assign(&mut self, rhs: XY)
fn add_assign(&mut self, rhs: XY)
Performs the
+=
operation. Read moresource§impl DivAssign for XY
impl DivAssign for XY
source§fn div_assign(&mut self, rhs: XY)
fn div_assign(&mut self, rhs: XY)
Performs the
/=
operation. Read moresource§impl MulAssign for XY
impl MulAssign for XY
source§fn mul_assign(&mut self, rhs: XY)
fn mul_assign(&mut self, rhs: XY)
Performs the
*=
operation. Read moresource§impl PartialOrd for XY
impl PartialOrd for XY
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for
self
and other
) and is used by the <=
operator. Read moresource§impl RemAssign for XY
impl RemAssign for XY
source§fn rem_assign(&mut self, rhs: XY)
fn rem_assign(&mut self, rhs: XY)
Performs the
%=
operation. Read moresource§impl SubAssign for XY
impl SubAssign for XY
source§fn sub_assign(&mut self, rhs: XY)
fn sub_assign(&mut self, rhs: XY)
Performs the
-=
operation. Read moreimpl Copy for XY
impl Eq for XY
impl StructuralEq for XY
impl StructuralPartialEq for XY
Auto Trait Implementations§
impl RefUnwindSafe for XY
impl Send for XY
impl Sync for XY
impl Unpin for XY
impl UnwindSafe for XY
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Checks if this value is equivalent to the given key. Read more