Struct tuig_iosys::Screen
source · pub struct Screen { /* private fields */ }
Expand description
A text framebuffer.
Allows you to render things onto it, then can be rendered onto the screen. This strategy avoids flickering, partial renders, etc. and helps deduplicate rendering effort.
Implementations§
source§impl Screen
impl Screen
sourcepub fn new(size: XY) -> Self
pub fn new(size: XY) -> Self
Create a new Screen
in the given size.
Examples found in repository?
examples/list-actions.rs (line 7)
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 31)
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 fn size(&self) -> XY
pub fn size(&self) -> XY
How big this Screen is, in characters.
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 44)
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 fn cells(&self) -> &[Cell]
pub fn cells(&self) -> &[Cell]
All of the cells of this screen, in row-major order.
i.e. for the screen:
1 2
3 4
this will return &[1, 2, 3, 4]
.
sourcepub fn cells_mut(&mut self) -> &mut [Cell]
pub fn cells_mut(&mut self) -> &mut [Cell]
All of the cells of this screen, in row-major order, mutably.
sourcepub fn rows(&self) -> impl Iterator<Item = &[Cell]>
pub fn rows(&self) -> impl Iterator<Item = &[Cell]>
Returns an iterator over the rows in a screen.
sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Clear this screen’s contents, resetting it to the default and filling it with blank cells.
sourcepub fn resize(&mut self, size: XY)
pub fn resize(&mut self, size: XY)
Resize the screen, clearing its contents at the same time. Does not reallocate unless the screen is growing.
Examples found in repository?
examples/list-actions.rs (line 9)
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 45)
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 PartialEq for Screen
impl PartialEq for Screen
impl Eq for Screen
impl StructuralEq for Screen
impl StructuralPartialEq for Screen
Auto Trait Implementations§
impl RefUnwindSafe for Screen
impl Send for Screen
impl Sync for Screen
impl Unpin for Screen
impl UnwindSafe for Screen
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<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