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:
parent
64a7e7f518
commit
36c5831b9b
2 changed files with 40 additions and 103 deletions
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue