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, where
Self::is_editable
. This triggers the action handlers
EditGuard::edit
followed by EditGuard::activate
.
Fields§
§guard: G
The associated EditGuard
implementation
Implementations§
Source§impl<G: EditGuard> EditField<G>
impl<G: EditGuard> EditField<G>
Sourcepub fn clone_string(&self) -> String
pub fn clone_string(&self) -> String
Get the text contents as a String
pub fn set_str(&mut self, cx: &mut EventState, text: &str)
Sourcepub fn set_string(&mut self, cx: &mut EventState, string: String)
pub fn set_string(&mut self, cx: &mut EventState, string: String)
Set text contents from a String
This method does not call action handlers on the EditGuard
.
Sourcepub fn replace_selection(&mut self, cx: &mut EventCx<'_>, text: &str)
pub fn replace_selection(&mut self, cx: &mut EventCx<'_>, text: &str)
Replace selected text
This method does not call action handlers on the EditGuard
.
Sourcepub fn typeset_size(&self) -> Size
pub fn typeset_size(&self) -> Size
Get the size of the type-set text
EditField
ensures text has no left or top overhang.
Sourcepub fn draw_with_offset(&self, draw: DrawCx<'_>, rect: Rect, offset: Offset)
pub fn draw_with_offset(&self, draw: DrawCx<'_>, rect: Rect, offset: Offset)
Draw with an offset
Draws at position self.rect() - offset
.
This may be called instead of Layout::draw
.
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 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 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 multi_line(&self) -> bool
pub fn multi_line(&self) -> bool
True if the editor uses multi-line mode
See also: Self::with_multi_line
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)
Sourcepub fn has_edit_focus(&self) -> bool
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.
Sourcepub fn set_error_state(&mut self, cx: &mut EventState, error_state: bool)
pub fn set_error_state(&mut self, cx: &mut EventState, error_state: bool)
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: 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 configure_recurse(&mut self, cx: &mut ConfigCx<'_>, data: &Self::Data)
fn configure_recurse(&mut self, cx: &mut ConfigCx<'_>, data: &Self::Data)
Source§fn update_recurse(&mut self, cx: &mut ConfigCx<'_>, data: &Self::Data)
fn update_recurse(&mut self, cx: &mut ConfigCx<'_>, data: &Self::Data)
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 moreAuto 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 margins(self, dirs: Directions, style: MarginStyle) -> Margins<Self>
fn margins(self, dirs: Directions, style: MarginStyle) -> Margins<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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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_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