cursive/examples/position.rs
Alexandre Bury 05e1212a50 Refactor Backend input model
Backends now have to send input to the given `chan::Sender<Event>`.
They send these events from a separate thread, allowing selection
between input and callbacks.

This currently breaks the BearLibTerminal backend, which requires all
calls to come from the UI thread.

This might not be super-safe for the ncurses backend also. We hope that
input and output are separate enough that they can run concurrently without
problem.
2018-05-20 09:59:35 -07:00

44 lines
1.2 KiB
Rust

extern crate cursive;
use cursive::Cursive;
use cursive::view::Position;
use cursive::views::LayerPosition;
use cursive::views::TextView;
/// Moves top layer by the specified amount
fn move_top(c: &mut Cursive, x_in: isize, y_in: isize) {
// Step 1. Get the current position of the layer.
let s = c.screen_mut();
let l = LayerPosition::FromFront(0);
// Step 2. add the specifed amount
let pos = s.offset().saturating_add((x_in, y_in));
// convert the new x and y into a position
let p = Position::absolute(pos);
// Step 3. Apply the new position
s.reposition_layer(l, p);
}
fn main() {
let mut siv = Cursive::default();
// We can quit by pressing `q`
siv.add_global_callback('q', Cursive::quit);
// Next Gen FPS Controls.
siv.add_global_callback('w', |s| move_top(s, 0, -1));
siv.add_global_callback('a', |s| move_top(s, -1, 0));
siv.add_global_callback('s', |s| move_top(s, 0, 1));
siv.add_global_callback('d', |s| move_top(s, 1, 0));
// Add window to fly around.
siv.add_layer(TextView::new(
"Press w,a,s,d to move the window.\n\
Press q to quit the application.",
));
// Run the event loop
siv.run();
}