diff options
Diffstat (limited to 'helix-term/src')
-rw-r--r-- | helix-term/src/compositor.rs | 22 | ||||
-rw-r--r-- | helix-term/src/ui/editor.rs | 8 | ||||
-rw-r--r-- | helix-term/src/ui/picker.rs | 5 | ||||
-rw-r--r-- | helix-term/src/ui/popup.rs | 2 | ||||
-rw-r--r-- | helix-term/src/ui/prompt.rs | 14 |
5 files changed, 27 insertions, 24 deletions
diff --git a/helix-term/src/compositor.rs b/helix-term/src/compositor.rs index 99f9bb0e..6b39bb62 100644 --- a/helix-term/src/compositor.rs +++ b/helix-term/src/compositor.rs @@ -4,7 +4,7 @@ use crossterm::event::Event; use helix_core::Position; -use tui::{buffer::Buffer as Surface, layout::Rect}; +use tui::{buffer::Buffer as Surface, layout::Rect, terminal::CursorKind}; pub type Callback = Box<dyn FnOnce(&mut Compositor)>; @@ -47,8 +47,9 @@ pub trait Component: Any + AnyComponent { /// Render the component onto the provided surface. fn render(&self, area: Rect, frame: &mut Surface, ctx: &mut Context); - fn cursor_position(&self, area: Rect, ctx: &Editor) -> Option<Position> { - None + /// Get cursor position and cursor kind. + fn cursor(&self, area: Rect, ctx: &Editor) -> (Option<Position>, CursorKind) { + (None, CursorKind::Hidden) } /// May be used by the parent component to compute the child area. @@ -137,20 +138,19 @@ impl Compositor { layer.render(area, surface, cx) } - let pos = self - .cursor_position(area, cx.editor) - .map(|pos| (pos.col as u16, pos.row as u16)); + let (pos, kind) = self.cursor(area, cx.editor); + let pos = pos.map(|pos| (pos.col as u16, pos.row as u16)); - self.terminal.draw(pos); + self.terminal.draw(pos, kind); } - pub fn cursor_position(&self, area: Rect, editor: &Editor) -> Option<Position> { + pub fn cursor(&self, area: Rect, editor: &Editor) -> (Option<Position>, CursorKind) { for layer in self.layers.iter().rev() { - if let Some(pos) = layer.cursor_position(area, editor) { - return Some(pos); + if let (Some(pos), kind) = layer.cursor(area, editor) { + return (Some(pos), kind); } } - None + (None, CursorKind::Hidden) } pub fn find(&mut self, type_name: &str) -> Option<&mut dyn Component> { diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 5913df29..95587b4c 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -26,6 +26,7 @@ use tui::{ buffer::Buffer as Surface, layout::Rect, style::{Color, Modifier, Style}, + terminal::CursorKind, }; pub struct EditorView { @@ -739,15 +740,12 @@ impl Component for EditorView { } } - fn cursor_position(&self, area: Rect, editor: &Editor) -> Option<Position> { + fn cursor(&self, area: Rect, editor: &Editor) -> (Option<Position>, CursorKind) { // match view.doc.mode() { // Mode::Insert => write!(stdout, "\x1B[6 q"), // mode => write!(stdout, "\x1B[2 q"), // }; - // return editor.cursor_position() - - // It's easier to just not render the cursor and use selection rendering instead. - None + editor.cursor() } } diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs index 20d51d5d..0aec9894 100644 --- a/helix-term/src/ui/picker.rs +++ b/helix-term/src/ui/picker.rs @@ -16,6 +16,7 @@ use crate::ui::{Prompt, PromptEvent}; use helix_core::Position; use helix_view::editor::Action; use helix_view::Editor; +use tui::terminal::CursorKind; pub struct Picker<T> { options: Vec<T>, @@ -304,7 +305,7 @@ impl<T: 'static> Component for Picker<T> { } } - fn cursor_position(&self, area: Rect, editor: &Editor) -> Option<Position> { + fn cursor(&self, area: Rect, editor: &Editor) -> (Option<Position>, CursorKind) { // TODO: this is mostly duplicate code let area = inner_rect(area); let block = Block::default().borders(Borders::ALL); @@ -314,6 +315,6 @@ impl<T: 'static> Component for Picker<T> { // prompt area let area = Rect::new(inner.x + 1, inner.y, inner.width - 1, 1); - self.prompt.cursor_position(area, editor) + self.prompt.cursor(area, editor) } } diff --git a/helix-term/src/ui/popup.rs b/helix-term/src/ui/popup.rs index ca349403..8488d1c6 100644 --- a/helix-term/src/ui/popup.rs +++ b/helix-term/src/ui/popup.rs @@ -116,7 +116,7 @@ impl<T: Component> Component for Popup<T> { let position = self .position - .or_else(|| cx.editor.cursor_position()) + .or_else(|| cx.editor.cursor().0) .unwrap_or_default(); let (width, height) = self.size; diff --git a/helix-term/src/ui/prompt.rs b/helix-term/src/ui/prompt.rs index c388c315..7b8af820 100644 --- a/helix-term/src/ui/prompt.rs +++ b/helix-term/src/ui/prompt.rs @@ -4,6 +4,7 @@ use crossterm::event::{Event, KeyCode, KeyEvent, KeyModifiers}; use helix_core::Position; use helix_view::{Editor, Theme}; use std::{borrow::Cow, ops::RangeFrom}; +use tui::terminal::CursorKind; pub type Completion = (RangeFrom<usize>, Cow<'static, str>); @@ -342,11 +343,14 @@ impl Component for Prompt { self.render_prompt(area, surface, cx) } - fn cursor_position(&self, area: Rect, editor: &Editor) -> Option<Position> { + fn cursor(&self, area: Rect, editor: &Editor) -> (Option<Position>, CursorKind) { let line = area.height as usize - 1; - Some(Position::new( - area.y as usize + line, - area.x as usize + self.prompt.len() + self.cursor, - )) + ( + Some(Position::new( + area.y as usize + line, + area.x as usize + self.prompt.len() + self.cursor, + )), + CursorKind::Block, + ) } } |