Enum kas_core::event::Command

source ·
pub enum Command {
Show 61 variants Escape, Activate, Enter, Space, Tab, ViewUp, ViewDown, Left, Right, Up, Down, WordLeft, WordRight, Home, End, DocHome, DocEnd, PageUp, PageDown, Snapshot, ScrollLock, Pause, Insert, Delete, DelBack, DelWord, DelWordBack, Deselect, SelectAll, Find, FindReplace, FindNext, FindPrev, Bold, Italic, Underline, Link, Cut, Copy, Paste, Undo, Redo, New, Open, Save, Print, NavNext, NavPrev, NavParent, NavDown, TabNew, TabNext, TabPrev, Help, Rename, Refresh, Spelling, Menu, Fullscreen, Close, Exit,
}
Expand description

Command input (Event::Command)

Command events are mostly produced as a result of OS-specific keyboard bindings; for example, Command::Copy is produced by pressing Command+C on MacOS or Ctrl+C on other platforms. See crate::event::config::Shortcuts for more on these bindings.

A Command event does not necessarily come from keyboard input; for example some menu widgets send Command::Activate to trigger an entry as a result of mouse input.

Most Command entries represent an action (such as Copy or FindNext) but some represent an important key whose action may be context-dependent (e.g. Escape, Space).

Variants§

§

Escape

Escape key

Each press of this key should somehow relax control. It is expected that widgets receiving this key repeatedly eventually (soon) have no more use for this themselves and return it via Response::Unused.

This is in some cases remapped to Command::Deselect.

§

Activate

Programmatic activation

A synthetic event to activate widgets. Consider matching Command::is_activate or using using Event::on_activate instead for generally applicable activation.

§

Enter

Return / enter key

This may insert a line-break or may activate something.

§

Space

Space bar key

§

Tab

Tab key

This key is used to insert (horizontal) tabulators as well as to navigate focus (in reverse when combined with Shift).

This is usually not sent to widgets but instead used for navigation.

§

ViewUp

Move view up without affecting selection

§

ViewDown

Move view down without affecting selection

§

Left

Move left

§

Right

Move right

§

Up

Move up

§

Down

Move down

§

WordLeft

Move left one word

§

WordRight

Move right one word

§

Home

Move to start (of the line)

§

End

Move to end (of the line)

§

DocHome

Move to start of the document

§

DocEnd

Move to end of the document

§

PageUp

Move up a page

§

PageDown

Move down a page

§

Snapshot

Capture a screenshot

§

ScrollLock

Lock output of screen

§

Pause

Pause key

§

Insert

Insert key

§

Delete

Delete forwards

§

DelBack

Delete backwards (Backspace key)

§

DelWord

Delete forwards one word

§

DelWordBack

Delete backwards one word

§

Deselect

Clear any selections

§

SelectAll

Select all contents

§

Find

Find (start)

§

FindReplace

Find and replace (start)

§

FindNext

Find next

§

FindPrev

Find previous

§

Bold

Make text bold

§

Italic

Make text italic

§

Underline

Underline text

Insert a link

§

Cut

Copy to clipboard and clear

§

Copy

Copy to clipboard

§

Paste

Copy from clipboard

§

Undo

Undo the last action

§

Redo

Redo the last undone action

§

New

New document

§

Open

Open document

§

Save

Save document

§

Print

Print document

§

NavNext

Navigate forwards one page/item

§

NavPrev

Navigate backwards one page/item

§

NavParent

Navigate to the parent item

May be used to browse “up” to a parent directory.

§

NavDown

Navigate “down”

This is an opposite to NavParent, and will mostly not be used.

§

TabNew

Open a new tab

§

TabNext

Navigate to next tab

§

TabPrev

Navigate to previous tab

§

Help

Show help

§

Rename

Rename

§

Refresh

Refresh

§

Spelling

Spell-check tool

§

Menu

Open the menu / activate the menubar

§

Fullscreen

Make view fullscreen

§

Close

Close window/tab/popup

§

Exit

Exit program (e.g. Ctrl+Q)

Implementations§

Try constructing from a VirtualKeyCode

Examples found in repository?
src/event/config/shortcuts.rs (line 214)
207
208
209
210
211
212
213
214
215
216
217
    pub fn get(&self, mut modifiers: ModifiersState, vkey: VirtualKeyCode) -> Option<Command> {
        if let Some(result) = self.map.get(&modifiers).and_then(|m| m.get(&vkey)) {
            return Some(*result);
        }
        modifiers.remove(ModifiersState::SHIFT);
        if modifiers.is_empty() {
            // These keys get matched with and without Shift:
            return Command::new(vkey);
        }
        None
    }

True for “activation” commands

This matches:

Examples found in repository?
src/event/events.rs (line 259)
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
    pub fn on_activate<F: FnOnce(&mut EventMgr) -> Response>(
        self,
        mgr: &mut EventMgr,
        id: WidgetId,
        f: F,
    ) -> Response {
        match self {
            Event::Command(cmd) if cmd.is_activate() => f(mgr),
            Event::PressStart { source, coord, .. } if source.is_primary() => {
                mgr.grab_press(id, source, coord, GrabMode::Grab, None);
                Response::Used
            }
            Event::PressMove { source, cur_id, .. } => {
                let target = if id == cur_id { cur_id } else { None };
                mgr.set_grab_depress(source, target);
                Response::Used
            }
            Event::PressEnd {
                end_id, success, ..
            } if success && id == end_id => f(mgr),
            Event::PressEnd { .. } => Response::Used,
            _ => Response::Unused,
        }
    }

Convert to selection-focus command

Certain limited commands may be sent to widgets with selection focus but not character or navigation focus.

Examples found in repository?
src/event/manager.rs (line 477)
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
    fn start_key_event(&mut self, widget: &mut dyn Widget, vkey: VirtualKeyCode, scancode: u32) {
        log::trace!(
            "start_key_event: widget={}, vkey={vkey:?}, scancode={scancode}",
            widget.id()
        );

        use VirtualKeyCode as VK;

        let opt_command = self.config.shortcuts(|s| s.get(self.modifiers, vkey));

        if let Some(cmd) = opt_command {
            let mut targets = vec![];
            let mut send = |_self: &mut Self, id: WidgetId, cmd| -> bool {
                if !targets.contains(&id) {
                    let used = _self.send_event(widget, id.clone(), Event::Command(cmd));
                    if used {
                        _self.add_key_depress(scancode, id.clone());
                    }
                    targets.push(id);
                    used
                } else {
                    false
                }
            };

            if self.char_focus || cmd.suitable_for_sel_focus() {
                if let Some(id) = self.sel_focus.clone() {
                    if send(self, id, cmd) {
                        return;
                    }
                }
            }

            if !self.modifiers.alt() {
                if let Some(id) = self.nav_focus.clone() {
                    if send(self, id, cmd) {
                        return;
                    }
                }
            }

            if let Some(id) = self.popups.last().map(|popup| popup.1.parent.clone()) {
                if send(self, id, cmd) {
                    return;
                }
            }

            if let Some(id) = self.nav_fallback.clone() {
                if send(self, id, cmd) {
                    return;
                }
            }
        }

        // Next priority goes to accelerator keys when Alt is held or alt_bypass is true
        let mut target = None;
        let mut n = 0;
        for (i, id) in (self.popups.iter().rev())
            .map(|(_, popup, _)| popup.parent.clone())
            .chain(std::iter::once(widget.id()))
            .enumerate()
        {
            if let Some(layer) = self.accel_layers.get(&id) {
                // but only when Alt is held or alt-bypass is enabled:
                if self.modifiers == ModifiersState::ALT
                    || layer.0 && self.modifiers == ModifiersState::empty()
                {
                    if let Some(id) = layer.1.get(&vkey).cloned() {
                        target = Some(id);
                        n = i;
                        break;
                    }
                }
            }
        }

        // If we found a key binding below the top layer, we should close everything above
        if n > 0 {
            let len = self.popups.len();
            for i in ((len - n)..len).rev() {
                let id = self.popups[i].0;
                self.close_window(id, false);
            }
        }

        if let Some(id) = target {
            if widget
                .find_widget(&id)
                .map(|w| w.navigable())
                .unwrap_or(false)
            {
                self.set_nav_focus(id.clone(), true);
            }
            self.add_key_depress(scancode, id.clone());
            self.send_event(widget, id, Event::Command(Command::Activate));
        } else if self.config.nav_focus && vkey == VK::Tab {
            self.clear_char_focus();
            let shift = self.modifiers.shift();
            self.next_nav_focus(widget, shift, true);
        } else if vkey == VK::Escape {
            if let Some(id) = self.popups.last().map(|(id, _, _)| *id) {
                self.close_window(id, true);
            }
        }
    }

Convert arrow keys to a direction

Trait Implementations§

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Deserialize this value from the given Serde deserializer. Read more
Feeds this value into the given Hasher. Read more
Feeds a slice of this type into the given Hasher. Read more
This method tests for self and other values to be equal, and is used by ==.
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more
Cast from Self to T Read more
Try converting from Self to T Read more
Try approximate conversion from Self to T Read more
Cast approximately from Self to T Read more
Cast to integer, truncating Read more
Cast to the nearest integer Read more
Cast the floor to an integer Read more
Cast the ceiling to an integer Read more
Try converting to integer with truncation Read more
Try converting to the nearest integer Read more
Try converting the floor to an integer Read more
Try convert the ceiling to an integer Read more
Compare self to key and return true if they are equal.

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.