pub struct TextEditor { /* private fields */ }Expand description
The editing engine wrapping a parley PlainEditor.
Constructed once per focused TextInput; driven by apply
and read back through the geometry / editing-state accessors. The brush type
is fixed to peniko::Brush so glyph-run conversion is shared with
crate::TextLayout.
Implementations§
Source§impl TextEditor
impl TextEditor
Sourcepub fn new(style: &TextStyle) -> TextEditor
pub fn new(style: &TextStyle) -> TextEditor
Builds an empty single-line editor styled by style.
Every knob on style (family, weight, style, size, color,
letter-spacing, line-height) is applied as an edit-style default,
mirroring crate::TextContext::layout. No wrapping width is set —
v1 is single-line.
style.align is deliberately not applied here:
parley::PlainEditor manages its own layout
internally and exposes no alignment override through
parley::PlainEditor::edit_styles or any other hook this fn (or
Self::apply’s driver) reaches — unlike the other style knobs
above, there is no StyleProperty for it to insert. A live-edited
TextEditor (the engine behind TextInput) therefore always
renders start-aligned, regardless of style.align. Only
crate::TextContext::layout (static, non-editable text) honors it.
Sourcepub fn apply(&mut self, op: EditOp, ctx: &mut TextContext)
pub fn apply(&mut self, op: EditOp, ctx: &mut TextContext)
Applies one editing command, threading the shell-owned font/layout contexts through the transient parley driver.
The layout is refreshed at the end so the geometry accessors
(cursor_rect, selection_rects,
to_scene_runs, …) observe up-to-date positions
without needing a context of their own.
Sourcepub fn set_wrap_width(&mut self, width: Option<f32>, ctx: &mut TextContext)
pub fn set_wrap_width(&mut self, width: Option<f32>, ctx: &mut TextContext)
Sets (or clears) the soft-wrap width, switching between wrapped multi-line and single-line modes.
Some(px) soft-wraps the text at px logical pixels and makes vertical
caret motion (EditOp::MoveUp/EditOp::MoveDown) and newline
insertion (EditOp::InsertNewline) meaningful; None restores the
single-line default. The layout is refreshed immediately so
layout_size and the geometry accessors observe the
new wrapping without waiting for the next apply.
Sourcepub fn line_count(&self) -> usize
pub fn line_count(&self) -> usize
The number of visual lines in the current layout (1 for a non-empty single-line field; more once wrapping or explicit newlines split it).
Returns 0 before the first layout refresh.
Sourcepub fn selected_text(&self) -> Option<&str>
pub fn selected_text(&self) -> Option<&str>
The selected text slice, or None if the selection is collapsed.
Returns the text()[min(base, extent)..max(base, extent)] slice when
a non-collapsed selection exists. Returns None when the selection is
collapsed (base == extent).
On a preedit/composing state, this operation is infallible (asserted in
debug, returns None in release if byte offsets are not valid char
boundaries). This mirrors Flutter’s TextEditingValue.selection.textBefore
and textAfter derivatives on the selected slice.
Sourcepub fn layout_size(&self) -> Size
pub fn layout_size(&self) -> Size
The measured size of the laid-out text (Y-down logical pixels).
Returns Size::ZERO before the first apply has
refreshed the layout.
Sourcepub fn editing_state_bytes(&self) -> EditingStateBytes
pub fn editing_state_bytes(&self) -> EditingStateBytes
The current editing value in byte offsets.
Sourcepub fn editing_state_utf16(&self) -> EditingState
pub fn editing_state_utf16(&self) -> EditingState
The current editing value in UTF-16 offsets (Flutter-canonical shape).
Sourcepub fn cursor_rect(&self, caret_width: f32) -> Option<Rect>
pub fn cursor_rect(&self, caret_width: f32) -> Option<Rect>
The caret rectangle at the current focus, caret_width wide.
None when the caret is hidden (e.g. the IME requested it).
Sourcepub fn selection_rects(&self) -> Vec<Rect>
pub fn selection_rects(&self) -> Vec<Rect>
The rectangles covering the current (non-collapsed) selection.
Sourcepub fn ime_cursor_area(&self) -> Rect
pub fn ime_cursor_area(&self) -> Rect
The area bounding the text currently being edited — a placement hint for the platform IME candidate box.
Sourcepub fn to_scene_runs(&self, origin: Point) -> Vec<GlyphRun>
pub fn to_scene_runs(&self, origin: Point) -> Vec<GlyphRun>
Converts the current layout into frust_scene::GlyphRuns at
origin (reusing crate::TextLayout’s converter).
Empty before the first apply.
Auto Trait Implementations§
impl !RefUnwindSafe for TextEditor
impl !UnwindSafe for TextEditor
impl Freeze for TextEditor
impl Send for TextEditor
impl Sync for TextEditor
impl Unpin for TextEditor
impl UnsafeUnpin for TextEditor
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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.