Simplify InputEvent

Now that I've decided the F1 menu should always show all key bindings,
there is no need for the InputEvent to be so complex.
This commit is contained in:
Joscha 2023-04-27 21:44:53 +02:00
parent 64a7e7f518
commit 36c5831b9b
2 changed files with 40 additions and 103 deletions

View file

@ -1,100 +0,0 @@
use crossterm::event::KeyEvent;
use crate::KeyBinding;
enum Mode {
Record,
Key(KeyEvent),
Paste(String),
}
impl Mode {
fn from_crossterm_event(event: crossterm::event::Event) -> Option<Self> {
use crossterm::event::Event::*;
match event {
Key(event) => Some(Self::Key(event)),
Paste(string) => Some(Self::Paste(string)),
_ => None,
}
}
}
pub enum Entry {
Space,
Category(String),
Binding(KeyBinding, String),
}
pub struct InputEvent {
mode: Mode,
entries: Vec<Entry>,
}
impl InputEvent {
pub fn new_recording() -> Self {
Self {
mode: Mode::Record,
entries: vec![],
}
}
pub fn from_crossterm_event(event: crossterm::event::Event) -> Option<Self> {
Some(Self {
mode: Mode::from_crossterm_event(event)?,
entries: vec![],
})
}
fn recording(&self) -> bool {
matches!(self.mode, Mode::Record)
}
pub fn space<S: ToString>(&mut self) {
if self.recording() {
self.entries.push(Entry::Space);
}
}
pub fn category<S: ToString>(&mut self, name: S) {
if self.recording() {
self.entries.push(Entry::Category(name.to_string()));
}
}
pub fn key_event(&self) -> Option<KeyEvent> {
if let Mode::Key(event) = &self.mode {
Some(*event)
} else {
None
}
}
pub fn paste_event(&self) -> Option<&str> {
if let Mode::Paste(string) = &self.mode {
Some(string)
} else {
None
}
}
pub fn matches_key_binding<S: ToString>(
&mut self,
binding: &KeyBinding,
description: S,
) -> bool {
if self.recording() {
self.entries
.push(Entry::Binding(binding.clone(), description.to_string()));
}
if let Some(event) = self.key_event() {
binding.matches(event)
} else {
false
}
}
pub fn entries(&self) -> &[Entry] {
&self.entries
}
}

View file

@ -1,12 +1,49 @@
mod event;
mod keys; mod keys;
pub use cove_macro::KeyGroup; pub use cove_macro::KeyGroup;
use crossterm::event::KeyEvent;
pub use event::*; pub use crate::keys::*;
pub use keys::*;
/// A group of related key bindings. /// A group of related key bindings.
pub trait KeyGroup { pub trait KeyGroup {
fn bindings(&self) -> Vec<(&KeyBinding, &'static str)>; fn bindings(&self) -> Vec<(&KeyBinding, &'static str)>;
} }
#[derive(Debug, Clone)]
pub enum InputEvent {
Key(KeyEvent),
Paste(String),
}
impl InputEvent {
pub fn from_crossterm_event(event: crossterm::event::Event) -> Option<Self> {
use crossterm::event::Event::*;
match event {
Key(event) => Some(Self::Key(event)),
Paste(string) => Some(Self::Paste(string)),
_ => None,
}
}
pub fn key_event(&self) -> Option<KeyEvent> {
match self {
Self::Key(event) => Some(*event),
_ => None,
}
}
pub fn paste_event(&self) -> Option<&str> {
match self {
Self::Paste(string) => Some(string),
_ => None,
}
}
pub fn matches<S: ToString>(&self, binding: &KeyBinding) -> bool {
match self.key_event() {
Some(event) => binding.matches(event),
None => false,
}
}
}