#[non_exhaustive]pub struct Cursor { /* private fields */ }Implementations§
source§impl Cursor
impl Cursor
sourcepub const fn overlay_style(self, overlay_style: Style) -> Self
pub const fn overlay_style(self, overlay_style: Style) -> Self
Sets the overlay style for the cursor.
The overlay style is used when the cursor overlaps with existing content on the screen.
§Arguments
overlay_style: TheStyleto set as the overlay style for the cursor.
§Example
use ratatui::style::Style;
use tui_term::widget::Cursor;
let cursor = Cursor::default().overlay_style(Style::default());sourcepub const fn visibility(self, show: bool) -> Self
pub const fn visibility(self, show: bool) -> Self
Set the visibility of the cursor (default = shown)
Examples found in repository?
examples/simple_ls_controller.rs (line 75)
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
fn ui(f: &mut Frame, screen: &Screen) {
let chunks = ratatui::layout::Layout::default()
.direction(ratatui::layout::Direction::Vertical)
.margin(1)
.constraints(
[
ratatui::layout::Constraint::Percentage(100),
ratatui::layout::Constraint::Min(1),
]
.as_ref(),
)
.split(f.area());
let title = Line::from("[ Running: ls ]");
let block = Block::default()
.borders(Borders::ALL)
.title(title)
.style(Style::default().add_modifier(Modifier::BOLD));
let pseudo_term = PseudoTerminal::new(screen)
.cursor(tui_term::widget::Cursor::default().visibility(false))
.block(block.clone());
f.render_widget(pseudo_term, chunks[0]);
let explanation = "Press q to exit";
let explanation = Paragraph::new(explanation)
.style(Style::default().add_modifier(Modifier::BOLD | Modifier::REVERSED))
.alignment(Alignment::Center);
f.render_widget(explanation, chunks[1]);
}sourcepub fn hide(&mut self)
pub fn hide(&mut self)
Hide the cursor
Examples found in repository?
examples/smux.rs (line 79)
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
async fn main() -> io::Result<()> {
init_panic_hook();
let (mut terminal, mut size) = setup_terminal().unwrap();
let cwd = std::env::current_dir().unwrap();
let mut cmd = CommandBuilder::new_default_prog();
cmd.cwd(cwd);
let mut panes: Vec<PtyPane> = Vec::new();
let mut active_pane: Option<usize> = None;
// Add a default pane
let pane_size = calc_pane_size(size, 1);
open_new_pane(&mut panes, &mut active_pane, &cmd, pane_size)?;
loop {
terminal.draw(|f| {
let chunks = Layout::default()
.direction(Direction::Vertical)
.margin(1)
.constraints([Constraint::Percentage(100), Constraint::Min(1)].as_ref())
.split(f.area());
let pane_height = if panes.is_empty() {
chunks[0].height
} else {
(chunks[0].height.saturating_sub(1)) / panes.len() as u16
};
for (index, pane) in panes.iter().enumerate() {
let block = Block::default()
.borders(Borders::ALL)
.style(Style::default().add_modifier(Modifier::BOLD));
let mut cursor = Cursor::default();
let block = if Some(index) == active_pane {
block.style(
Style::default()
.add_modifier(Modifier::BOLD)
.fg(Color::LightMagenta),
)
} else {
cursor.hide();
block
};
let parser = pane.parser.read().unwrap();
let screen = parser.screen();
let pseudo_term = PseudoTerminal::new(screen).block(block).cursor(cursor);
let pane_chunk = Rect {
x: chunks[0].x,
y: chunks[0].y + (index as u16 * pane_height), /* Adjust the y coordinate for
* each pane */
width: chunks[0].width,
height: pane_height, // Use the calculated pane height directly
};
f.render_widget(pseudo_term, pane_chunk);
}
let explanation =
"Ctrl+n to open a new pane | Ctrl+x to close the active pane | Ctrl+q to quit";
let explanation = Paragraph::new(explanation)
.style(Style::default().add_modifier(Modifier::BOLD | Modifier::REVERSED))
.alignment(Alignment::Center);
f.render_widget(explanation, chunks[1]);
})?;
if event::poll(Duration::from_millis(10))? {
tracing::info!("Terminal Size: {:?}", terminal.size());
match event::read()? {
Event::Key(key) => match key.code {
KeyCode::Char('q') if key.modifiers.contains(KeyModifiers::CONTROL) => {
cleanup_terminal(&mut terminal).unwrap();
return Ok(());
}
KeyCode::Char('n') if key.modifiers.contains(KeyModifiers::CONTROL) => {
let pane_size = calc_pane_size(size, panes.len() + 1);
tracing::info!("Opened new pane with size: {size:?}");
resize_all_panes(&mut panes, pane_size);
open_new_pane(&mut panes, &mut active_pane, &cmd, pane_size)?;
}
KeyCode::Char('x') if key.modifiers.contains(KeyModifiers::CONTROL) => {
close_active_pane(&mut panes, &mut active_pane).await?;
resize_all_panes(&mut panes, pane_size);
}
KeyCode::Char('k') if key.modifiers.contains(KeyModifiers::CONTROL) => {
if let Some(pane) = active_pane {
active_pane = Some(pane.saturating_sub(1));
}
}
KeyCode::Char('j') if key.modifiers.contains(KeyModifiers::CONTROL) => {
if let Some(pane) = active_pane {
if pane < panes.len() - 1 {
active_pane = Some(pane.saturating_add(1));
}
}
}
_ => {
if let Some(index) = active_pane {
if handle_pane_key_event(&mut panes[index], &key).await {
continue;
}
}
}
},
Event::Resize(cols, rows) => {
tracing::info!("Resized to: rows: {} cols: {}", rows, cols);
size.rows = rows;
size.cols = cols;
let pane_size = calc_pane_size(size, panes.len());
resize_all_panes(&mut panes, pane_size);
}
_ => {}
}
}
}
}Trait Implementations§
Auto Trait Implementations§
impl Freeze for Cursor
impl RefUnwindSafe for Cursor
impl Send for Cursor
impl Sync for Cursor
impl Unpin for Cursor
impl UnwindSafe for Cursor
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more