Struct kas_widgets::edit::EditField

source ·
pub struct EditField<G: EditGuard = DefaultGuard<()>> {
    pub guard: G,
    /* private fields */
}
Expand description

A text-edit field (single- or multi-line)

This widget implements the mechanics of text layout and event handling. If you want a box with a border, use EditBox instead.

By default, the editor supports a single-line only; Self::with_multi_line and Self::with_class can be used to change this.

Event handling

This widget attempts to handle all standard text-editor input and scroll events.

Key events for moving the edit cursor (e.g. arrow keys) are consumed only if the edit cursor is moved while key events for adjusting or using the selection (e.g. Command::Copy and Command::Deselect) are consumed only when a selection exists. In contrast, key events for inserting or deleting text are always consumed.

Command::Enter inserts a line break in multi-line mode, but in single-line mode or if the Shift key is held it is treated the same as Command::Activate.

Performance and limitations

Text representation is via a single String. Edit operations are O(n) where n is the length of text (with text layout algorithms having greater cost than copying bytes in the backing String). This isn’t necessarily slow; when run with optimizations the type can handle type-setting around 20kB of UTF-8 in under 10ms (with significant scope for optimization, given that currently layout is re-run from scratch on each key stroke). Regardless, this approach is not designed to scale to handle large documents via a single EditField widget.

Fields§

§guard: G

The associated EditGuard implementation

Implementations§

source§

impl<G: EditGuard> EditField<G>

source

pub fn new(guard: G) -> EditField<G>

Construct an EditBox with an EditGuard

source§

impl<A: 'static> EditField<DefaultGuard<A>>

source

pub fn text<S: ToString>(text: S) -> Self

Construct an EditField with the given inital text (no event handling)

source

pub fn string( value_fn: impl Fn(&A) -> String + 'static ) -> EditField<StringGuard<A>>

Construct a read-only EditField displaying some String value

source

pub fn parser<T: Debug + Display + FromStr, M: Debug + 'static>( value_fn: impl Fn(&A) -> T + 'static, msg_fn: impl Fn(T) -> M + 'static ) -> EditField<ParseGuard<A, T>>

Construct an EditField for a parsable value (e.g. a number)

On update, value_fn is used to extract a value from input data which is then formatted as a string via Display. If, however, the input field has focus, the update is ignored.

On every edit, the guard attempts to parse the field’s input as type T via FromStr, caching the result and setting the error state.

On field activation and focus loss when a T value is cached (see previous paragraph), on_afl is used to construct a message to be emitted via EventCx::push. The cached value is then cleared to avoid sending duplicate messages.

source

pub fn instant_parser<T: Debug + Display + FromStr, M: Debug + 'static>( value_fn: impl Fn(&A) -> T + 'static, msg_fn: impl Fn(T) -> M + 'static ) -> EditField<InstantParseGuard<A, T>>

Construct an EditField for a parsable value (e.g. a number)

On update, value_fn is used to extract a value from input data which is then formatted as a string via Display. If, however, the input field has focus, the update is ignored.

On every edit, the guard attempts to parse the field’s input as type T via FromStr. On success, the result is converted to a message via on_afl then emitted via EventCx::push.

source§

impl<A: 'static> EditField<StringGuard<A>>

source

pub fn with_msg<M>(self, msg_fn: impl Fn(&str) -> M + 'static) -> Self
where M: Debug + 'static,

Assign a message function for a String value

The msg_fn is called when the field is activated (Enter) and when it loses focus after content is changed.

This method sets self as editable (see Self::with_editable).

source§

impl<G: EditGuard> EditField<G>

source

pub fn set_outer_rect(&mut self, outer_rect: Rect, style: FrameStyle)

Set outer rect

Optionally, call this immediately after Self::set_rect with the “outer” rect and frame style. In this case, a frame will be drawn using this outer_rect and style. The advantages are:

  • The “error state” background can correctly fill the frame
  • Clicks on the frame get registered as clicks on self

Any other widgets painted over the outer_rect should be drawn after the EditField.

source

pub fn with_text(self, text: impl ToString) -> Self

Set the initial text (inline)

This method should only be used on a new EditField.

source

pub fn with_editable(self, editable: bool) -> Self

Set whether this EditField is editable (inline)

source

pub fn is_editable(&self) -> bool

Get whether this EditField is editable

source

pub fn set_editable(&mut self, editable: bool)

Set whether this EditField is editable

source

pub fn with_multi_line(self, multi_line: bool) -> Self

Set whether this EditField uses multi-line mode

This method does two things:

source

pub fn multi_line(&self) -> bool

True if the editor uses multi-line mode

See also: Self::with_multi_line

source

pub fn with_class(self, class: TextClass) -> Self

Set the text class used

source

pub fn class(&self) -> TextClass

Get the text class used

source

pub fn set_lines(&mut self, min_lines: i32, ideal_lines: i32)

Adjust the height allocation

source

pub fn with_lines(self, min_lines: i32, ideal_lines: i32) -> Self

Adjust the height allocation (inline)

source

pub fn set_width_em(&mut self, min_em: f32, ideal_em: f32)

Adjust the width allocation

source

pub fn with_width_em(self, min_em: f32, ideal_em: f32) -> Self

Adjust the width allocation (inline)

source

pub fn has_edit_focus(&self) -> bool

Get whether the widget has edit focus

This is true when the widget is editable and has keyboard focus.

source

pub fn has_error(&self) -> bool

Get whether the input state is erroneous

source

pub fn set_error_state(&mut self, error_state: bool) -> Action

Set the error state

When true, the input field’s background is drawn red. This state is cleared by Self::set_string.

Trait Implementations§

source§

impl<G> Clone for EditField<G>
where G: Clone + EditGuard,

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<G> Debug for EditField<G>
where G: Debug + EditGuard,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<G> Default for EditField<G>
where G: Default + EditGuard,

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<G: EditGuard> Events for EditField<G>

source§

fn configure(&mut self, cx: &mut ConfigCx<'_>)

Configure self Read more
source§

fn update(&mut self, cx: &mut ConfigCx<'_>, data: &G::Data)

Update self using input data Read more
source§

fn handle_event( &mut self, cx: &mut EventCx<'_>, data: &G::Data, event: Event ) -> IsUsed

Handle an Event Read more
source§

fn navigable(&self) -> bool

Is this widget navigable via Tab key? Read more
source§

fn handle_hover(&mut self, cx: &mut EventCx<'_>, state: bool) -> IsUsed

Mouse focus handler Read more
source§

fn steal_event( &mut self, _: &mut EventCx<'_>, _: &Self::Data, _: &Id, _: &Event ) -> IsUsed

Potentially steal an event before it reaches a child Read more
source§

fn make_child_id(&mut self, index: usize) -> Id

Make an identifier for a child Read more
source§

fn configure_recurse(&mut self, cx: &mut ConfigCx<'_>, data: &Self::Data)

Configure children Read more
source§

fn update_recurse(&mut self, cx: &mut ConfigCx<'_>, data: &Self::Data)

Update children Read more
source§

fn handle_messages(&mut self, cx: &mut EventCx<'_>, data: &Self::Data)

Handler for messages from children/descendants Read more
source§

fn handle_scroll( &mut self, cx: &mut EventCx<'_>, data: &Self::Data, scroll: Scroll )

Handler for scrolling Read more
source§

impl<G: EditGuard> HasStr for EditField<G>

source§

fn get_str(&self) -> &str

Get text by reference
source§

fn get_string(&self) -> String

Get text as a String
source§

impl<G: EditGuard> HasString for EditField<G>

source§

fn set_string(&mut self, string: String) -> Action

Set text from a string
source§

fn set_str(&mut self, text: &str) -> Action

Set text from a &str Read more
source§

impl<G: EditGuard> Layout for EditField<G>

source§

fn size_rules(&mut self, sizer: SizeCx<'_>, axis: AxisInfo) -> SizeRules

Get size rules for the given axis Read more
source§

fn set_rect(&mut self, cx: &mut ConfigCx<'_>, rect: Rect)

Set size and position Read more
source§

fn find_id(&mut self, coord: Coord) -> Option<Id>

Translate a coordinate to an Id Read more
source§

fn draw(&mut self, draw: DrawCx<'_>)

Draw a widget and its children Read more
source§

fn as_layout(&self) -> &dyn Layout

Get as a dyn Layout Read more
source§

fn id_ref(&self) -> &Id

Get the widget’s identifier Read more
source§

fn rect(&self) -> Rect

Get the widget’s region, relative to its parent. Read more
source§

fn widget_name(&self) -> &'static str

Get the name of the widget struct Read more
source§

fn num_children(&self) -> usize

Get the number of child widgets Read more
source§

fn get_child(&self, index: usize) -> Option<&dyn Layout>

Access a child as a dyn Layout Read more
source§

fn nav_next(&self, reverse: bool, from: Option<usize>) -> Option<usize>

Navigation in spatial order Read more
source§

fn find_child_index(&self, id: &Id) -> Option<usize>

Find the child which is an ancestor of this id, if any Read more
source§

fn translation(&self) -> Offset

Get translation of children relative to this widget Read more
source§

impl<G: EditGuard> Scrollable for EditField<G>

source§

fn scroll_axes(&self, size: Size) -> (bool, bool)

Given size size, returns whether (horiz, vert) scrolling is required Read more
source§

fn max_scroll_offset(&self) -> Offset

Get the maximum scroll offset Read more
source§

fn scroll_offset(&self) -> Offset

Get the current scroll offset Read more
source§

fn set_scroll_offset(&mut self, cx: &mut EventCx<'_>, offset: Offset) -> Offset

Set the scroll offset Read more
source§

impl<G: EditGuard> ToString for EditField<G>

source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<G: EditGuard> Widget for EditField<G>

§

type Data = <G as EditGuard>::Data

Input data type Read more
source§

fn as_node<'a>(&'a mut self, data: &'a Self::Data) -> Node<'a>

Erase type Read more
source§

fn for_child_node( &mut self, data: &Self::Data, index: usize, closure: Box<dyn FnOnce(Node<'_>) + '_> )

Call closure on child with given index, if index < self.num_children(). Read more

Auto Trait Implementations§

§

impl<G> RefUnwindSafe for EditField<G>
where G: RefUnwindSafe,

§

impl<G = DefaultGuard<()>> !Send for EditField<G>

§

impl<G = DefaultGuard<()>> !Sync for EditField<G>

§

impl<G> Unpin for EditField<G>
where G: Unpin,

§

impl<G> UnwindSafe for EditField<G>
where G: UnwindSafe,

Blanket Implementations§

source§

impl<W> AdaptWidget for W
where W: Widget,

source§

fn map<A, F>(self, f: F) -> Map<A, Self, F>
where F: for<'a> Fn(&'a A) -> &'a Self::Data,

Map data type via a function Read more
source§

fn on_configure<F>(self, f: F) -> AdaptEvents<Self>
where F: Fn(&mut AdaptConfigCx<'_, '_>, &mut Self) + 'static,

Call the given closure on Events::configure Read more
source§

fn on_update<F>(self, f: F) -> AdaptEvents<Self>
where F: Fn(&mut AdaptConfigCx<'_, '_>, &mut Self, &Self::Data) + 'static,

Call the given closure on Events::update Read more
source§

fn on_message<M, H>(self, handler: H) -> AdaptEvents<Self>
where M: Debug + 'static, H: Fn(&mut AdaptEventCx<'_, '_>, &mut Self, M) + 'static,

Add a handler on message of type M Read more
source§

fn on_messages<H>(self, handler: H) -> AdaptEvents<Self>
where H: Fn(&mut AdaptEventCx<'_, '_>, &mut Self, &Self::Data) + 'static,

Add a generic message handler Read more
source§

fn with_min_size_px(self, w: i32, h: i32) -> Reserve<Self>

Construct a wrapper, setting minimum size in pixels Read more
source§

fn with_min_size_em(self, w: f32, h: f32) -> Reserve<Self>

Construct a wrapper, setting minimum size in Em Read more
source§

fn with_label<D, T>(self, direction: D, label: T) -> WithLabel<Self, D>

Construct a wrapper widget adding a label Read more
source§

impl<W> AdaptWidgetAny for W
where W: Widget<Data = ()>,

source§

fn map_any<A>(self) -> MapAny<A, Self>

Map any input data to () Read more
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
§

impl<S, T> Cast<T> for S
where T: Conv<S>,

§

fn cast(self) -> T

Cast from Self to T Read more
§

fn try_cast(self) -> Result<T, Error>

Try converting from Self to T Read more
§

impl<S, T> CastApprox<T> for S
where T: ConvApprox<S>,

§

fn try_cast_approx(self) -> Result<T, Error>

Try approximate conversion from Self to T Read more
§

fn cast_approx(self) -> T

Cast approximately from Self to T Read more
§

impl<S, T> CastFloat<T> for S
where T: ConvFloat<S>,

§

fn cast_trunc(self) -> T

Cast to integer, truncating Read more
§

fn cast_nearest(self) -> T

Cast to the nearest integer Read more
§

fn cast_floor(self) -> T

Cast the floor to an integer Read more
§

fn cast_ceil(self) -> T

Cast the ceiling to an integer Read more
§

fn try_cast_trunc(self) -> Result<T, Error>

Try converting to integer with truncation Read more
§

fn try_cast_nearest(self) -> Result<T, Error>

Try converting to the nearest integer Read more
§

fn try_cast_floor(self) -> Result<T, Error>

Try converting the floor to an integer Read more
§

fn try_cast_ceil(self) -> Result<T, Error>

Try convert the ceiling to an integer Read more
§

impl<T> Downcast for T
where T: 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.
§

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

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

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> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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<W> LayoutExt for W
where W: Layout + ?Sized,

source§

fn id(&self) -> Id

Get the widget’s identifier Read more
source§

fn eq_id<T>(&self, rhs: T) -> bool
where Id: PartialEq<T>,

Test widget identifier for equality Read more
source§

fn identify(&self) -> IdentifyWidget<'_>

Display as “StructName#Id”
source§

fn is_ancestor_of(&self, id: &Id) -> bool

Check whether id is self or a descendant Read more
source§

fn is_strict_ancestor_of(&self, id: &Id) -> bool

Check whether id is not self and is a descendant Read more
source§

fn for_children(&self, f: impl FnMut(&dyn Layout))

Run a closure on all children
source§

fn for_children_try<E>( &self, f: impl FnMut(&dyn Layout) -> Result<(), E> ) -> Result<(), E>

Run a fallible closure on all children Read more
source§

fn find_widget(&self, id: &Id) -> Option<&dyn Layout>

Find the descendant with this id, if any Read more
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

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

§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

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

§

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

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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