pub struct Terminal {
pub id: WidgetId,
pub cells: Vec<Vec<TerminalCell>>,
pub scrollbar: Option<TerminalScrollbar>,
}Expand description
Declarative description of a terminal cell grid.
cells[row][col] — outer Vec is rows top-to-bottom, inner Vec is
columns left-to-right. Rows may be ragged (different lengths) but
backends should treat missing trailing cells as blank.
Stays a plain, non-#[non_exhaustive] struct: a published consumer
builds it with an exhaustive struct literal today, so marking it
#[non_exhaustive] would break that consumer’s build. Default is
still provided for consumers that want the
Default::default()-plus-field-assignment pattern.
§Examples
use quadraui::{Color, Terminal, TerminalCell, TerminalHit, WidgetId};
let cell = TerminalCell {
text: "$".to_string(),
fg: Color::rgb(200, 200, 200),
bg: Color::rgb(0, 0, 0),
bold: false,
italic: false,
underline: false,
dim: false,
selected: false,
is_cursor: true,
cursor_shape: Default::default(),
cursor_blinking: false,
is_find_match: false,
is_find_active: false,
};
let mut terminal = Terminal::default();
terminal.id = WidgetId::new("terminal:shell");
terminal.cells = vec![vec![cell]];
let layout = terminal.layout(80.0, 24.0, 1.0, 1.0);
assert_eq!(layout.hit_test(0.0, 0.0), TerminalHit::Cell { row: 0, col: 0 });Fields§
§id: WidgetId§cells: Vec<Vec<TerminalCell>>§scrollbar: Option<TerminalScrollbar>When present, the rasteriser draws a themed scrollbar using the
same style as editor scrollbars (Backend::draw_scrollbar).
Implementations§
Source§impl Terminal
impl Terminal
Sourcepub fn dirty_rows(&self, prev: &Terminal) -> Option<Vec<usize>>
pub fn dirty_rows(&self, prev: &Terminal) -> Option<Vec<usize>>
Compare self against the previously-painted prev snapshot and
return the indices of rows whose cell content differs.
Returns None when a full repaint is required rather than a
row-by-row diff: the two grids have different row counts, so
prev’s row i doesn’t necessarily correspond to self’s row
i (a resize/reflow shifted everything). Returns Some(rows)
otherwise — sorted ascending, deduplicated, and possibly empty
(e.g. a cursor-blink tick that produced an identical grid).
TerminalCell compares by value, so any change to a
cell’s glyph, colour, or overlay flag (selected / is_cursor /
is_find_match / is_find_active) — i.e. scroll, selection,
cursor move, and find-highlight updates — registers the owning
row as dirty; there is nothing overlay-specific for a caller to
special-case.
Sourcepub fn layout(
&self,
viewport_width: f32,
viewport_height: f32,
cell_width: f32,
cell_height: f32,
) -> TerminalLayout
pub fn layout( &self, viewport_width: f32, viewport_height: f32, cell_width: f32, cell_height: f32, ) -> TerminalLayout
Compute viewport → grid conversion. The layout is uniform-cell, so this is just division; there’s no per-cell work.
§Arguments
viewport_width,viewport_height— pane dimensions.cell_width,cell_height— cell dimensions. TUI passes(1.0, 1.0); native backends pass the font’s advance width and line height.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Terminal
impl<'de> Deserialize<'de> for Terminal
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for Terminal
impl StructuralPartialEq for Terminal
Auto Trait Implementations§
impl Freeze for Terminal
impl RefUnwindSafe for Terminal
impl Send for Terminal
impl Sync for Terminal
impl Unpin for Terminal
impl UnsafeUnpin for Terminal
impl UnwindSafe for Terminal
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
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>
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>
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)
&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)
&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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
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> ⓘ
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> ⓘ
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