pub enum EditCommand {
Copy,
Cut,
Paste(String),
SelectAll,
}Expand description
The clipboard/selection vocabulary an editable widget matches on —
InputEvent::EditCommand carries one of these four verbs, already
decoded from whatever chord, hardware key or edit-menu tap produced it.
A widget answers copy/cut through
EventCtx::write_clipboard and
asks for a paste through
EventCtx::request_paste; the shell
owns the host clipboard at both ends. Also re-exported flat as
frust::EditCommand, for the same reason
CursorIcon is: a design system’s public API can name a verb without
authoring a widget.
A semantic clipboard / selection command delivered to the focused editable.
The decoded form of a platform gesture, not the gesture itself: a shell
resolves Cmd+C / Ctrl+C / NamedKey::Copy / Ctrl+Insert / an Android
ACTION_PROCESS_TEXT / an iOS edit-menu tap into one of these variants and
dispatches it as InputEvent::EditCommand, so no widget has to know which
chord means copy on which OS. Every widget sees the same four verbs.
§Why paste carries its text and copy does not
The clipboard itself lives in the shell (only the shell has a host clipboard to talk to), and the two directions are deliberately asymmetric:
Copy/Cutcarry nothing — the widget owns the selection, so it answers by writing its own text into the pass’s clipboard slot (EventCtx::write_clipboard), which the shell drains and hands to the host.Pastecarries the text — the shell owns the host clipboard, so by the time the command reaches the tree the read has already happened. A widget that wants a paste it did not receive asks for one (EventCtx::request_paste) and the shell answers with this variant.
§Refusal is the widget’s call
Nothing here is a permission: a read-only or secret field is free to ignore
a Copy/Cut it does not want to
honour, and a widget with no selection simply reports
EventResult::Ignored. The vocabulary states what was asked for.
Exhaustive on purpose (no #[non_exhaustive]): these four verbs are the
whole clipboard contract, and a widget matching on them should be told by
the compiler if that ever stops being true.
Variants§
Copy
Copy the current selection to the host clipboard, leaving the document
unchanged. A widget answers by calling EventCtx::write_clipboard.
Cut
Copy the current selection and delete it. A widget answers by calling
EventCtx::write_clipboard and mutating its own text — the shell
sees one clipboard write either way (see that method’s last-writer rule).
Paste(String)
Replace the current selection with this text (insert it at the caret when there is no selection). Already read from the host clipboard by the shell.
SelectAll
Select the widget’s entire content — the selection half of this vocabulary, carried here because it arrives through the same platform chords and edit menus as the other three.
Trait Implementations§
Source§impl Clone for EditCommand
impl Clone for EditCommand
Source§fn clone(&self) -> EditCommand
fn clone(&self) -> EditCommand
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for EditCommand
impl Debug for EditCommand
Source§fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>
Hand-written so pasted text never reaches a log.
ImeState’s reason, one step earlier in the pipeline (see its Debug):
a paste payload is arbitrary host-clipboard content — a password manager’s
fill, a copied token, a recovery phrase — and unlike an IME surface there
is no content-type hint to key the decision off, because the clipboard
has no owner to state one. So the payload is unconditionally replaced by
<redacted> (no length, which would itself leak), and the variant name
still prints so a trace stays readable.
impl Eq for EditCommand
Source§impl PartialEq for EditCommand
impl PartialEq for EditCommand
impl StructuralPartialEq for EditCommand
Auto Trait Implementations§
impl Freeze for EditCommand
impl RefUnwindSafe for EditCommand
impl Send for EditCommand
impl Sync for EditCommand
impl Unpin for EditCommand
impl UnsafeUnpin for EditCommand
impl UnwindSafe for EditCommand
Blanket Implementations§
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.