Struct ascii_forge::window::Window

source ·
pub struct Window { /* private fields */ }
Expand description

The main window behind the application. Represents the terminal window, allowing it to be used similar to a buffer, but has extra event handling.

use ascii_forge::prelude::*;

let mut window = Window::init()?;

render!(
    window,
    [
        (10, 10) => "Element Here!"
    ]
)

Implementations§

source§

impl Window

source

pub fn new(io: Stdout) -> Result<Self>

Creates a new window from the given stdout. Please prefer to use init as it will do all of the terminal init stuff.

source

pub fn init() -> Result<Self>

Initializes the window, and returns a new Window for your use.

source

pub fn buffer(&self) -> &Buffer

Returns the active Buffer, as a reference.

source

pub fn buffer_mut(&mut self) -> &mut Buffer

Returns the active Buffer, as a mutable reference.

source

pub fn swap_buffers(&mut self)

Swaps the buffers, clearing the old buffer. Used automatically by the window’s update method.

source

pub fn size(&self) -> Vec2

Returns the current known size of the buffer’s window.

Examples found in repository?
examples/simple.rs (line 30)
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
    fn run(&mut self, window: &mut Window) -> Result<SceneResult, Box<dyn Error>> {
        // Set up a scene
        let mut ui_buffer = Buffer::new((6, 3));

        let chars = ['┌', '─', '┐', '│', ' ', '│', '└', '─', '┘'];
        let nine_slice = ui::NineSlice::new(chars, (6, 3));

        // Render Some elements to the buffer.
        render!(ui_buffer, [
            vec2(0, 0) => nine_slice,
            vec2(1, 1) => "QUIT".green()
        ]);

        // Loop the current scene.
        loop {
            window.update()?;

            // Renders some elements to the window.
            render!(window, [
                vec2(0, 0) => format!("{:?}", cursor::position()?),
                vec2(window.size().x / 2, window.size().y / 4) => ui_buffer,
            ]);

            // If the `q` key was pressed, quit the application by returning no scene.
            if window.code(KeyCode::Char('q')) {
                return Ok(None);
            }

            // If the buffer was clicked on, quit.
            if window.mouse(MouseEventKind::Down(MouseButton::Left))?
                && window.hover(
                    vec2(window.size().x / 2, window.size().y / 4),
                    ui_buffer.size(),
                )?
            {
                return Ok(None);
            }
        }
    }
source

pub fn restore(self) -> Result<()>

Restores the window to it’s previous state from before the window’s init method.

source

pub fn render(&mut self) -> Result<()>

Renders the window to the screen. should really only be used by the update method, but if you need a custom system, you can use this.

source

pub fn update(&mut self) -> Result<()>

Handles events, and renders the screen.

Examples found in repository?
examples/simple.rs (line 25)
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
    fn run(&mut self, window: &mut Window) -> Result<SceneResult, Box<dyn Error>> {
        // Set up a scene
        let mut ui_buffer = Buffer::new((6, 3));

        let chars = ['┌', '─', '┐', '│', ' ', '│', '└', '─', '┘'];
        let nine_slice = ui::NineSlice::new(chars, (6, 3));

        // Render Some elements to the buffer.
        render!(ui_buffer, [
            vec2(0, 0) => nine_slice,
            vec2(1, 1) => "QUIT".green()
        ]);

        // Loop the current scene.
        loop {
            window.update()?;

            // Renders some elements to the window.
            render!(window, [
                vec2(0, 0) => format!("{:?}", cursor::position()?),
                vec2(window.size().x / 2, window.size().y / 4) => ui_buffer,
            ]);

            // If the `q` key was pressed, quit the application by returning no scene.
            if window.code(KeyCode::Char('q')) {
                return Ok(None);
            }

            // If the buffer was clicked on, quit.
            if window.mouse(MouseEventKind::Down(MouseButton::Left))?
                && window.hover(
                    vec2(window.size().x / 2, window.size().y / 4),
                    ui_buffer.size(),
                )?
            {
                return Ok(None);
            }
        }
    }
source

pub fn handle_event(&mut self) -> Result<()>

Handles events. Used automatically by the update method, so no need to use it unless update is being used.

source

pub fn mouse_pos(&self) -> Vec2

source

pub fn event(&self) -> &Option<Event>

Returns the current event for the frame, as a reference.

source

pub fn mouse(&self, event: MouseEventKind) -> Result<bool>

Returns true if the window had an event with the given mouse input

Examples found in repository?
examples/simple.rs (line 39)
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
    fn run(&mut self, window: &mut Window) -> Result<SceneResult, Box<dyn Error>> {
        // Set up a scene
        let mut ui_buffer = Buffer::new((6, 3));

        let chars = ['┌', '─', '┐', '│', ' ', '│', '└', '─', '┘'];
        let nine_slice = ui::NineSlice::new(chars, (6, 3));

        // Render Some elements to the buffer.
        render!(ui_buffer, [
            vec2(0, 0) => nine_slice,
            vec2(1, 1) => "QUIT".green()
        ]);

        // Loop the current scene.
        loop {
            window.update()?;

            // Renders some elements to the window.
            render!(window, [
                vec2(0, 0) => format!("{:?}", cursor::position()?),
                vec2(window.size().x / 2, window.size().y / 4) => ui_buffer,
            ]);

            // If the `q` key was pressed, quit the application by returning no scene.
            if window.code(KeyCode::Char('q')) {
                return Ok(None);
            }

            // If the buffer was clicked on, quit.
            if window.mouse(MouseEventKind::Down(MouseButton::Left))?
                && window.hover(
                    vec2(window.size().x / 2, window.size().y / 4),
                    ui_buffer.size(),
                )?
            {
                return Ok(None);
            }
        }
    }
source

pub fn hover<I: Into<Vec2>>(&self, loc: I, size: I) -> Result<bool>

Returns true if the mouse cursor is hovering the given rect.

Examples found in repository?
examples/simple.rs (lines 40-43)
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
    fn run(&mut self, window: &mut Window) -> Result<SceneResult, Box<dyn Error>> {
        // Set up a scene
        let mut ui_buffer = Buffer::new((6, 3));

        let chars = ['┌', '─', '┐', '│', ' ', '│', '└', '─', '┘'];
        let nine_slice = ui::NineSlice::new(chars, (6, 3));

        // Render Some elements to the buffer.
        render!(ui_buffer, [
            vec2(0, 0) => nine_slice,
            vec2(1, 1) => "QUIT".green()
        ]);

        // Loop the current scene.
        loop {
            window.update()?;

            // Renders some elements to the window.
            render!(window, [
                vec2(0, 0) => format!("{:?}", cursor::position()?),
                vec2(window.size().x / 2, window.size().y / 4) => ui_buffer,
            ]);

            // If the `q` key was pressed, quit the application by returning no scene.
            if window.code(KeyCode::Char('q')) {
                return Ok(None);
            }

            // If the buffer was clicked on, quit.
            if window.mouse(MouseEventKind::Down(MouseButton::Left))?
                && window.hover(
                    vec2(window.size().x / 2, window.size().y / 4),
                    ui_buffer.size(),
                )?
            {
                return Ok(None);
            }
        }
    }
source

pub fn key(&self, key: KeyEvent) -> bool

Returns true if the given key event is pressed.

source

pub fn code(&self, code: KeyCode) -> bool

Returns true if the given key code is pressed.

Examples found in repository?
examples/simple.rs (line 34)
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
    fn run(&mut self, window: &mut Window) -> Result<SceneResult, Box<dyn Error>> {
        // Set up a scene
        let mut ui_buffer = Buffer::new((6, 3));

        let chars = ['┌', '─', '┐', '│', ' ', '│', '└', '─', '┘'];
        let nine_slice = ui::NineSlice::new(chars, (6, 3));

        // Render Some elements to the buffer.
        render!(ui_buffer, [
            vec2(0, 0) => nine_slice,
            vec2(1, 1) => "QUIT".green()
        ]);

        // Loop the current scene.
        loop {
            window.update()?;

            // Renders some elements to the window.
            render!(window, [
                vec2(0, 0) => format!("{:?}", cursor::position()?),
                vec2(window.size().x / 2, window.size().y / 4) => ui_buffer,
            ]);

            // If the `q` key was pressed, quit the application by returning no scene.
            if window.code(KeyCode::Char('q')) {
                return Ok(None);
            }

            // If the buffer was clicked on, quit.
            if window.mouse(MouseEventKind::Down(MouseButton::Left))?
                && window.hover(
                    vec2(window.size().x / 2, window.size().y / 4),
                    ui_buffer.size(),
                )?
            {
                return Ok(None);
            }
        }
    }
source

pub fn io(&mut self) -> &mut Stdout

Trait Implementations§

source§

impl AsMut<Buffer> for Window

source§

fn as_mut(&mut self) -> &mut Buffer

Converts this type into a mutable reference of the (usually inferred) input type.
source§

impl Default for Window

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.