aboutsummaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
authorIvan Tham2021-06-15 05:03:56 +0000
committerIvan Tham2021-06-15 15:46:21 +0000
commit124514aa7024b0cf40bf01def54d280fcc86897c (patch)
treee4fa3e9566755d40bd322578fd25f7de99b28377 /helix-term
parent6bdf609caaf4eb1c137f503f147d1e4e4f3e8676 (diff)
Add cursor kind to separate hidden cursor from pos
Now IME cursor position should be correct since we can still set cursor position without drawing the cursor.
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/compositor.rs22
-rw-r--r--helix-term/src/ui/editor.rs8
-rw-r--r--helix-term/src/ui/picker.rs5
-rw-r--r--helix-term/src/ui/popup.rs2
-rw-r--r--helix-term/src/ui/prompt.rs14
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,
+ )
}
}