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 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(
|
let motion = if platform::is_jump_modifier_pressed(
|
||||||
modifiers,
|
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 {
|
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::Home => Some(Motion::Home),
|
||||||
key::Named::End => Some(Motion::End),
|
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::PageUp => Some(Motion::PageUp),
|
||||||
key::Named::PageDown => Some(Motion::PageDown),
|
key::Named::PageDown => Some(Motion::PageDown),
|
||||||
_ => None,
|
_ => None,
|
||||||
|
|
@ -817,6 +829,19 @@ mod platform {
|
||||||
modifiers.control()
|
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`].
|
/// The possible status of a [`TextEditor`].
|
||||||
|
|
|
||||||
|
|
@ -876,6 +876,54 @@ where
|
||||||
|
|
||||||
update_cache(state, &self.value);
|
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) => {
|
keyboard::Key::Named(key::Named::ArrowLeft) => {
|
||||||
if platform::is_jump_modifier_pressed(modifiers)
|
if platform::is_jump_modifier_pressed(modifiers)
|
||||||
&& !self.is_secure
|
&& !self.is_secure
|
||||||
|
|
@ -914,26 +962,6 @@ where
|
||||||
state.cursor.move_right(&self.value);
|
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) => {
|
keyboard::Key::Named(key::Named::Escape) => {
|
||||||
state.is_focused = None;
|
state.is_focused = None;
|
||||||
state.is_dragging = false;
|
state.is_dragging = false;
|
||||||
|
|
@ -1291,6 +1319,19 @@ mod platform {
|
||||||
modifiers.control()
|
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>(
|
fn offset<P: text::Paragraph>(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue