Struct kas_widgets::edit::EditField
source · pub struct EditField<G: EditGuard = ()> {
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.
It does not draw any background (even to indicate an error state) or
borders (even to indicate focus), thus usually it is better to use a
derived type like 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 EditField<()>
impl EditField<()>
sourcepub fn with_guard<G: EditGuard>(self, guard: G) -> EditField<G>
pub fn with_guard<G: EditGuard>(self, guard: G) -> EditField<G>
Set an EditGuard
Technically, this consumes self
and reconstructs another EditField
with a different parameterisation.
This method calls EditGuard::update
after applying guard
to self
and discards any message emitted.
sourcepub fn on_activate<F: FnMut(&mut EventMgr<'_>, &str) -> Response + 'static>(
self,
f: F
) -> EditField<GuardActivate<F>>
pub fn on_activate<F: FnMut(&mut EventMgr<'_>, &str) -> Response + 'static>( self, f: F ) -> EditField<GuardActivate<F>>
Set a guard function, called on activation
The closure f
is called when the EditField
is activated (when the
“enter” key is pressed).
This method is a parametisation of EditField::with_guard
. Any guard
previously assigned to the EditField
will be replaced.
sourcepub fn on_afl<F: FnMut(&mut EventMgr<'_>, &str) + 'static>(
self,
f: F
) -> EditField<GuardAFL<F>>
pub fn on_afl<F: FnMut(&mut EventMgr<'_>, &str) + 'static>( self, f: F ) -> EditField<GuardAFL<F>>
Set a guard function, called on activation and input-focus lost
The closure f
is called when the EditField
is activated (when the
“enter” key is pressed) and when keyboard focus is lost.
This method is a parametisation of EditField::with_guard
. Any guard
previously assigned to the EditField
will be replaced.
sourcepub fn on_edit<F: FnMut(&mut EventMgr<'_>, &str) + 'static>(
self,
f: F
) -> EditField<GuardEdit<F>>
pub fn on_edit<F: FnMut(&mut EventMgr<'_>, &str) + 'static>( self, f: F ) -> EditField<GuardEdit<F>>
Set a guard function, called on edit
The closure f
is called when the EditField
is edited by the user.
This method is a parametisation of EditField::with_guard
. Any guard
previously assigned to the EditField
will be replaced.
sourcepub fn on_update<F: FnMut(&str) + 'static>(
self,
f: F
) -> EditField<GuardUpdate<F>>
pub fn on_update<F: FnMut(&str) + 'static>( self, f: F ) -> EditField<GuardUpdate<F>>
Set a guard function, called on update
The closure f
is called when the EditField
is updated (by the user or
programmatically). It is also called immediately by this method.
This method is a parametisation of EditField::with_guard
. Any guard
previously assigned to the EditField
will be replaced.
source§impl<G: EditGuard> EditField<G>
impl<G: EditGuard> EditField<G>
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: i32, ideal_lines: i32) -> Self
pub fn with_lines(self, min_lines: i32, ideal_lines: i32) -> 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_key_focus(&self) -> bool
pub fn has_key_focus(&self) -> bool
Get whether the widget currently has keyboard input focus
sourcepub fn set_error_state(&mut self, error_state: bool)
pub fn set_error_state(&mut self, error_state: bool)
Set the error state
When true, the input field’s background is drawn red.
Trait Implementations§
source§impl<G: EditGuard> Layout for EditField<G>
impl<G: EditGuard> Layout for EditField<G>
source§impl<G: EditGuard> Scrollable for EditField<G>
impl<G: EditGuard> Scrollable for EditField<G>
source§impl<G: EditGuard> Widget for EditField<G>
impl<G: EditGuard> Widget for EditField<G>
source§fn translation(&self) -> Offset
fn translation(&self) -> Offset
source§fn steal_event(
&mut self,
mgr: &mut EventMgr<'_>,
id: &WidgetId,
event: &Event
) -> Response
fn steal_event( &mut self, mgr: &mut EventMgr<'_>, id: &WidgetId, event: &Event ) -> Response
source§fn handle_unused(&mut self, mgr: &mut EventMgr<'_>, event: Event) -> Response
fn handle_unused(&mut self, mgr: &mut EventMgr<'_>, event: Event) -> Response
index
but left unhandled Read moresource§fn handle_message(&mut self, mgr: &mut EventMgr<'_>)
fn handle_message(&mut self, mgr: &mut EventMgr<'_>)
source§impl<G: EditGuard> WidgetChildren for EditField<G>
impl<G: EditGuard> WidgetChildren for EditField<G>
source§fn num_children(&self) -> usize
fn num_children(&self) -> usize
source§fn get_child(&self, _index: usize) -> Option<&dyn Widget>
fn get_child(&self, _index: usize) -> Option<&dyn Widget>
None
if the index is
out of bounds. Read moresource§fn get_child_mut(&mut self, _index: usize) -> Option<&mut dyn Widget>
fn get_child_mut(&mut self, _index: usize) -> Option<&mut dyn Widget>
source§impl<G: EditGuard> WidgetCore for EditField<G>
impl<G: EditGuard> WidgetCore for EditField<G>
source§fn widget_name(&self) -> &'static str
fn widget_name(&self) -> &'static str
source§fn as_widget_mut(&mut self) -> &mut dyn Widget
fn as_widget_mut(&mut self) -> &mut dyn Widget
Auto Trait Implementations§
impl<G> RefUnwindSafe for EditField<G>where G: RefUnwindSafe,
impl<G = ()> !Send for EditField<G>
impl<G = ()> !Sync for EditField<G>
impl<G> Unpin for EditField<G>where G: Unpin,
impl<G> UnwindSafe for EditField<G>where G: UnwindSafe,
Blanket Implementations§
§impl<S, T> Cast<T> for Swhere
T: Conv<S>,
impl<S, T> Cast<T> for Swhere T: Conv<S>,
§impl<S, T> CastApprox<T> for Swhere
T: ConvApprox<S>,
impl<S, T> CastApprox<T> for Swhere T: ConvApprox<S>,
§fn try_cast_approx(self) -> Result<T, Error>
fn try_cast_approx(self) -> Result<T, Error>
§fn cast_approx(self) -> T
fn cast_approx(self) -> T
§impl<S, T> CastFloat<T> for Swhere
T: ConvFloat<S>,
impl<S, T> CastFloat<T> for Swhere T: ConvFloat<S>,
§fn cast_trunc(self) -> T
fn cast_trunc(self) -> T
§fn cast_nearest(self) -> T
fn cast_nearest(self) -> T
§fn cast_floor(self) -> T
fn cast_floor(self) -> T
§fn try_cast_trunc(self) -> Result<T, Error>
fn try_cast_trunc(self) -> Result<T, Error>
§fn try_cast_nearest(self) -> Result<T, Error>
fn try_cast_nearest(self) -> Result<T, Error>
§fn try_cast_floor(self) -> Result<T, Error>
fn try_cast_floor(self) -> Result<T, Error>
§fn try_cast_ceil(self) -> Result<T, Error>
fn try_cast_ceil(self) -> Result<T, Error>
source§impl<W> WidgetExt for Wwhere
W: Widget + ?Sized,
impl<W> WidgetExt for Wwhere W: Widget + ?Sized,
source§fn eq_id<T>(&self, rhs: T) -> boolwhere
WidgetId: PartialEq<T>,
fn eq_id<T>(&self, rhs: T) -> boolwhere WidgetId: PartialEq<T>,
source§fn identify(&self) -> IdentifyWidget
fn identify(&self) -> IdentifyWidget
source§fn is_ancestor_of(&self, id: &WidgetId) -> bool
fn is_ancestor_of(&self, id: &WidgetId) -> bool
id
is self or a descendant Read moresource§fn is_strict_ancestor_of(&self, id: &WidgetId) -> bool
fn is_strict_ancestor_of(&self, id: &WidgetId) -> bool
id
is not self and is a descendant Read more