Skip to content

Commit

Permalink
feat: set visiblity of the cursor
Browse files Browse the repository at this point in the history
Add a builder function to set the cursor visiblity,
and functions to toggle this feature.

Fixes #113, #114
  • Loading branch information
a-kenji committed Jan 13, 2024
1 parent 855b5ce commit 5ead632
Show file tree
Hide file tree
Showing 5 changed files with 236 additions and 1 deletion.
58 changes: 58 additions & 0 deletions src/snapshots/tui_term__widget__tests__simple_cursor_hide.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
source: src/widget.rs
expression: view
---
Buffer {
area: Rect { x: 0, y: 0, width: 80, height: 24 },
content: [
" Cargo.lock  docs  LICENSE  test ",
" Cargo.toml  examples  README.md  typescript ",
" CHANGELOG.md  flake.lock  rust-toolchain.toml  wezterm ",
" cliff.toml  flake.nix  src ",
" committed.toml  justfile  target ",
"tui-term on  main [!?⇡] via ❄️ pure (tui-term-env) ",
"",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
],
styles: [
x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 17, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 23, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 54, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 60, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 17, y: 1, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 27, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 54, y: 2, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 63, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 31, y: 3, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 36, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 32, y: 4, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 40, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 0, y: 5, fg: Indexed(6), bg: Reset, underline: Reset, modifier: BOLD,
x: 8, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 12, y: 5, fg: Indexed(5), bg: Reset, underline: Reset, modifier: BOLD,
x: 18, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 19, y: 5, fg: Indexed(1), bg: Reset, underline: Reset, modifier: BOLD,
x: 24, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 29, y: 5, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 50, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 0, y: 6, fg: Indexed(2), bg: Reset, underline: Reset, modifier: BOLD,
x: 1, y: 6, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
]
}
58 changes: 58 additions & 0 deletions src/snapshots/tui_term__widget__tests__simple_cursor_hide_alt.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
source: src/widget.rs
expression: view
---
Buffer {
area: Rect { x: 0, y: 0, width: 80, height: 24 },
content: [
" Cargo.lock  docs  LICENSE  test ",
" Cargo.toml  examples  README.md  typescript ",
" CHANGELOG.md  flake.lock  rust-toolchain.toml  wezterm ",
" cliff.toml  flake.nix  src ",
" committed.toml  justfile  target ",
"tui-term on  main [!?⇡] via ❄️ pure (tui-term-env) ",
"",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
],
styles: [
x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 17, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 23, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 54, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 60, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 17, y: 1, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 27, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 54, y: 2, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 63, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 31, y: 3, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 36, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 32, y: 4, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 40, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 0, y: 5, fg: Indexed(6), bg: Reset, underline: Reset, modifier: BOLD,
x: 8, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 12, y: 5, fg: Indexed(5), bg: Reset, underline: Reset, modifier: BOLD,
x: 18, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 19, y: 5, fg: Indexed(1), bg: Reset, underline: Reset, modifier: BOLD,
x: 24, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 29, y: 5, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 50, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 0, y: 6, fg: Indexed(2), bg: Reset, underline: Reset, modifier: BOLD,
x: 1, y: 6, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
---
source: src/widget.rs
expression: view
---
Buffer {
area: Rect { x: 0, y: 0, width: 80, height: 24 },
content: [
" Cargo.lock  docs  LICENSE  test ",
" Cargo.toml  examples  README.md  typescript ",
" CHANGELOG.md  flake.lock  rust-toolchain.toml  wezterm ",
" cliff.toml  flake.nix  src ",
" committed.toml  justfile  target ",
"tui-term on  main [!?⇡] via ❄️ pure (tui-term-env) ",
"",
" ",
"| ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
],
styles: [
x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 17, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 23, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 54, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 60, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 17, y: 1, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 27, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 54, y: 2, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 63, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 31, y: 3, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 36, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 32, y: 4, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 40, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 0, y: 5, fg: Indexed(6), bg: Reset, underline: Reset, modifier: BOLD,
x: 8, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 12, y: 5, fg: Indexed(5), bg: Reset, underline: Reset, modifier: BOLD,
x: 18, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 19, y: 5, fg: Indexed(1), bg: Reset, underline: Reset, modifier: BOLD,
x: 24, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 29, y: 5, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
x: 50, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 0, y: 6, fg: Indexed(2), bg: Reset, underline: Reset, modifier: BOLD,
x: 1, y: 6, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
x: 0, y: 8, fg: LightRed, bg: Cyan, underline: Reset, modifier: NONE,
x: 1, y: 8, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
]
}
2 changes: 1 addition & 1 deletion src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ pub fn handle(term: &PseudoTerminal, area: Rect, buf: &mut Buffer) {
}
}

if !screen.hide_cursor() {
if !screen.hide_cursor() && term.cursor.show {
let (c_row, c_col) = screen.cursor_position();
if (c_row + row_start) < area_rows && (c_col + col_start) < area_cols {
let c_cell = buf.get_mut(c_col + col_start, c_row + row_start);
Expand Down
59 changes: 59 additions & 0 deletions src/widget.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,17 @@ use crate::state;
/// .add_modifier(Modifier::BOLD),
/// );
/// ```
#[non_exhaustive]
pub struct PseudoTerminal<'a> {
screen: &'a Screen,
pub(crate) block: Option<Block<'a>>,
style: Option<Style>,
pub(crate) cursor: Cursor,
}

#[non_exhaustive]
pub struct Cursor {
pub(crate) show: bool,
pub(crate) symbol: String,
pub(crate) style: Style,
pub(crate) overlay_style: Style,
Expand Down Expand Up @@ -117,12 +120,33 @@ impl Cursor {
self.overlay_style = overlay_style;
self
}

/// Set the visibility of the cursor (default = shown)
#[inline]
#[must_use]
pub const fn visibility(mut self, show: bool) -> Self {
self.show = show;
self
}

/// Show the cursor (default)
#[inline]
pub fn show(&mut self) {
self.show = true;
}

/// Hide the cursor
#[inline]
pub fn hide(&mut self) {
self.show = false;
}
}

impl Default for Cursor {
#[inline]
fn default() -> Self {
Self {
show: true,
symbol: "\u{2588}".into(), //"█".
style: Style::default().fg(Color::Gray),
overlay_style: Style::default().add_modifier(Modifier::REVERSED),
Expand Down Expand Up @@ -345,6 +369,41 @@ mod tests {
insta::assert_snapshot!(view);
}
#[test]
fn simple_cursor_hide() {
let stream = include_bytes!("../test/typescript/simple_ls.typescript");
let backend = TestBackend::new(80, 24);
let mut terminal = Terminal::new(backend).unwrap();
let mut parser = vt100::Parser::new(24, 80, 0);
let cursor = Cursor::default().visibility(false);
parser.process(stream);
let pseudo_term = PseudoTerminal::new(parser.screen()).cursor(cursor);
terminal
.draw(|f| {
f.render_widget(pseudo_term, f.size());
})
.unwrap();
let view = format!("{:?}", terminal.backend().buffer());
insta::assert_snapshot!(view);
}
#[test]
fn simple_cursor_hide_alt() {
let stream = include_bytes!("../test/typescript/simple_ls.typescript");
let backend = TestBackend::new(80, 24);
let mut terminal = Terminal::new(backend).unwrap();
let mut parser = vt100::Parser::new(24, 80, 0);
let mut cursor = Cursor::default();
cursor.hide();
parser.process(stream);
let pseudo_term = PseudoTerminal::new(parser.screen()).cursor(cursor);
terminal
.draw(|f| {
f.render_widget(pseudo_term, f.size());
})
.unwrap();
let view = format!("{:?}", terminal.backend().buffer());
insta::assert_snapshot!(view);
}
#[test]
fn overlapping_cursor() {
let stream = include_bytes!("../test/typescript/overlapping_cursor.typescript");
let view = snapshot_typescript(stream);
Expand Down

0 comments on commit 5ead632

Please sign in to comment.