Add Command + ArrowLeft/Right input behavior for macos
This commit is contained in:
parent
12f4b875cf
commit
bd48946b02
2 changed files with 92 additions and 26 deletions
|
|
@ -767,7 +767,7 @@ impl Update {
|
|||
}
|
||||
|
||||
if let keyboard::Key::Named(named_key) = key.as_ref() {
|
||||
if let Some(motion) = motion(named_key) {
|
||||
if let Some(motion) = motion(named_key, modifiers) {
|
||||
let motion = if platform::is_jump_modifier_pressed(
|
||||
modifiers,
|
||||
) {
|
||||
|
|
@ -793,14 +793,26 @@ impl Update {
|
|||
}
|
||||
}
|
||||
|
||||
fn motion(key: key::Named) -> Option<Motion> {
|
||||
fn motion(key: key::Named, modifiers: keyboard::Modifiers) -> Option<Motion> {
|
||||
match key {
|
||||
key::Named::ArrowLeft => Some(Motion::Left),
|
||||
key::Named::ArrowRight => Some(Motion::Right),
|
||||
key::Named::ArrowUp => Some(Motion::Up),
|
||||
key::Named::ArrowDown => Some(Motion::Down),
|
||||
key::Named::Home => Some(Motion::Home),
|
||||
key::Named::End => Some(Motion::End),
|
||||
key::Named::ArrowLeft => {
|
||||
if platform::is_macos_command_pressed(modifiers) {
|
||||
Some(Motion::Home)
|
||||
} else {
|
||||
Some(Motion::Left)
|
||||
}
|
||||
}
|
||||
key::Named::ArrowRight => {
|
||||
if platform::is_macos_command_pressed(modifiers) {
|
||||
Some(Motion::End)
|
||||
} else {
|
||||
Some(Motion::Right)
|
||||
}
|
||||
}
|
||||
key::Named::ArrowUp => Some(Motion::Up),
|
||||
key::Named::ArrowDown => Some(Motion::Down),
|
||||
key::Named::PageUp => Some(Motion::PageUp),
|
||||
key::Named::PageDown => Some(Motion::PageDown),
|
||||
_ => None,
|
||||
|
|
@ -817,6 +829,19 @@ mod platform {
|
|||
modifiers.control()
|
||||
}
|
||||
}
|
||||
|
||||
/// Whether the command key is pressed on a macOS device.
|
||||
///
|
||||
/// This is relevant for actions like ⌘ + ArrowLeft to move to the beginning of the
|
||||
/// line where the equivalent behavior for `modifiers.command()` is instead a jump on
|
||||
/// other platforms.
|
||||
pub fn is_macos_command_pressed(modifiers: keyboard::Modifiers) -> bool {
|
||||
if cfg!(target_os = "macos") {
|
||||
modifiers.logo()
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The possible status of a [`TextEditor`].
|
||||
|
|
|
|||
|
|
@ -876,6 +876,54 @@ where
|
|||
|
||||
update_cache(state, &self.value);
|
||||
}
|
||||
keyboard::Key::Named(key::Named::Home) => {
|
||||
if modifiers.shift() {
|
||||
state.cursor.select_range(
|
||||
state.cursor.start(&self.value),
|
||||
0,
|
||||
);
|
||||
} else {
|
||||
state.cursor.move_to(0);
|
||||
}
|
||||
}
|
||||
keyboard::Key::Named(key::Named::End) => {
|
||||
if modifiers.shift() {
|
||||
state.cursor.select_range(
|
||||
state.cursor.start(&self.value),
|
||||
self.value.len(),
|
||||
);
|
||||
} else {
|
||||
state.cursor.move_to(self.value.len());
|
||||
}
|
||||
}
|
||||
keyboard::Key::Named(key::Named::ArrowLeft)
|
||||
if platform::is_macos_command_pressed(
|
||||
modifiers,
|
||||
) =>
|
||||
{
|
||||
if modifiers.shift() {
|
||||
state.cursor.select_range(
|
||||
state.cursor.start(&self.value),
|
||||
0,
|
||||
);
|
||||
} else {
|
||||
state.cursor.move_to(0);
|
||||
}
|
||||
}
|
||||
keyboard::Key::Named(key::Named::ArrowRight)
|
||||
if platform::is_macos_command_pressed(
|
||||
modifiers,
|
||||
) =>
|
||||
{
|
||||
if modifiers.shift() {
|
||||
state.cursor.select_range(
|
||||
state.cursor.start(&self.value),
|
||||
self.value.len(),
|
||||
);
|
||||
} else {
|
||||
state.cursor.move_to(self.value.len());
|
||||
}
|
||||
}
|
||||
keyboard::Key::Named(key::Named::ArrowLeft) => {
|
||||
if platform::is_jump_modifier_pressed(modifiers)
|
||||
&& !self.is_secure
|
||||
|
|
@ -914,26 +962,6 @@ where
|
|||
state.cursor.move_right(&self.value);
|
||||
}
|
||||
}
|
||||
keyboard::Key::Named(key::Named::Home) => {
|
||||
if modifiers.shift() {
|
||||
state.cursor.select_range(
|
||||
state.cursor.start(&self.value),
|
||||
0,
|
||||
);
|
||||
} else {
|
||||
state.cursor.move_to(0);
|
||||
}
|
||||
}
|
||||
keyboard::Key::Named(key::Named::End) => {
|
||||
if modifiers.shift() {
|
||||
state.cursor.select_range(
|
||||
state.cursor.start(&self.value),
|
||||
self.value.len(),
|
||||
);
|
||||
} else {
|
||||
state.cursor.move_to(self.value.len());
|
||||
}
|
||||
}
|
||||
keyboard::Key::Named(key::Named::Escape) => {
|
||||
state.is_focused = None;
|
||||
state.is_dragging = false;
|
||||
|
|
@ -1291,6 +1319,19 @@ mod platform {
|
|||
modifiers.control()
|
||||
}
|
||||
}
|
||||
|
||||
/// Whether the command key is pressed on a macOS device.
|
||||
///
|
||||
/// This is relevant for actions like ⌘ + ArrowLeft to move to the beginning of the
|
||||
/// line where the equivalent behavior for `modifiers.command()` is instead a jump on
|
||||
/// other platforms.
|
||||
pub fn is_macos_command_pressed(modifiers: keyboard::Modifiers) -> bool {
|
||||
if cfg!(target_os = "macos") {
|
||||
modifiers.logo()
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn offset<P: text::Paragraph>(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue