pub struct EventHandler { /* private fields */ }Implementations§
Source§impl EventHandler
impl EventHandler
pub fn new( input_manager_state: Arc<Mutex<EventManagerState>>, ) -> (Self, Receiver<EventManagerCommand>)
Sourcepub fn create_hook(&self) -> EventHook
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
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
impl Clone for EventHandler
Source§fn clone(&self) -> EventHandler
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)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreAuto Trait Implementations§
impl Freeze for EventHandler
impl RefUnwindSafe for EventHandler
impl Send for EventHandler
impl Sync for EventHandler
impl Unpin for EventHandler
impl UnsafeUnpin for EventHandler
impl UnwindSafe for EventHandler
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