Skip to main content

EditCommand

Enum EditCommand 

Source
pub enum EditCommand {
    Copy,
    Cut,
    Paste(String),
    SelectAll,
}
Expand description

The clipboard/selection command vocabulary, flat-re-exported from frust-core::event (and also available through authoring::EditCommand).

InputEvent::EditCommand delivers one of EditCommand::Copy, EditCommand::Cut, EditCommand::Paste or EditCommand::SelectAll down the focus chain, already decoded by the shell from the platform’s own gesture — Cmd+C on macOS, Ctrl+C or Ctrl+Insert elsewhere, a hardware clipboard key, an Android ACTION_PROCESS_TEXT, an iOS edit-menu tap — so app and design-system code never decodes a chord itself.

Lifted flat rather than left inside authoring for CursorIcon’s reason: a design system’s own context menu or toolbar builder names these verbs in its public API without being a widget author. Paste carries its text because the shell has already read the host clipboard; its Debug redacts that text, since a paste payload can be a password or a token. 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 / Cut carry 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.
  • Paste carries 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

Source§

fn clone(&self) -> EditCommand

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for EditCommand

Source§

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.

Source§

impl Eq for EditCommand

Source§

impl PartialEq for EditCommand

Source§

fn eq(&self, other: &EditCommand) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for EditCommand

Auto Trait Implementations§

Blanket Implementations§

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

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

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

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

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

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

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

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> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<T> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
Source§

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

Source§

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>,

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

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

Source§

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

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

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