Skip to content

Commit 5ead632

Browse files
committed
feat: set visiblity of the cursor
Add a builder function to set the cursor visiblity, and functions to toggle this feature. Fixes #113, #114
1 parent 855b5ce commit 5ead632

5 files changed

+236
-1
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
---
2+
source: src/widget.rs
3+
expression: view
4+
---
5+
Buffer {
6+
area: Rect { x: 0, y: 0, width: 80, height: 24 },
7+
content: [
8+
" Cargo.lock  docs  LICENSE  test ",
9+
" Cargo.toml  examples  README.md  typescript ",
10+
" CHANGELOG.md  flake.lock  rust-toolchain.toml  wezterm ",
11+
" cliff.toml  flake.nix  src ",
12+
" committed.toml  justfile  target ",
13+
"tui-term on  main [!?⇡] via ❄️ pure (tui-term-env) ",
14+
"",
15+
" ",
16+
" ",
17+
" ",
18+
" ",
19+
" ",
20+
" ",
21+
" ",
22+
" ",
23+
" ",
24+
" ",
25+
" ",
26+
" ",
27+
" ",
28+
" ",
29+
" ",
30+
" ",
31+
" ",
32+
],
33+
styles: [
34+
x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
35+
x: 17, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
36+
x: 23, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
37+
x: 54, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
38+
x: 60, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
39+
x: 17, y: 1, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
40+
x: 27, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
41+
x: 54, y: 2, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
42+
x: 63, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
43+
x: 31, y: 3, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
44+
x: 36, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
45+
x: 32, y: 4, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
46+
x: 40, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
47+
x: 0, y: 5, fg: Indexed(6), bg: Reset, underline: Reset, modifier: BOLD,
48+
x: 8, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
49+
x: 12, y: 5, fg: Indexed(5), bg: Reset, underline: Reset, modifier: BOLD,
50+
x: 18, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
51+
x: 19, y: 5, fg: Indexed(1), bg: Reset, underline: Reset, modifier: BOLD,
52+
x: 24, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
53+
x: 29, y: 5, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
54+
x: 50, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
55+
x: 0, y: 6, fg: Indexed(2), bg: Reset, underline: Reset, modifier: BOLD,
56+
x: 1, y: 6, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
57+
]
58+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
---
2+
source: src/widget.rs
3+
expression: view
4+
---
5+
Buffer {
6+
area: Rect { x: 0, y: 0, width: 80, height: 24 },
7+
content: [
8+
" Cargo.lock  docs  LICENSE  test ",
9+
" Cargo.toml  examples  README.md  typescript ",
10+
" CHANGELOG.md  flake.lock  rust-toolchain.toml  wezterm ",
11+
" cliff.toml  flake.nix  src ",
12+
" committed.toml  justfile  target ",
13+
"tui-term on  main [!?⇡] via ❄️ pure (tui-term-env) ",
14+
"",
15+
" ",
16+
" ",
17+
" ",
18+
" ",
19+
" ",
20+
" ",
21+
" ",
22+
" ",
23+
" ",
24+
" ",
25+
" ",
26+
" ",
27+
" ",
28+
" ",
29+
" ",
30+
" ",
31+
" ",
32+
],
33+
styles: [
34+
x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
35+
x: 17, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
36+
x: 23, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
37+
x: 54, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
38+
x: 60, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
39+
x: 17, y: 1, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
40+
x: 27, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
41+
x: 54, y: 2, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
42+
x: 63, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
43+
x: 31, y: 3, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
44+
x: 36, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
45+
x: 32, y: 4, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
46+
x: 40, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
47+
x: 0, y: 5, fg: Indexed(6), bg: Reset, underline: Reset, modifier: BOLD,
48+
x: 8, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
49+
x: 12, y: 5, fg: Indexed(5), bg: Reset, underline: Reset, modifier: BOLD,
50+
x: 18, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
51+
x: 19, y: 5, fg: Indexed(1), bg: Reset, underline: Reset, modifier: BOLD,
52+
x: 24, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
53+
x: 29, y: 5, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
54+
x: 50, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
55+
x: 0, y: 6, fg: Indexed(2), bg: Reset, underline: Reset, modifier: BOLD,
56+
x: 1, y: 6, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
57+
]
58+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
---
2+
source: src/widget.rs
3+
expression: view
4+
---
5+
Buffer {
6+
area: Rect { x: 0, y: 0, width: 80, height: 24 },
7+
content: [
8+
" Cargo.lock  docs  LICENSE  test ",
9+
" Cargo.toml  examples  README.md  typescript ",
10+
" CHANGELOG.md  flake.lock  rust-toolchain.toml  wezterm ",
11+
" cliff.toml  flake.nix  src ",
12+
" committed.toml  justfile  target ",
13+
"tui-term on  main [!?⇡] via ❄️ pure (tui-term-env) ",
14+
"",
15+
" ",
16+
"| ",
17+
" ",
18+
" ",
19+
" ",
20+
" ",
21+
" ",
22+
" ",
23+
" ",
24+
" ",
25+
" ",
26+
" ",
27+
" ",
28+
" ",
29+
" ",
30+
" ",
31+
" ",
32+
],
33+
styles: [
34+
x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
35+
x: 17, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
36+
x: 23, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
37+
x: 54, y: 0, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
38+
x: 60, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
39+
x: 17, y: 1, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
40+
x: 27, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
41+
x: 54, y: 2, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
42+
x: 63, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
43+
x: 31, y: 3, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
44+
x: 36, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
45+
x: 32, y: 4, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
46+
x: 40, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
47+
x: 0, y: 5, fg: Indexed(6), bg: Reset, underline: Reset, modifier: BOLD,
48+
x: 8, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
49+
x: 12, y: 5, fg: Indexed(5), bg: Reset, underline: Reset, modifier: BOLD,
50+
x: 18, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
51+
x: 19, y: 5, fg: Indexed(1), bg: Reset, underline: Reset, modifier: BOLD,
52+
x: 24, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
53+
x: 29, y: 5, fg: Indexed(4), bg: Reset, underline: Reset, modifier: BOLD,
54+
x: 50, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
55+
x: 0, y: 6, fg: Indexed(2), bg: Reset, underline: Reset, modifier: BOLD,
56+
x: 1, y: 6, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
57+
x: 0, y: 8, fg: LightRed, bg: Cyan, underline: Reset, modifier: NONE,
58+
x: 1, y: 8, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,
59+
]
60+
}

src/state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ pub fn handle(term: &PseudoTerminal, area: Rect, buf: &mut Buffer) {
5858
}
5959
}
6060

61-
if !screen.hide_cursor() {
61+
if !screen.hide_cursor() && term.cursor.show {
6262
let (c_row, c_col) = screen.cursor_position();
6363
if (c_row + row_start) < area_rows && (c_col + col_start) < area_cols {
6464
let c_cell = buf.get_mut(c_col + col_start, c_row + row_start);

src/widget.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,17 @@ use crate::state;
3939
/// .add_modifier(Modifier::BOLD),
4040
/// );
4141
/// ```
42+
#[non_exhaustive]
4243
pub struct PseudoTerminal<'a> {
4344
screen: &'a Screen,
4445
pub(crate) block: Option<Block<'a>>,
4546
style: Option<Style>,
4647
pub(crate) cursor: Cursor,
4748
}
4849

50+
#[non_exhaustive]
4951
pub struct Cursor {
52+
pub(crate) show: bool,
5053
pub(crate) symbol: String,
5154
pub(crate) style: Style,
5255
pub(crate) overlay_style: Style,
@@ -117,12 +120,33 @@ impl Cursor {
117120
self.overlay_style = overlay_style;
118121
self
119122
}
123+
124+
/// Set the visibility of the cursor (default = shown)
125+
#[inline]
126+
#[must_use]
127+
pub const fn visibility(mut self, show: bool) -> Self {
128+
self.show = show;
129+
self
130+
}
131+
132+
/// Show the cursor (default)
133+
#[inline]
134+
pub fn show(&mut self) {
135+
self.show = true;
136+
}
137+
138+
/// Hide the cursor
139+
#[inline]
140+
pub fn hide(&mut self) {
141+
self.show = false;
142+
}
120143
}
121144

122145
impl Default for Cursor {
123146
#[inline]
124147
fn default() -> Self {
125148
Self {
149+
show: true,
126150
symbol: "\u{2588}".into(), //"█".
127151
style: Style::default().fg(Color::Gray),
128152
overlay_style: Style::default().add_modifier(Modifier::REVERSED),
@@ -345,6 +369,41 @@ mod tests {
345369
insta::assert_snapshot!(view);
346370
}
347371
#[test]
372+
fn simple_cursor_hide() {
373+
let stream = include_bytes!("../test/typescript/simple_ls.typescript");
374+
let backend = TestBackend::new(80, 24);
375+
let mut terminal = Terminal::new(backend).unwrap();
376+
let mut parser = vt100::Parser::new(24, 80, 0);
377+
let cursor = Cursor::default().visibility(false);
378+
parser.process(stream);
379+
let pseudo_term = PseudoTerminal::new(parser.screen()).cursor(cursor);
380+
terminal
381+
.draw(|f| {
382+
f.render_widget(pseudo_term, f.size());
383+
})
384+
.unwrap();
385+
let view = format!("{:?}", terminal.backend().buffer());
386+
insta::assert_snapshot!(view);
387+
}
388+
#[test]
389+
fn simple_cursor_hide_alt() {
390+
let stream = include_bytes!("../test/typescript/simple_ls.typescript");
391+
let backend = TestBackend::new(80, 24);
392+
let mut terminal = Terminal::new(backend).unwrap();
393+
let mut parser = vt100::Parser::new(24, 80, 0);
394+
let mut cursor = Cursor::default();
395+
cursor.hide();
396+
parser.process(stream);
397+
let pseudo_term = PseudoTerminal::new(parser.screen()).cursor(cursor);
398+
terminal
399+
.draw(|f| {
400+
f.render_widget(pseudo_term, f.size());
401+
})
402+
.unwrap();
403+
let view = format!("{:?}", terminal.backend().buffer());
404+
insta::assert_snapshot!(view);
405+
}
406+
#[test]
348407
fn overlapping_cursor() {
349408
let stream = include_bytes!("../test/typescript/overlapping_cursor.typescript");
350409
let view = snapshot_typescript(stream);

0 commit comments

Comments
 (0)