feat: mouse selection support (#1209)

* feat: mouse selection support

* refactor: don't import self
This commit is contained in:
YummyOreo 2023-09-11 02:49:06 -05:00 committed by GitHub
parent 6d3b14b123
commit 34654adece
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -4,7 +4,10 @@ use std::{
}; };
use crossterm::{ use crossterm::{
event::{self, Event, KeyCode, KeyEvent, KeyModifiers, MouseEvent}, event::{
self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEvent, KeyModifiers,
MouseEvent,
},
execute, terminal, execute, terminal,
}; };
use eyre::Result; use eyre::Result;
@ -63,13 +66,24 @@ impl State {
Ok(results) Ok(results)
} }
fn handle_input(&mut self, settings: &Settings, input: &Event) -> Option<usize> { fn handle_input<W>(
match input { &mut self,
settings: &Settings,
input: &Event,
w: &mut W,
) -> Result<Option<usize>>
where
W: Write,
{
execute!(w, EnableMouseCapture)?;
let r = match input {
Event::Key(k) => self.handle_key_input(settings, k), Event::Key(k) => self.handle_key_input(settings, k),
Event::Mouse(m) => self.handle_mouse_input(*m), Event::Mouse(m) => self.handle_mouse_input(*m),
Event::Paste(d) => self.handle_paste_input(d), Event::Paste(d) => self.handle_paste_input(d),
_ => None, _ => None,
} };
execute!(w, DisableMouseCapture)?;
Ok(r)
} }
fn handle_mouse_input(&mut self, input: MouseEvent) -> Option<usize> { fn handle_mouse_input(&mut self, input: MouseEvent) -> Option<usize> {
@ -639,7 +653,7 @@ pub async fn history(
event_ready = event_ready => { event_ready = event_ready => {
if event_ready?? { if event_ready?? {
loop { loop {
if let Some(i) = app.handle_input(settings, &event::read()?) { if let Some(i) = app.handle_input(settings, &event::read()?, &mut std::io::stdout())? {
break 'render i; break 'render i;
} }
if !event::poll(Duration::ZERO)? { if !event::poll(Duration::ZERO)? {