worked on some examples
This commit is contained in:
parent
406f2046f9
commit
f6b1955cae
@ -1,72 +0,0 @@
|
|||||||
extern crate crossterm;
|
|
||||||
|
|
||||||
use crossterm::style::Color;
|
|
||||||
use crossterm::terminal::{self, ClearType};
|
|
||||||
use crossterm::Crossterm;
|
|
||||||
|
|
||||||
use std::io::{stdout, Write};
|
|
||||||
use std::{thread, time};
|
|
||||||
|
|
||||||
fn print_wait_screen(crossterm: &mut Crossterm) {
|
|
||||||
let mut terminal = crossterm.terminal();
|
|
||||||
let mut cursor = crossterm.cursor();
|
|
||||||
|
|
||||||
terminal.clear(ClearType::All);
|
|
||||||
|
|
||||||
cursor.goto(0, 0);
|
|
||||||
cursor.hide();
|
|
||||||
|
|
||||||
terminal.write(
|
|
||||||
"Welcome to the wait screen.\n\
|
|
||||||
Please wait a few seconds until we arrive back at the main screen.\n\
|
|
||||||
Progress: ",
|
|
||||||
);
|
|
||||||
|
|
||||||
// print some progress example.
|
|
||||||
for i in 1..5 {
|
|
||||||
// print the current counter at the line of `Seconds to Go: {counter}`
|
|
||||||
cursor
|
|
||||||
.goto(10, 2)
|
|
||||||
.print(crossterm.paint(format!("{} of the 5 items processed", i)).with(Color::Red).on(Color::Blue));
|
|
||||||
|
|
||||||
// 1 second delay
|
|
||||||
thread::sleep(time::Duration::from_secs(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
stdout().flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// print wait screen on alternate screen, then swich back.
|
|
||||||
pub fn print_wait_screen_on_alternate_window() {
|
|
||||||
|
|
||||||
let mut term = Crossterm::new();
|
|
||||||
term.to_alternate_screen();
|
|
||||||
|
|
||||||
term.write(b"test");
|
|
||||||
print_wait_screen(&mut term);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// some stress test switch from and to alternate screen.
|
|
||||||
pub fn switch_between_main_and_alternate_screen() {
|
|
||||||
|
|
||||||
{
|
|
||||||
let mut term = Crossterm::new();
|
|
||||||
let cursor = term.cursor();
|
|
||||||
|
|
||||||
// create new alternate screen instance and switch to the alternate screen.
|
|
||||||
term.to_alternate_screen();
|
|
||||||
cursor.goto(0, 0);
|
|
||||||
write!(term, "we are at the alternate screen!");
|
|
||||||
thread::sleep(time::Duration::from_secs(3));
|
|
||||||
|
|
||||||
term.to_main_screen();
|
|
||||||
write!(term, "we are at the alternate screen!");
|
|
||||||
thread::sleep(time::Duration::from_secs(3));
|
|
||||||
|
|
||||||
term.to_alternate_screen();
|
|
||||||
write!(term, "we are at the alternate screen!");
|
|
||||||
thread::sleep(time::Duration::from_secs(3));
|
|
||||||
} // <- Crossterm goes out of scope.
|
|
||||||
|
|
||||||
println!("Whe are back at the main screen");
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
extern crate crossterm;
|
|
||||||
|
|
||||||
use crossterm::Crossterm;
|
|
||||||
|
|
||||||
use crossterm::terminal::{self, ClearType};
|
|
||||||
|
|
||||||
use std::io::{stdout, Write};
|
|
||||||
use std::{thread, time};
|
|
||||||
|
|
||||||
// raw screen is not working correctly currently
|
|
||||||
fn print_wait_screen(crossterm: &mut Crossterm) {
|
|
||||||
let terminal = crossterm.terminal();
|
|
||||||
let mut cursor = crossterm.cursor();
|
|
||||||
|
|
||||||
terminal.clear(ClearType::All);
|
|
||||||
|
|
||||||
cursor.goto(0, 0).print("Welcome to the wait screen.");
|
|
||||||
cursor
|
|
||||||
.goto(0, 1)
|
|
||||||
.print("Please wait a few seconds until we arrive back at the main screen.");
|
|
||||||
cursor.goto(0, 2).print("Progress: ");
|
|
||||||
|
|
||||||
// print some progress example.
|
|
||||||
for i in 1..5 {
|
|
||||||
// print the current counter at the line of `Seconds to Go: {counter}`
|
|
||||||
cursor
|
|
||||||
.goto(10, 2)
|
|
||||||
.print(format!("{} of the 5 items processed", i));
|
|
||||||
|
|
||||||
// 1 second delay
|
|
||||||
thread::sleep(time::Duration::from_secs(1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn print_wait_screen_on_alternate_window() {
|
|
||||||
let mut term = Crossterm::new();
|
|
||||||
|
|
||||||
// create scope. If this scope ends the screen will be switched back to mainscreen.
|
|
||||||
// because `AlternateScreen` switches back to main screen when going out of scope.
|
|
||||||
{
|
|
||||||
// create new alternate screen instance this call is also switching the screen to alternate screen.
|
|
||||||
// then convert the output of the program to raw mode.
|
|
||||||
// then print the wait screen on the alternate screen in raw mode.
|
|
||||||
term.to_alternate_screen();
|
|
||||||
term.enable_raw_mode();
|
|
||||||
|
|
||||||
// Print the wait screen.
|
|
||||||
print_wait_screen(&mut term);
|
|
||||||
|
|
||||||
term.flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
println!("Whe are back at the main screen");
|
|
||||||
}
|
|
@ -1,139 +0,0 @@
|
|||||||
//!
|
|
||||||
//! Terminal Examples
|
|
||||||
//!
|
|
||||||
|
|
||||||
extern crate crossterm;
|
|
||||||
|
|
||||||
use crossterm::terminal::ClearType;
|
|
||||||
use crossterm::Crossterm;
|
|
||||||
|
|
||||||
fn print_test_data() {
|
|
||||||
for i in 0..100 {
|
|
||||||
println!("Test data to test terminal: {}", i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clear all lines in terminal | demonstration
|
|
||||||
pub fn clear_all_lines() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
|
|
||||||
print_test_data();
|
|
||||||
|
|
||||||
// Clear all lines in terminal;
|
|
||||||
terminal.clear(ClearType::All);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clear all lines from cursor position X:4, Y:4 down | demonstration
|
|
||||||
pub fn clear_from_cursor_down() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
|
|
||||||
print_test_data();
|
|
||||||
|
|
||||||
// Set terminal cursor position (see example for more info).
|
|
||||||
term.cursor().goto(4, 8);
|
|
||||||
|
|
||||||
// Clear all cells from current cursor position down.
|
|
||||||
terminal.clear(ClearType::FromCursorDown);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clear all lines from cursor position X:4, Y:4 up | demonstration
|
|
||||||
pub fn clear_from_cursor_up() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
|
|
||||||
print_test_data();
|
|
||||||
|
|
||||||
// Set terminal cursor position (see example for more info).
|
|
||||||
term.cursor().goto(4, 4);
|
|
||||||
|
|
||||||
// Clear all cells from current cursor position down.
|
|
||||||
terminal.clear(ClearType::FromCursorUp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clear all lines from cursor position X:4, Y:4 up | demonstration
|
|
||||||
pub fn clear_current_line() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
|
|
||||||
print_test_data();
|
|
||||||
|
|
||||||
// Set terminal cursor position (see example for more info).
|
|
||||||
term.cursor().goto(4, 4);
|
|
||||||
|
|
||||||
// Clear current line cells.
|
|
||||||
terminal.clear(ClearType::CurrentLine);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clear all lines from cursor position X:4, Y:7 up | demonstration
|
|
||||||
pub fn clear_until_new_line() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
|
|
||||||
print_test_data();
|
|
||||||
|
|
||||||
// Set terminal cursor position (see example for more info).
|
|
||||||
term.cursor().goto(4, 20);
|
|
||||||
|
|
||||||
// Clear all the cells until next line.
|
|
||||||
terminal.clear(ClearType::UntilNewLine);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Print the the current terminal size | demonstration.
|
|
||||||
pub fn print_terminal_size() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
|
|
||||||
// Get terminal size
|
|
||||||
let (width, height) = terminal.terminal_size();
|
|
||||||
|
|
||||||
// Print results
|
|
||||||
print!("X: {}, y: {}", width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set the terminal size to width 10, height: 10 | demonstration.
|
|
||||||
pub fn set_terminal_size() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
|
|
||||||
terminal.set_size(10, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Scroll down 10 lines | demonstration.
|
|
||||||
pub fn scroll_down() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
|
|
||||||
print_test_data();
|
|
||||||
|
|
||||||
// Scroll down 10 lines.
|
|
||||||
terminal.scroll_down(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Scroll down 10 lines | demonstration.
|
|
||||||
pub fn scroll_up() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
|
|
||||||
print_test_data();
|
|
||||||
|
|
||||||
// Scroll up 10 lines.
|
|
||||||
terminal.scroll_up(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Resize the terminal to X: 10, Y: 10 | demonstration.
|
|
||||||
pub fn resize_terminal() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
|
|
||||||
// Get terminal size
|
|
||||||
terminal.set_size(10, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// exit the current proccess.
|
|
||||||
pub fn exit() {
|
|
||||||
let term = Crossterm::new();
|
|
||||||
let mut terminal = term.terminal();
|
|
||||||
terminal.exit();
|
|
||||||
}
|
|
@ -4,4 +4,8 @@ It has 4 modules:
|
|||||||
- color (this is about all the styling of the terminal)
|
- color (this is about all the styling of the terminal)
|
||||||
- cursor (this is about all the actions you can perform with the cursor)
|
- cursor (this is about all the actions you can perform with the cursor)
|
||||||
- terminal (this is about all the actions you can perform on the terminal)
|
- terminal (this is about all the actions you can perform on the terminal)
|
||||||
|
- input (this is about all input actions you can perform on with terminal)
|
||||||
|
- crossterm_type (this is about the struct `Crossterm`)
|
||||||
- program examples (this folder will contain some real life examples)
|
- program examples (this folder will contain some real life examples)
|
||||||
|
|
||||||
|
To run any example where there is a `main()` you could run `cargo run --example simple`.
|
@ -6,3 +6,4 @@ The programs are:
|
|||||||
|
|
||||||
- First depth search:
|
- First depth search:
|
||||||
This is an search algorithm implemented visually. This program uses the following functionalities: cursor movement, coloring, alternate screen and terminal clearing.
|
This is an search algorithm implemented visually. This program uses the following functionalities: cursor movement, coloring, alternate screen and terminal clearing.
|
||||||
|
- Duplex: This is a terminal application where there is some kind of conterminous output and with async input. So you could type an command while text is being outputted.
|
@ -7,5 +7,5 @@ authors = ["TimonPost <timonpost@hotmail.nl>"]
|
|||||||
rand = "0.4.2"
|
rand = "0.4.2"
|
||||||
|
|
||||||
[dependencies.crossterm]
|
[dependencies.crossterm]
|
||||||
path = "../../../../"
|
path = "../../../"
|
||||||
branch = "development"
|
branch = "development"
|
@ -9,11 +9,11 @@ mod variables;
|
|||||||
use crossterm::Crossterm;
|
use crossterm::Crossterm;
|
||||||
use crossterm::terminal::ClearType;
|
use crossterm::terminal::ClearType;
|
||||||
use crossterm::style::Color;
|
use crossterm::style::Color;
|
||||||
use crossterm::screen;
|
|
||||||
|
|
||||||
use self::variables::{Size, Position };
|
use self::variables::{Size, Position };
|
||||||
use self::messages::WELCOME_MESSAGE;
|
use self::messages::WELCOME_MESSAGE;
|
||||||
|
|
||||||
|
use std::io::Read;
|
||||||
use std::iter::Iterator;
|
use std::iter::Iterator;
|
||||||
use std::{thread, time};
|
use std::{thread, time};
|
||||||
|
|
||||||
@ -26,21 +26,21 @@ fn main()
|
|||||||
pub fn run()
|
pub fn run()
|
||||||
{
|
{
|
||||||
// // create new Crossterm instance.
|
// // create new Crossterm instance.
|
||||||
// let mut crossterm = Crossterm::new();
|
let mut crossterm = Crossterm::new();
|
||||||
//
|
// set size of terminal so the map we are going to draw is fitting the screen.
|
||||||
// print_welcome_screen(&crossterm);
|
crossterm.terminal().set_size(110,50);
|
||||||
//
|
|
||||||
// start_algorithm(&mut crossterm);
|
|
||||||
//
|
|
||||||
// print_end_screen(&crossterm);
|
|
||||||
|
|
||||||
|
print_welcome_screen(&mut crossterm);
|
||||||
|
|
||||||
|
start_algorithm(&mut crossterm);
|
||||||
|
|
||||||
|
print_end_screen(&crossterm);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn start_algorithm(crossterm: &mut Crossterm)
|
fn start_algorithm(crossterm: &mut Crossterm)
|
||||||
{
|
{
|
||||||
// we first want to switch to alternate screen. On the alternate screen we are going to run or firstdepthsearch algorithm
|
// we first want to switch to alternate screen. On the alternate screen we are going to run or firstdepthsearch algorithm
|
||||||
let alternate_screen = screen::AlternateScreen::from(crossterm.context());
|
crossterm.to_alternate_screen();
|
||||||
|
|
||||||
// setup the map size and the position to start searching for a path.
|
// setup the map size and the position to start searching for a path.
|
||||||
let map_size = Size::new(100,40);
|
let map_size = Size::new(100,40);
|
||||||
@ -60,11 +60,13 @@ fn print_end_screen(crossterm: &Crossterm)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_welcome_screen(crossterm: &Crossterm)
|
fn print_welcome_screen(crossterm: &mut Crossterm)
|
||||||
{
|
{
|
||||||
// create the handle for the cursor and terminal.
|
// create the handle for the cursor and terminal.
|
||||||
let mut cursor = crossterm.cursor();
|
|
||||||
|
crossterm.enable_raw_mode();
|
||||||
let mut terminal = crossterm.terminal();
|
let mut terminal = crossterm.terminal();
|
||||||
|
let mut cursor = crossterm.cursor();
|
||||||
|
|
||||||
// clear the screen and print the welcome message.
|
// clear the screen and print the welcome message.
|
||||||
terminal.clear(ClearType::All);
|
terminal.clear(ClearType::All);
|
||||||
@ -74,15 +76,26 @@ fn print_welcome_screen(crossterm: &Crossterm)
|
|||||||
cursor.hide();
|
cursor.hide();
|
||||||
cursor.goto(0,10);
|
cursor.goto(0,10);
|
||||||
terminal.write(
|
terminal.write(
|
||||||
"The first depth search algorithm will start in: Seconds"
|
"The first depth search algorithm will start in: Seconds\n\
|
||||||
|
Press `q` to abort the program"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let input = crossterm.input();
|
||||||
|
let mut stdin = input.read_async().bytes();
|
||||||
|
|
||||||
// print some progress example.
|
// print some progress example.
|
||||||
for i in (1..5).rev() {
|
for i in (1..5).rev() {
|
||||||
|
|
||||||
|
let a = stdin.next();
|
||||||
|
|
||||||
|
if let Some(Ok(b'q')) = a {
|
||||||
|
terminal.exit();
|
||||||
|
}
|
||||||
|
|
||||||
// print the current counter at the line of `Seconds to Go: {counter}`
|
// print the current counter at the line of `Seconds to Go: {counter}`
|
||||||
cursor
|
cursor
|
||||||
.goto(48, 10)
|
.goto(48, 10)
|
||||||
.print(terminal.paint(format!("{}", i)).with(Color::Red).on(Color::Blue));
|
.print(crossterm.paint(format!("{}", i)).with(Color::Red).on(Color::Blue));
|
||||||
|
|
||||||
// 1 second delay
|
// 1 second delay
|
||||||
thread::sleep(time::Duration::from_secs(1));
|
thread::sleep(time::Duration::from_secs(1));
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
use super::variables::{Cell, Position, Size };
|
use super::variables::{Cell, Position, Size };
|
||||||
use crossterm::terminal::terminal;
|
|
||||||
use crossterm::cursor::cursor;
|
|
||||||
use crossterm::Crossterm;
|
use crossterm::Crossterm;
|
||||||
use crossterm::style::{ObjectStyle, StyledObject, Color};
|
use crossterm::style::{ObjectStyle, StyledObject, Color};
|
||||||
use crossterm::Context;
|
|
||||||
use std::rc::Rc;
|
|
||||||
|
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@ extern crate crossterm;
|
|||||||
|
|
||||||
use self::crossterm::terminal::{terminal, ClearType};
|
use self::crossterm::terminal::{terminal, ClearType};
|
||||||
use self::crossterm::style::{Color, StyledObject, ObjectStyle };
|
use self::crossterm::style::{Color, StyledObject, ObjectStyle };
|
||||||
use self::crossterm::Context;
|
|
||||||
|
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
|
|
||||||
//! This bin folder can be used to try the examples out located in the examples directory.
|
//! This bin folder can be used to try the examples out located in the examples directory.
|
||||||
//!
|
//!
|
||||||
//! All you need to do is:
|
//! All you need to do is:
|
||||||
//!
|
//!
|
||||||
//! - Download the crossterm source code.
|
//! - Download the crossterm source code.
|
||||||
|
//!
|
||||||
//! - Add this in the Cargo.toml file:
|
//! - Add this in the Cargo.toml file:
|
||||||
//! ``` [[bin]]
|
//! ``` [[bin]]
|
||||||
//! name = "example_bin"
|
//! name = "example_bin"
|
||||||
@ -15,7 +17,7 @@ extern crate crossterm;
|
|||||||
use crossterm::style::Color;
|
use crossterm::style::Color;
|
||||||
use crossterm::Crossterm;
|
use crossterm::Crossterm;
|
||||||
|
|
||||||
mod terminal;
|
// mod terminal;
|
||||||
// mod color;
|
// mod color;
|
||||||
// mod cursor;
|
// mod cursor;
|
||||||
// mod crossterm_type;
|
// mod crossterm_type;
|
||||||
@ -26,5 +28,19 @@ use crossterm::Crossterm;
|
|||||||
use std::{thread, time};
|
use std::{thread, time};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
use crossterm::Crossterm;
|
do_something();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn do_something()
|
||||||
|
{
|
||||||
|
let mut crossterm = Crossterm::new();
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut cursor = crossterm.cursor(); // <- Immutable borrow occurs here ( cursor(&self) ) end lives until the end of this function call.
|
||||||
|
cursor.goto(10, 10);
|
||||||
|
}
|
||||||
|
crossterm.to_alternate_screen(); // <- mutable borrow occurs here ( to_alternate_screen(&mut self) ) but because we already have borrowed immutable we can not mutate it.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,20 +1,18 @@
|
|||||||
extern crate crossterm;
|
extern crate crossterm;
|
||||||
|
|
||||||
use crossterm::style::Color;
|
use crossterm::style::Color;
|
||||||
use crossterm::cursor::cursor;
|
|
||||||
use crossterm::screen::AlternateScreen;
|
|
||||||
use crossterm::terminal::{self, ClearType};
|
use crossterm::terminal::{self, ClearType};
|
||||||
use crossterm::Context;
|
use crossterm::Crossterm;
|
||||||
|
|
||||||
use std::io::{stdout, Write};
|
use std::io::{stdout, Write};
|
||||||
use std::rc::Rc;
|
|
||||||
use std::{thread, time};
|
use std::{thread, time};
|
||||||
|
|
||||||
fn print_wait_screen(context: Rc<Context>) {
|
fn print_wait_screen(crossterm: &mut Crossterm) {
|
||||||
let mut terminal = terminal::terminal(&context);
|
let mut terminal = crossterm.terminal();
|
||||||
|
let mut cursor = crossterm.cursor();
|
||||||
|
|
||||||
terminal.clear(ClearType::All);
|
terminal.clear(ClearType::All);
|
||||||
|
|
||||||
let mut cursor = cursor(&context);
|
|
||||||
cursor.goto(0, 0);
|
cursor.goto(0, 0);
|
||||||
cursor.hide();
|
cursor.hide();
|
||||||
|
|
||||||
@ -29,7 +27,7 @@ fn print_wait_screen(context: Rc<Context>) {
|
|||||||
// print the current counter at the line of `Seconds to Go: {counter}`
|
// print the current counter at the line of `Seconds to Go: {counter}`
|
||||||
cursor
|
cursor
|
||||||
.goto(10, 2)
|
.goto(10, 2)
|
||||||
.print(terminal.paint(format!("{} of the 5 items processed", i)).with(Color::Red).on(Color::Blue));
|
.print(crossterm.paint(format!("{} of the 5 items processed", i)).with(Color::Red).on(Color::Blue));
|
||||||
|
|
||||||
// 1 second delay
|
// 1 second delay
|
||||||
thread::sleep(time::Duration::from_secs(1));
|
thread::sleep(time::Duration::from_secs(1));
|
||||||
@ -39,43 +37,37 @@ fn print_wait_screen(context: Rc<Context>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// print wait screen on alternate screen, then swich back.
|
/// print wait screen on alternate screen, then swich back.
|
||||||
pub fn print_wait_screen_on_alternate_window(context: Rc<Context>) {
|
pub fn print_wait_screen_on_alternate_window() {
|
||||||
// create scope. If this scope ends the screen will be switched back to mainscreen.
|
|
||||||
// because `AlternateScreen` switches back to main screen when switching back.
|
|
||||||
{
|
|
||||||
// create new alternate screen instance and switch to the alternate screen.
|
|
||||||
let mut screen = AlternateScreen::from(context.clone());
|
|
||||||
|
|
||||||
write!(screen, "test");
|
let mut term = Crossterm::new();
|
||||||
println!();
|
term.to_alternate_screen();
|
||||||
// Print the wait screen.
|
|
||||||
print_wait_screen(context.clone());
|
term.write(b"test");
|
||||||
}
|
print_wait_screen(&mut term);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// some stress test switch from and to alternate screen.
|
/// some stress test switch from and to alternate screen.
|
||||||
pub fn switch_between_main_and_alternate_screen() {
|
pub fn switch_between_main_and_alternate_screen() {
|
||||||
let context = Context::new();
|
|
||||||
let mut cursor = cursor(&context);
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
let mut term = Crossterm::new();
|
||||||
|
let mut cursor = term.cursor();
|
||||||
|
|
||||||
// create new alternate screen instance and switch to the alternate screen.
|
// create new alternate screen instance and switch to the alternate screen.
|
||||||
let mut screen = AlternateScreen::from(context.clone());
|
let alternate = term.to_alternate_screen();
|
||||||
cursor.goto(0, 0);
|
|
||||||
write!(screen, "we are at the alternate screen!");
|
{ cursor.goto(0, 0); }
|
||||||
screen.flush();
|
write!(term, "we are at the alternate screen!");
|
||||||
thread::sleep(time::Duration::from_secs(3));
|
thread::sleep(time::Duration::from_secs(3));
|
||||||
|
|
||||||
screen.to_main();
|
term.to_main_screen();
|
||||||
write!(screen, "we are at the main screen!");
|
write!(term, "we are at the alternate screen!");
|
||||||
screen.flush();
|
|
||||||
thread::sleep(time::Duration::from_secs(3));
|
thread::sleep(time::Duration::from_secs(3));
|
||||||
|
|
||||||
screen.to_alternate();
|
term.to_alternate_screen();
|
||||||
write!(screen, "we are at the alternate screen!");
|
write!(term, "we are at the alternate screen!");
|
||||||
screen.flush();
|
|
||||||
thread::sleep(time::Duration::from_secs(3));
|
thread::sleep(time::Duration::from_secs(3));
|
||||||
}
|
} // <- Crossterm goes out of scope.
|
||||||
|
|
||||||
println!("Whe are back at the main screen");
|
println!("Whe are back at the main screen");
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,19 @@
|
|||||||
extern crate crossterm;
|
extern crate crossterm;
|
||||||
|
|
||||||
use crossterm::cursor::cursor;
|
use crossterm::Crossterm;
|
||||||
use crossterm::screen::AlternateScreen;
|
|
||||||
use crossterm::terminal::{self, ClearType};
|
use crossterm::terminal::{self, ClearType};
|
||||||
use crossterm::Context;
|
|
||||||
|
|
||||||
use std::io::{stdout, Write};
|
use std::io::{stdout, Write};
|
||||||
use std::rc::Rc;
|
|
||||||
use std::{thread, time};
|
use std::{thread, time};
|
||||||
|
|
||||||
use crossterm::raw::IntoRawMode;
|
|
||||||
|
|
||||||
// raw screen is not working correctly currently
|
// raw screen is not working correctly currently
|
||||||
fn print_wait_screen(context: Rc<Context>) {
|
fn print_wait_screen(crossterm: &mut Crossterm) {
|
||||||
terminal::terminal(&context).clear(ClearType::All);
|
let terminal = crossterm.terminal();
|
||||||
|
let mut cursor = crossterm.cursor();
|
||||||
|
|
||||||
|
terminal.clear(ClearType::All);
|
||||||
|
|
||||||
let mut cursor = cursor(&context);
|
|
||||||
cursor.goto(0, 0).print("Welcome to the wait screen.");
|
cursor.goto(0, 0).print("Welcome to the wait screen.");
|
||||||
cursor
|
cursor
|
||||||
.goto(0, 1)
|
.goto(0, 1)
|
||||||
@ -35,7 +33,7 @@ fn print_wait_screen(context: Rc<Context>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn print_wait_screen_on_alternate_window() {
|
pub fn print_wait_screen_on_alternate_window() {
|
||||||
let context = Context::new();
|
let mut term = Crossterm::new();
|
||||||
|
|
||||||
// create scope. If this scope ends the screen will be switched back to mainscreen.
|
// create scope. If this scope ends the screen will be switched back to mainscreen.
|
||||||
// because `AlternateScreen` switches back to main screen when going out of scope.
|
// because `AlternateScreen` switches back to main screen when going out of scope.
|
||||||
@ -43,13 +41,13 @@ pub fn print_wait_screen_on_alternate_window() {
|
|||||||
// create new alternate screen instance this call is also switching the screen to alternate screen.
|
// create new alternate screen instance this call is also switching the screen to alternate screen.
|
||||||
// then convert the output of the program to raw mode.
|
// then convert the output of the program to raw mode.
|
||||||
// then print the wait screen on the alternate screen in raw mode.
|
// then print the wait screen on the alternate screen in raw mode.
|
||||||
let mut screen = AlternateScreen::from(context.clone());
|
term.to_alternate_screen();
|
||||||
let raw_screen = screen.into_raw_mode(context.clone());
|
term.enable_raw_mode();
|
||||||
|
|
||||||
// Print the wait screen.
|
// Print the wait screen.
|
||||||
print_wait_screen(context.clone());
|
print_wait_screen(&mut term);
|
||||||
|
|
||||||
screen.flush();
|
term.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("Whe are back at the main screen");
|
println!("Whe are back at the main screen");
|
||||||
|
@ -4,9 +4,8 @@
|
|||||||
|
|
||||||
extern crate crossterm;
|
extern crate crossterm;
|
||||||
|
|
||||||
use crossterm::cursor;
|
use crossterm::terminal::ClearType;
|
||||||
use crossterm::terminal::{terminal, ClearType};
|
use crossterm::Crossterm;
|
||||||
use crossterm::Context;
|
|
||||||
|
|
||||||
fn print_test_data() {
|
fn print_test_data() {
|
||||||
for i in 0..100 {
|
for i in 0..100 {
|
||||||
@ -16,10 +15,8 @@ fn print_test_data() {
|
|||||||
|
|
||||||
/// Clear all lines in terminal | demonstration
|
/// Clear all lines in terminal | demonstration
|
||||||
pub fn clear_all_lines() {
|
pub fn clear_all_lines() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
// Get terminal
|
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
|
|
||||||
print_test_data();
|
print_test_data();
|
||||||
|
|
||||||
@ -29,15 +26,13 @@ pub fn clear_all_lines() {
|
|||||||
|
|
||||||
/// Clear all lines from cursor position X:4, Y:4 down | demonstration
|
/// Clear all lines from cursor position X:4, Y:4 down | demonstration
|
||||||
pub fn clear_from_cursor_down() {
|
pub fn clear_from_cursor_down() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
// Get terminal
|
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
|
|
||||||
print_test_data();
|
print_test_data();
|
||||||
|
|
||||||
// Set terminal cursor position (see example for more info).
|
// Set terminal cursor position (see example for more info).
|
||||||
cursor::cursor(&context).goto(4, 8);
|
term.cursor().goto(4, 8);
|
||||||
|
|
||||||
// Clear all cells from current cursor position down.
|
// Clear all cells from current cursor position down.
|
||||||
terminal.clear(ClearType::FromCursorDown);
|
terminal.clear(ClearType::FromCursorDown);
|
||||||
@ -45,15 +40,13 @@ pub fn clear_from_cursor_down() {
|
|||||||
|
|
||||||
/// Clear all lines from cursor position X:4, Y:4 up | demonstration
|
/// Clear all lines from cursor position X:4, Y:4 up | demonstration
|
||||||
pub fn clear_from_cursor_up() {
|
pub fn clear_from_cursor_up() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
// Get terminal
|
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
|
|
||||||
print_test_data();
|
print_test_data();
|
||||||
|
|
||||||
// Set terminal cursor position (see example for more info).
|
// Set terminal cursor position (see example for more info).
|
||||||
cursor::cursor(&context).goto(4, 4);
|
term.cursor().goto(4, 4);
|
||||||
|
|
||||||
// Clear all cells from current cursor position down.
|
// Clear all cells from current cursor position down.
|
||||||
terminal.clear(ClearType::FromCursorUp);
|
terminal.clear(ClearType::FromCursorUp);
|
||||||
@ -61,15 +54,13 @@ pub fn clear_from_cursor_up() {
|
|||||||
|
|
||||||
/// Clear all lines from cursor position X:4, Y:4 up | demonstration
|
/// Clear all lines from cursor position X:4, Y:4 up | demonstration
|
||||||
pub fn clear_current_line() {
|
pub fn clear_current_line() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
// Get terminal
|
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
|
|
||||||
print_test_data();
|
print_test_data();
|
||||||
|
|
||||||
// Set terminal cursor position (see example for more info).
|
// Set terminal cursor position (see example for more info).
|
||||||
cursor::cursor(&context).goto(4, 4);
|
term.cursor().goto(4, 4);
|
||||||
|
|
||||||
// Clear current line cells.
|
// Clear current line cells.
|
||||||
terminal.clear(ClearType::CurrentLine);
|
terminal.clear(ClearType::CurrentLine);
|
||||||
@ -77,15 +68,13 @@ pub fn clear_current_line() {
|
|||||||
|
|
||||||
/// Clear all lines from cursor position X:4, Y:7 up | demonstration
|
/// Clear all lines from cursor position X:4, Y:7 up | demonstration
|
||||||
pub fn clear_until_new_line() {
|
pub fn clear_until_new_line() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
// Get terminal
|
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
|
|
||||||
print_test_data();
|
print_test_data();
|
||||||
|
|
||||||
// Set terminal cursor position (see example for more info).
|
// Set terminal cursor position (see example for more info).
|
||||||
cursor::cursor(&context).goto(4, 20);
|
term.cursor().goto(4, 20);
|
||||||
|
|
||||||
// Clear all the cells until next line.
|
// Clear all the cells until next line.
|
||||||
terminal.clear(ClearType::UntilNewLine);
|
terminal.clear(ClearType::UntilNewLine);
|
||||||
@ -93,57 +82,50 @@ pub fn clear_until_new_line() {
|
|||||||
|
|
||||||
/// Print the the current terminal size | demonstration.
|
/// Print the the current terminal size | demonstration.
|
||||||
pub fn print_terminal_size() {
|
pub fn print_terminal_size() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
|
|
||||||
// Get terminal
|
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
// Get terminal size
|
// Get terminal size
|
||||||
let terminal_size = terminal.terminal_size();
|
let (width, height) = terminal.terminal_size();
|
||||||
|
|
||||||
// Print results
|
// Print results
|
||||||
print!("X: {}, y: {}", terminal_size.0, terminal_size.1);
|
print!("X: {}, y: {}", width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the terminal size to width 10, height: 10 | demonstration.
|
/// Set the terminal size to width 10, height: 10 | demonstration.
|
||||||
pub fn set_terminal_size() {
|
pub fn set_terminal_size() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
|
|
||||||
terminal.set_size(10, 10);
|
terminal.set_size(10, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Scroll down 10 lines | demonstration.
|
/// Scroll down 10 lines | demonstration.
|
||||||
pub fn scroll_down() {
|
pub fn scroll_down() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
|
|
||||||
print_test_data();
|
print_test_data();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Get terminal
|
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
// Scroll down 10 lines.
|
// Scroll down 10 lines.
|
||||||
terminal.scroll_down(10);
|
terminal.scroll_down(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Scroll down 10 lines | demonstration.
|
/// Scroll down 10 lines | demonstration.
|
||||||
pub fn scroll_up() {
|
pub fn scroll_up() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
|
|
||||||
print_test_data();
|
print_test_data();
|
||||||
|
|
||||||
// Get terminal
|
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
// Scroll up 10 lines.
|
// Scroll up 10 lines.
|
||||||
terminal.scroll_up(5);
|
terminal.scroll_up(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Resize the terminal to X: 10, Y: 10 | demonstration.
|
/// Resize the terminal to X: 10, Y: 10 | demonstration.
|
||||||
pub fn resize_terminal() {
|
pub fn resize_terminal() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
// Get terminal
|
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
|
|
||||||
// Get terminal size
|
// Get terminal size
|
||||||
terminal.set_size(10, 10);
|
terminal.set_size(10, 10);
|
||||||
@ -151,10 +133,7 @@ pub fn resize_terminal() {
|
|||||||
|
|
||||||
/// exit the current proccess.
|
/// exit the current proccess.
|
||||||
pub fn exit() {
|
pub fn exit() {
|
||||||
let context = Context::new();
|
let term = Crossterm::new();
|
||||||
|
let mut terminal = term.terminal();
|
||||||
// Get terminal
|
|
||||||
let mut terminal = terminal(&context);
|
|
||||||
// Get terminal size
|
|
||||||
terminal.exit();
|
terminal.exit();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user