diff options
author | Charlie Groves | 2022-08-29 00:48:49 +0000 |
---|---|---|
committer | GitHub | 2022-08-29 00:48:49 +0000 |
commit | f38ede8631b083c1c74d31b7658ad162d31c3972 (patch) | |
tree | 58e93b5bf7a330b9d60a2c1c5a52d67fcd32971f /helix-term/src/ui | |
parent | 51b62230da81913564692482d8f365e27d6f6cec (diff) |
Add bracketed paste (#3233)
Diffstat (limited to 'helix-term/src/ui')
-rw-r--r-- | helix-term/src/ui/completion.rs | 2 | ||||
-rw-r--r-- | helix-term/src/ui/editor.rs | 23 | ||||
-rw-r--r-- | helix-term/src/ui/menu.rs | 4 | ||||
-rw-r--r-- | helix-term/src/ui/overlay.rs | 2 | ||||
-rw-r--r-- | helix-term/src/ui/picker.rs | 20 | ||||
-rw-r--r-- | helix-term/src/ui/popup.rs | 4 | ||||
-rw-r--r-- | helix-term/src/ui/prompt.rs | 8 |
7 files changed, 45 insertions, 18 deletions
diff --git a/helix-term/src/ui/completion.rs b/helix-term/src/ui/completion.rs index 6a743632..87913a8c 100644 --- a/helix-term/src/ui/completion.rs +++ b/helix-term/src/ui/completion.rs @@ -298,7 +298,7 @@ impl Completion { } impl Component for Completion { - fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult { + fn handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult { // let the Editor handle Esc instead if let Event::Key(KeyEvent { code: KeyCode::Esc, .. diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 60cab905..7326b70d 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -936,7 +936,7 @@ impl EditorView { impl EditorView { fn handle_mouse_event( &mut self, - event: MouseEvent, + event: &MouseEvent, cxt: &mut commands::Context, ) -> EventResult { let config = cxt.editor.config(); @@ -946,7 +946,7 @@ impl EditorView { column, modifiers, .. - } = event; + } = *event; let pos_and_view = |editor: &Editor, row, column| { editor.tree.views().find_map(|(view, _focus)| { @@ -1115,7 +1115,7 @@ impl EditorView { impl Component for EditorView { fn handle_event( &mut self, - event: Event, + event: &Event, context: &mut crate::compositor::Context, ) -> EventResult { let mut cx = commands::Context { @@ -1128,6 +1128,23 @@ impl Component for EditorView { }; match event { + Event::Paste(contents) => { + cx.count = cx.editor.count; + commands::paste_bracketed_value(&mut cx, contents.clone()); + cx.editor.count = None; + + let config = cx.editor.config(); + let (view, doc) = current!(cx.editor); + view.ensure_cursor_in_view(doc, config.scrolloff); + + // Store a history state if not in insert mode. Otherwise wait till we exit insert + // to include any edits to the paste in the history state. + if doc.mode() != Mode::Insert { + doc.append_changes_to_history(view.id); + } + + EventResult::Consumed(None) + } Event::Resize(_width, _height) => { // Ignore this event, we handle resizing just before rendering to screen. // Handling it here but not re-rendering will cause flashing diff --git a/helix-term/src/ui/menu.rs b/helix-term/src/ui/menu.rs index ce51ecbc..1d247b1a 100644 --- a/helix-term/src/ui/menu.rs +++ b/helix-term/src/ui/menu.rs @@ -225,9 +225,9 @@ impl<T: Item> Menu<T> { use super::PromptEvent as MenuEvent; impl<T: Item + 'static> Component for Menu<T> { - fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult { + fn handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult { let event = match event { - Event::Key(event) => event, + Event::Key(event) => *event, _ => return EventResult::Ignored(None), }; diff --git a/helix-term/src/ui/overlay.rs b/helix-term/src/ui/overlay.rs index 1cd60be5..0b8a93ae 100644 --- a/helix-term/src/ui/overlay.rs +++ b/helix-term/src/ui/overlay.rs @@ -61,7 +61,7 @@ impl<T: Component + 'static> Component for Overlay<T> { Some((width, height)) } - fn handle_event(&mut self, event: Event, ctx: &mut Context) -> EventResult { + fn handle_event(&mut self, event: &Event, ctx: &mut Context) -> EventResult { self.content.handle_event(event, ctx) } diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs index 169aeadd..2878fc90 100644 --- a/helix-term/src/ui/picker.rs +++ b/helix-term/src/ui/picker.rs @@ -260,7 +260,7 @@ impl<T: Item + 'static> Component for FilePicker<T> { } } - fn handle_event(&mut self, event: Event, ctx: &mut Context) -> EventResult { + fn handle_event(&mut self, event: &Event, ctx: &mut Context) -> EventResult { // TODO: keybinds for scrolling preview self.picker.handle_event(event, ctx) } @@ -476,6 +476,14 @@ impl<T: Item> Picker<T> { pub fn toggle_preview(&mut self) { self.show_preview = !self.show_preview; } + + fn prompt_handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult { + if let EventResult::Consumed(_) = self.prompt.handle_event(event, cx) { + // TODO: recalculate only if pattern changed + self.score(); + } + EventResult::Consumed(None) + } } // process: @@ -489,9 +497,10 @@ impl<T: Item + 'static> Component for Picker<T> { Some(viewport) } - fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult { + fn handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult { let key_event = match event { - Event::Key(event) => event, + Event::Key(event) => *event, + Event::Paste(..) => return self.prompt_handle_event(event, cx), Event::Resize(..) => return EventResult::Consumed(None), _ => return EventResult::Ignored(None), }; @@ -548,10 +557,7 @@ impl<T: Item + 'static> Component for Picker<T> { self.toggle_preview(); } _ => { - if let EventResult::Consumed(_) = self.prompt.handle_event(event, cx) { - // TODO: recalculate only if pattern changed - self.score(); - } + self.prompt_handle_event(event, cx); } } diff --git a/helix-term/src/ui/popup.rs b/helix-term/src/ui/popup.rs index af8e53c5..3c140da4 100644 --- a/helix-term/src/ui/popup.rs +++ b/helix-term/src/ui/popup.rs @@ -138,9 +138,9 @@ impl<T: Component> Popup<T> { } impl<T: Component> Component for Popup<T> { - fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult { + fn handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult { let key = match event { - Event::Key(event) => event, + Event::Key(event) => *event, Event::Resize(_, _) => { // TODO: calculate inner area, call component's handle_event with that area return EventResult::Ignored(None); diff --git a/helix-term/src/ui/prompt.rs b/helix-term/src/ui/prompt.rs index 4cb38fb0..5e8cd1f5 100644 --- a/helix-term/src/ui/prompt.rs +++ b/helix-term/src/ui/prompt.rs @@ -466,9 +466,13 @@ impl Prompt { } impl Component for Prompt { - fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult { + fn handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult { let event = match event { - Event::Key(event) => event, + Event::Paste(data) => { + self.insert_str(data); + return EventResult::Consumed(None); + } + Event::Key(event) => *event, Event::Resize(..) => return EventResult::Consumed(None), _ => return EventResult::Ignored(None), }; |