Skip to main content

EventHandler

Struct EventHandler 

Source
pub struct EventHandler { /* private fields */ }

Implementations§

Source§

impl EventHandler

Source

pub fn new( input_manager_state: Arc<Mutex<EventManagerState>>, ) -> (Self, Receiver<EventManagerCommand>)

Source

pub fn create_hook(&self) -> EventHook

Examples found in repository?
examples/input_handler.rs (line 52)
14fn main() {
15    init_terminal!();
16    init_logger("./input_handler_test.log").unwrap();
17    let (_input_manager, input_handler, screen_select_h) =
18        CrosstermEventManager::new_with_select_sub(TargetScreen::None);
19    let handle = thread::spawn(move || {
20        macro_rules! try_send {
21            ($message: expr) => {
22                if let Err(e) = screen_select_h.send($message) {
23                    info!("error sending select {:?}", e);
24                    break;
25                } else {
26                };
27            };
28        }
29        loop {
30            if let Ok(sshm) = screen_select_h.recv() {
31                match sshm {
32                    ScreenSelectHMsg::Event(sm) => {
33                        if let SubscriptionMessage::Mouse {
34                            msg,
35                            screen: _screen,
36                        } = sm
37                            && let MouseMessage::Pressed(_) = msg
38                        {
39                            try_send!(Some(TargetScreen::Screen(1)));
40                        } else {
41                            try_send!(None);
42                        };
43                    }
44                    // accept incoming selection requests
45                    ScreenSelectHMsg::Selection(s) => {
46                        try_send!(Some(s));
47                    }
48                }
49            }
50        }
51    });
52    let mut hook = input_handler.create_hook();
53
54    hook.on_key_press(KeyCode::Char('q'), |_| exit(0)).unwrap();
55    hook.on_key_press(KeyCode::Char('n'), |_| eprintln!("n"))
56        .unwrap();
57
58    hook.on_mouse_button_press(MouseButtons::Left, |m| eprintln!("{:?}", m))
59        .unwrap();
60
61    while !hook.is_pressed(InputButton::Mouse(MouseButton::Right)) {}
62    while hook.is_pressed(InputButton::Mouse(MouseButton::Right)) {}
63    handle.join().unwrap();
64    restore_terminal().unwrap();
65}
More examples
Hide additional examples
examples/menu_drawable.rs (line 33)
23fn main() -> Result<(), AppError> {
24    init_terminal!();
25    init_logger("./menu_drawable_example.log")?;
26    let (cols, rows) = size()?;
27    let renderer = Renderer::<DefaultScreenBuffer<CrosstermCellDrawer>, Instant>::create_renderer(
28        (cols, rows),
29    );
30    let (r, ev_handler, _ev_manager) = start_renderer_with_input(renderer);
31    r.set_update_interval(1)?;
32
33    let hook = ev_handler.create_hook();
34
35    let inside_rect1 = RectDrawableBuilder::new()
36        .border_style(BorderStyle::Basic)
37        .fill_style(' ')
38        .rect(Rect::from_coords(0, 0, 3, 3))
39        .build()?;
40    let inside_rect2 = RectDrawableBuilder::new()
41        .border_style(BorderStyle::AllRound(TerminalChar::from_char('~')))
42        .fill_style(' ')
43        .rect(Rect::from_coords(0, 0, 3, 3))
44        .build()?;
45    let inside_circle = CircleDrawableBuilder::new()
46        .border_style(TerminalChar::from_char('O').set_bg(Color::Maroon))
47        .radius(4)
48        .build()?;
49    let border_rect = RectDrawable {
50        rect: Rect::from_coords(0, 0, 0, 0),
51        border_thickness: 1,
52        border_style: BorderStyle::AllRound(TerminalChar::from_char('+').set_fg(Color::Fuchsia)),
53        fill_style: Some(TerminalChar::from_char(' ')),
54        screen_fit: None,
55    };
56
57    let menu_screen = r.create_screen(AreaRect::FullScreen, 0)?;
58
59    let menu_drawable = SelectMenuDrawable::new(
60        vec![inside_rect1, inside_rect2, inside_circle],
61        border_rect,
62        SelectMenuFitting::FitToContents,
63        menu_screen,
64        hook,
65        r.clone(),
66    )?;
67
68    let drawable_id = r.register_drawable(
69        menu_screen,
70        DrawObject {
71            creation_time: std::time::Instant::now(),
72            drawable: Box::new(menu_drawable),
73            layer: 0,
74            lifetime: ObjectLifetime::ExplicitRemove,
75            shaders: Vec::new(),
76        },
77    )?;
78    r.render_drawable(drawable_id)?;
79    let hook = ev_handler.create_hook();
80    loop {
81        if hook.is_pressed(InputButton::Mouse(MouseButton::Right)) {
82            break;
83        }
84    }
85    let _ = restore_terminal();
86    Ok(())
87}
examples/screens.rs (line 124)
113pub fn main() -> Result<(), AppError> {
114    init_terminal!();
115    init_logger("./screens_showcase.log")?;
116
117    let (cols, rows) = size()?;
118    let renderer = Renderer::<DefaultScreenBuffer<CrosstermCellDrawer>, Instant>::create_renderer(
119        (cols, rows),
120    );
121    let (mut r, ev_handler, _ev_manager) = start_renderer_with_input(renderer);
122    r.set_update_interval(1)?;
123
124    let mut hook = ev_handler.create_hook();
125
126    let mut ad_screens = AdjustableScreens::new_uniform_grid(WIDTH, HEIGHT, &mut r)?;
127
128    for screen in &mut ad_screens {
129        let builder = DrawObjectBuilder::default();
130        let d_key = builder
131            .layer(100)
132            .rect_drawable(|r| {
133                r.border_style(
134                ltrender::terminal_buffer::standard_drawables::rect_drawable::BorderStyle::Custom {
135                    top: TerminalChar::from_char('T'),
136                    bottom: TerminalChar::from_char('B'),
137                    left: TerminalChar::from_char('L'),
138                    right: TerminalChar::from_char('R'),
139                },
140            )
141            .border_thickness(1)
142            .fill_style(' ')
143            .rect(Rect::from_coords(0, 0, 2, 2))
144            .screen_fit(ScreenFitType::Full)
145            })?
146            .add_lifetime(ObjectLifetime::ExplicitRemove)
147            .screen(screen)
148            .build_and_register(&mut r)?;
149        info!("manually rendering drawable: {:?}", d_key);
150        r.render_drawable(d_key)?;
151    }
152
153    let (s, recv) = mpsc::channel();
154    let builder = DrawObjectBuilder::default();
155    let text_stream = builder
156        .layer(200)
157        .videostream_drawable(|b| b.position((0, 0)).recv(recv))?
158        .add_lifetime(ObjectLifetime::ExplicitRemove)
159        .screen(0)
160        .build_and_register(&mut r)?;
161    let callback_hook = ev_handler.create_hook();
162    let callback_renderh: RenderHandle<Instant> = r.clone();
163    hook.on_mouse_button_press(MouseButtons::Left, move |_| {
164        if let TargetScreen::Screen(id) = callback_hook.current_selected_screen() {
165            let msg = format!("selected_screen: {}", id);
166            info!("{}", msg);
167            let mut data = Vec::new();
168            for chr in msg.chars() {
169                data.push(Some(TerminalChar::from_char(chr)));
170            }
171            let _ = s.send(StreamFrame {
172                size: (data.len() as u16, 1),
173                data,
174            });
175            let _ = callback_renderh.render_drawable(text_stream);
176        }
177    })?;
178    loop {
179        if hook.is_pressed(InputButton::Key(KeyCode::Char('c'))) {
180            info!("breaking out of the loop");
181            break;
182        }
183
184        let cur_size = size()?;
185        let rendered_size = r.get_terminal_size()?;
186        if cur_size != rendered_size {
187            info!(
188                "redrawing with cur_size: {:?}, rendered: {:?}",
189                cur_size, rendered_size
190            );
191            r.handle_resize(cur_size)?;
192            ad_screens.place_screens_uniformly(&mut r)?;
193        }
194    }
195    restore_terminal()?;
196    info!("returning with ok");
197    Ok(())
198}

Trait Implementations§

Source§

impl Clone for EventHandler

Source§

fn clone(&self) -> EventHandler

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EventHandler

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. 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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

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

Source§

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.