pub struct EditField<G: EditGuard = DefaultGuard<()>> {
pub guard: G,
/* private fields */
}Expand description
A text-edit field (single- or multi-line)
The EditBox widget should be preferred in most cases; this widget
is a component of EditBox and has some special behaviour.
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.
§Messages
SetValueText may be used to replace the entire text and
ReplaceSelectedText may be used to replace selected text when this
widget is editable]. This triggers the action
handlers EditGuard::edit followed by EditGuard::activate.
§Special behaviour
This is a Viewport widget.
Fields§
§guard: GThe associated EditGuard implementation
Implementations§
Source§impl<G: EditGuard> EditField<G>
impl<G: EditGuard> EditField<G>
Sourcepub fn call_guard_activate(&mut self, cx: &mut EventCx<'_>, data: &G::Data)
pub fn call_guard_activate(&mut self, cx: &mut EventCx<'_>, data: &G::Data)
Call the EditGuard’s activate method
Sourcepub fn call_guard_edit(&mut self, cx: &mut EventCx<'_>, data: &G::Data)
pub fn call_guard_edit(&mut self, cx: &mut EventCx<'_>, data: &G::Data)
Call the EditGuard’s edit method
This call also clears the error state (see Editor::set_error).
Source§impl<A: 'static> EditField<DefaultGuard<A>>
impl<A: 'static> EditField<DefaultGuard<A>>
Sourcepub fn text<S: ToString>(text: S) -> Self
pub fn text<S: ToString>(text: S) -> Self
Construct an EditField with the given inital text (no event handling)
Sourcepub fn string(
value_fn: impl Fn(&A) -> String + 'static,
) -> EditField<StringGuard<A>>
pub fn string( value_fn: impl Fn(&A) -> String + 'static, ) -> EditField<StringGuard<A>>
Construct a read-only EditField displaying some String value
Sourcepub 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>>
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.
Sourcepub 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>>
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>>
impl<A: 'static> EditField<StringGuard<A>>
Sourcepub fn with_msg<M>(self, msg_fn: impl Fn(&str) -> M + 'static) -> Selfwhere
M: Debug + 'static,
pub fn with_msg<M>(self, msg_fn: impl Fn(&str) -> M + 'static) -> Selfwhere
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>
impl<G: EditGuard> EditField<G>
Sourcepub fn with_text(self, text: impl ToString) -> Self
pub fn with_text(self, text: impl ToString) -> Self
Set the initial text (inline)
This method should only be used on a new EditField.
Sourcepub fn with_editable(self, editable: bool) -> Self
pub fn with_editable(self, editable: bool) -> Self
Set whether this EditField is editable (inline)
Sourcepub fn with_multi_line(self, multi_line: bool) -> Self
pub fn with_multi_line(self, multi_line: bool) -> Self
Set whether this EditField uses multi-line mode
This method does two things:
- Changes the text class (see
Self::with_class) - Changes the vertical height allocation (see
Self::with_lines)
Sourcepub fn with_class(self, class: TextClass) -> Self
pub fn with_class(self, class: TextClass) -> Self
Set the text class used
Sourcepub fn with_lines(self, min_lines: f32, ideal_lines: f32) -> Self
pub fn with_lines(self, min_lines: f32, ideal_lines: f32) -> Self
Adjust the height allocation (inline)
Sourcepub fn set_width_em(&mut self, min_em: f32, ideal_em: f32)
pub fn set_width_em(&mut self, min_em: f32, ideal_em: f32)
Adjust the width allocation
Sourcepub fn with_width_em(self, min_em: f32, ideal_em: f32) -> Self
pub fn with_width_em(self, min_em: f32, ideal_em: f32) -> Self
Adjust the width allocation (inline)
Methods from Deref<Target = Editor>§
Sourcepub fn clone_string(&self) -> String
pub fn clone_string(&self) -> String
Get the text contents as a String
Sourcepub fn pre_commit(&mut self)
pub fn pre_commit(&mut self)
Commit outstanding changes to the undo history
Call this before changing the text with set_str or set_string
to commit changes to the undo history.
Sourcepub fn clear(&mut self, cx: &mut EventState)
pub fn clear(&mut self, cx: &mut EventState)
Clear text contents and undo history
This method does not call any EditGuard actions; consider also
calling EditField::call_guard_edit.
Sourcepub fn set_str(&mut self, cx: &mut EventState, text: &str) -> bool
pub fn set_str(&mut self, cx: &mut EventState, text: &str) -> bool
Set text contents from a str
This does not interact with undo history; see also Self::clear,
Self::pre_commit.
This method does not call any EditGuard actions; consider also
calling EditField::call_guard_edit.
Returns true if the text may have changed.
Sourcepub fn set_string(&mut self, cx: &mut EventState, string: String) -> bool
pub fn set_string(&mut self, cx: &mut EventState, string: String) -> bool
Set text contents from a String
This does not interact with undo history or call action handlers on the guard.
This method clears the error state but does not call any EditGuard
actions; consider also calling EditField::call_guard_edit.
Returns true if the text is ready and may have changed.
Sourcepub fn replace_selected_text(&mut self, cx: &mut EventState, text: &str) -> bool
pub fn replace_selected_text(&mut self, cx: &mut EventState, text: &str) -> bool
Replace selected text
This does not interact with undo history or call action handlers on the guard.
This method clears the error state but does not call any EditGuard
actions; consider also calling EditField::call_guard_edit.
Returns true if the text is ready and may have changed.
Sourcepub fn cursor_range(&self) -> CursorRange
pub fn cursor_range(&self) -> CursorRange
Access the cursor index / selection range
Sourcepub fn set_cursor_range(&mut self, range: impl Into<CursorRange>)
pub fn set_cursor_range(&mut self, range: impl Into<CursorRange>)
Set the cursor index / range
This does not interact with undo history or call action handlers on the guard.
Sourcepub fn is_editable(&self) -> bool
pub fn is_editable(&self) -> bool
Get whether this EditField is editable
Sourcepub fn set_editable(&mut self, editable: bool)
pub fn set_editable(&mut self, editable: bool)
Set whether this EditField is editable
Sourcepub fn multi_line(&self) -> bool
pub fn multi_line(&self) -> bool
True if the editor uses multi-line mode
Sourcepub fn has_input_focus(&self) -> bool
pub fn has_input_focus(&self) -> bool
Get whether the widget has input focus
This is true when the widget is has keyboard or IME focus.
Sourcepub fn set_error(
&mut self,
cx: &mut EventState,
message: Option<Cow<'static, str>>,
)
pub fn set_error( &mut self, cx: &mut EventState, message: Option<Cow<'static, str>>, )
Mark the input as erroneous with an optional message
This state should be set from EditGuard::edit when appropriate. The
state is cleared immediately before calling EditGuard::edit and also
in case a text is directly assigned (e.g. using Self::set_string).
When set, the input field’s background is drawn red. If a message is supplied, then a tooltip will be available on mouse-hover.
Trait Implementations§
Source§impl<G: EditGuard> Events for EditField<G>
impl<G: EditGuard> Events for EditField<G>
Source§const REDRAW_ON_MOUSE_OVER: bool = true
const REDRAW_ON_MOUSE_OVER: bool = true
Source§fn mouse_over_icon(&self) -> Option<CursorIcon>
fn mouse_over_icon(&self) -> Option<CursorIcon>
Source§fn update(&mut self, cx: &mut ConfigCx<'_>, data: &G::Data)
fn update(&mut self, cx: &mut ConfigCx<'_>, data: &G::Data)
Source§fn handle_event(
&mut self,
cx: &mut EventCx<'_>,
data: &G::Data,
event: Event<'_>,
) -> IsUsed
fn handle_event( &mut self, cx: &mut EventCx<'_>, data: &G::Data, event: Event<'_>, ) -> IsUsed
Source§fn handle_messages(&mut self, cx: &mut EventCx<'_>, data: &G::Data)
fn handle_messages(&mut self, cx: &mut EventCx<'_>, data: &G::Data)
Source§fn post_configure(&mut self, cx: &mut ConfigCx<'_>)
fn post_configure(&mut self, cx: &mut ConfigCx<'_>)
Source§fn recurse_indices(&self) -> ChildIndices
fn recurse_indices(&self) -> ChildIndices
Source§fn handle_mouse_over(&mut self, cx: &mut EventCx<'_>, state: bool)
fn handle_mouse_over(&mut self, cx: &mut EventCx<'_>, state: bool)
Source§fn handle_resize(
&mut self,
cx: &mut ConfigCx<'_>,
data: &Self::Data,
) -> Option<ActionResize>
fn handle_resize( &mut self, cx: &mut ConfigCx<'_>, data: &Self::Data, ) -> Option<ActionResize>
Source§impl<G: EditGuard> Layout for EditField<G>
impl<G: EditGuard> Layout for EditField<G>
Source§impl<G: EditGuard> Tile for EditField<G>
impl<G: EditGuard> Tile for EditField<G>
Source§fn get_child(&self, index: usize) -> Option<&dyn Tile>
fn get_child(&self, index: usize) -> Option<&dyn Tile>
dyn Tile, if available Read moreSource§fn child_indices(&self) -> ChildIndices
fn child_indices(&self) -> ChildIndices
Source§fn role_child_properties(&self, cx: &mut dyn RoleCx, index: usize)
fn role_child_properties(&self, cx: &mut dyn RoleCx, index: usize)
index Read moreSource§impl<G: EditGuard> Viewport for EditField<G>
impl<G: EditGuard> Viewport for EditField<G>
Source§fn content_size(&self) -> Size
fn content_size(&self) -> Size
Source§fn draw_with_offset(&self, draw: DrawCx<'_>, rect: Rect, offset: Offset)
fn draw_with_offset(&self, draw: DrawCx<'_>, rect: Rect, offset: Offset)
Auto Trait Implementations§
impl<G> Freeze for EditField<G>where
G: Freeze,
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 Wwhere
W: Widget,
impl<W> AdaptWidget for Wwhere
W: Widget,
Source§fn pack(self, hints: AlignHints) -> Pack<Self>
fn pack(self, hints: AlignHints) -> Pack<Self>
Source§fn with_stretch(
self,
horiz: impl Into<Option<Stretch>>,
vert: impl Into<Option<Stretch>>,
) -> WithStretch<Self>
fn with_stretch( self, horiz: impl Into<Option<Stretch>>, vert: impl Into<Option<Stretch>>, ) -> WithStretch<Self>
Source§fn with_margin_style(self, style: MarginStyle) -> WithMarginStyle<Self>
fn with_margin_style(self, style: MarginStyle) -> WithMarginStyle<Self>
Source§fn on_configure<F>(self, f: F) -> AdaptEvents<Self>where
F: Fn(&mut AdaptConfigCx<'_, '_>, &mut Self) + 'static,
fn on_configure<F>(self, f: F) -> AdaptEvents<Self>where
F: Fn(&mut AdaptConfigCx<'_, '_>, &mut Self) + 'static,
Events::configure Read moreSource§fn on_update<F>(self, f: F) -> AdaptEvents<Self>
fn on_update<F>(self, f: F) -> AdaptEvents<Self>
Events::update Read moreSource§fn on_message<M, H>(self, handler: H) -> AdaptEvents<Self>
fn on_message<M, H>(self, handler: H) -> AdaptEvents<Self>
M Read moreSource§fn map_message<M, N, H>(self, handler: H) -> AdaptEvents<Self>
fn map_message<M, N, H>(self, handler: H) -> AdaptEvents<Self>
Source§fn on_messages<H>(self, handler: H) -> AdaptEvents<Self>
fn on_messages<H>(self, handler: H) -> AdaptEvents<Self>
Source§fn with_min_size_px(self, w: i32, h: i32) -> Reserve<Self>
fn with_min_size_px(self, w: i32, h: i32) -> Reserve<Self>
Source§fn with_min_size_em(self, w: f32, h: f32) -> Reserve<Self>
fn with_min_size_em(self, w: f32, h: f32) -> Reserve<Self>
Source§fn with_label<D, T>(self, direction: D, label: T) -> WithLabel<Self, D>
fn with_label<D, T>(self, direction: D, label: T) -> WithLabel<Self, D>
Source§impl<W> AdaptWidgetAny for W
impl<W> AdaptWidgetAny for W
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<S, T> CastApprox<T> for Swhere
T: ConvApprox<S>,
impl<S, T> CastApprox<T> for Swhere
T: ConvApprox<S>,
Source§fn try_cast_approx(self) -> Result<T, Error>
fn try_cast_approx(self) -> Result<T, Error>
Source§fn cast_approx(self) -> T
fn cast_approx(self) -> T
Source§impl<S, T> CastFloat<T> for Swhere
T: ConvFloat<S>,
impl<S, T> CastFloat<T> for Swhere
T: ConvFloat<S>,
Source§fn cast_trunc(self) -> T
fn cast_trunc(self) -> T
Source§fn cast_nearest(self) -> T
fn cast_nearest(self) -> T
Source§fn cast_floor(self) -> T
fn cast_floor(self) -> T
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> 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<W> TileExt for W
impl<W> TileExt for W
Source§fn is_configured(&self) -> bool
fn is_configured(&self) -> bool
Source§fn is_strict_ancestor_of(&self, id: &Id) -> bool
fn is_strict_ancestor_of(&self, id: &Id) -> bool
id is not self and is a descendant Read more