Cross platform keybind handling
This commit is contained in:
@@ -1,3 +1,53 @@
|
|||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
mod platform {
|
||||||
|
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
|
||||||
|
|
||||||
|
pub fn is_backspace(event: &KeyEvent) -> bool {
|
||||||
|
matches!(event.code, KeyCode::Backspace)
|
||||||
|
|| matches!(
|
||||||
|
event,
|
||||||
|
KeyEvent {
|
||||||
|
code: KeyCode::Char('h'),
|
||||||
|
modifiers,
|
||||||
|
..
|
||||||
|
} if modifiers.contains(KeyModifiers::CONTROL)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_delete(event: &KeyEvent) -> bool {
|
||||||
|
matches!(event.code, KeyCode::Delete)
|
||||||
|
|| matches!(
|
||||||
|
event,
|
||||||
|
KeyEvent {
|
||||||
|
code: KeyCode::Char('d'),
|
||||||
|
modifiers,
|
||||||
|
..
|
||||||
|
} if modifiers.contains(KeyModifiers::CONTROL)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "macos"))]
|
||||||
|
mod platform {
|
||||||
|
use crossterm::event::{KeyCode, KeyEvent};
|
||||||
|
|
||||||
|
pub fn is_backspace(event: &KeyEvent) -> bool {
|
||||||
|
matches!(event.code, KeyCode::Backspace)
|
||||||
|
|| matches!(
|
||||||
|
event,
|
||||||
|
KeyEvent {
|
||||||
|
code: KeyCode::Char('h'),
|
||||||
|
modifiers,
|
||||||
|
..
|
||||||
|
} if modifiers.contains(KeyModifiers::CONTROL)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_delete(event: &KeyEvent) -> bool {
|
||||||
|
matches!(event.code, KeyCode::Delete)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
use crossterm::event::{Event, KeyCode, KeyEvent, KeyModifiers};
|
use crossterm::event::{Event, KeyCode, KeyEvent, KeyModifiers};
|
||||||
|
|
||||||
use crate::widget::Widget;
|
use crate::widget::Widget;
|
||||||
@@ -35,6 +85,34 @@ impl<'a> Widget for Input<'a> {
|
|||||||
impl InputState {
|
impl InputState {
|
||||||
pub fn handle_event(&mut self, event: &Event) -> bool {
|
pub fn handle_event(&mut self, event: &Event) -> bool {
|
||||||
match event {
|
match event {
|
||||||
|
Event::Key(key) if platform::is_backspace(key) => {
|
||||||
|
if self.cursor > 0 {
|
||||||
|
let prev = self.text[..self.cursor]
|
||||||
|
.char_indices()
|
||||||
|
.last()
|
||||||
|
.map(|(i, _)| i)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
self.text.remove(prev);
|
||||||
|
self.cursor = prev;
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
Event::Key(key) if platform::is_delete(key) => {
|
||||||
|
if self.cursor < self.text.len() {
|
||||||
|
let prev = self.text[..self.cursor + 1]
|
||||||
|
.char_indices()
|
||||||
|
.last()
|
||||||
|
.map(|(i, _)| i)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
self.text.remove(prev);
|
||||||
|
self.cursor = prev;
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
Event::Key(KeyEvent {
|
Event::Key(KeyEvent {
|
||||||
code: KeyCode::Left,
|
code: KeyCode::Left,
|
||||||
..
|
..
|
||||||
@@ -55,76 +133,6 @@ impl InputState {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
Event::Key(KeyEvent {
|
|
||||||
code: KeyCode::Backspace,
|
|
||||||
..
|
|
||||||
}) => {
|
|
||||||
if self.cursor > 0 {
|
|
||||||
let prev = self.text[..self.cursor]
|
|
||||||
.char_indices()
|
|
||||||
.last()
|
|
||||||
.map(|(i, _)| i)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
self.text.remove(prev);
|
|
||||||
self.cursor = prev;
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
Event::Key(KeyEvent {
|
|
||||||
code: KeyCode::Char('h'),
|
|
||||||
modifiers,
|
|
||||||
..
|
|
||||||
}) if modifiers.contains(KeyModifiers::CONTROL) => {
|
|
||||||
if self.cursor > 0 {
|
|
||||||
let prev = self.text[..self.cursor]
|
|
||||||
.char_indices()
|
|
||||||
.last()
|
|
||||||
.map(|(i, _)| i)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
self.text.remove(prev);
|
|
||||||
self.cursor = prev;
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
Event::Key(KeyEvent {
|
|
||||||
code: KeyCode::Delete,
|
|
||||||
..
|
|
||||||
}) => {
|
|
||||||
if self.cursor < self.text.len() {
|
|
||||||
let prev = self.text[..self.cursor + 1]
|
|
||||||
.char_indices()
|
|
||||||
.last()
|
|
||||||
.map(|(i, _)| i)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
self.text.remove(prev);
|
|
||||||
self.cursor = prev;
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
Event::Key(KeyEvent {
|
|
||||||
code: KeyCode::Char('d'),
|
|
||||||
modifiers,
|
|
||||||
..
|
|
||||||
}) if modifiers.contains(KeyModifiers::CONTROL) => {
|
|
||||||
if self.cursor < self.text.len() {
|
|
||||||
let prev = self.text[..self.cursor + 1]
|
|
||||||
.char_indices()
|
|
||||||
.last()
|
|
||||||
.map(|(i, _)| i)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
self.text.remove(prev);
|
|
||||||
self.cursor = prev;
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
Event::Key(KeyEvent {
|
Event::Key(KeyEvent {
|
||||||
code: KeyCode::Char(c),
|
code: KeyCode::Char(c),
|
||||||
modifiers,
|
modifiers,
|
||||||
|
|||||||
Reference in New Issue
Block a user