Skip to main content

TextEditor

Struct TextEditor 

Source
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

Source

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.

Source

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.

Source

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.

Source

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.

Source

pub fn text(&self) -> &str

The current buffer text, including any composing preedit.

Source

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.

Source

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.

Source

pub fn editing_state_bytes(&self) -> EditingStateBytes

The current editing value in byte offsets.

Source

pub fn editing_state_utf16(&self) -> EditingState

The current editing value in UTF-16 offsets (Flutter-canonical shape).

Source

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).

Source

pub fn selection_rects(&self) -> Vec<Rect>

The rectangles covering the current (non-collapsed) selection.

Source

pub fn ime_cursor_area(&self) -> Rect

The area bounding the text currently being edited — a placement hint for the platform IME candidate box.

Source

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§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Downcast for T
where T: Any,

Source§

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>

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)

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)

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
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<T> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more