summaryrefslogtreecommitdiffstats
path: root/widget/src
diff options
context:
space:
mode:
authorLibravatar BradySimon <bradytsimon@gmail.com>2024-03-08 09:35:43 -0500
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-05-31 16:11:33 +0200
commitbd48946b02268cb5a7ae932e388abfa75fe9e375 (patch)
tree7e7595cfb333b732ec26ff6934999eb977adf8e4 /widget/src
parent12f4b875cfb0eeb0bac5416921c6cec40edd420c (diff)
downloadiced-bd48946b02268cb5a7ae932e388abfa75fe9e375.tar.gz
iced-bd48946b02268cb5a7ae932e388abfa75fe9e375.tar.bz2
iced-bd48946b02268cb5a7ae932e388abfa75fe9e375.zip
Add Command + ArrowLeft/Right input behavior for macos
Diffstat (limited to 'widget/src')
-rw-r--r--widget/src/text_editor.rs37
-rw-r--r--widget/src/text_input.rs81
2 files changed, 92 insertions, 26 deletions
diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs
index 7c0b98ea..3b6647e4 100644
--- a/widget/src/text_editor.rs
+++ b/widget/src/text_editor.rs
@@ -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`].
diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs
index e9f07838..2c951c12 100644
--- a/widget/src/text_input.rs
+++ b/widget/src/text_input.rs
@@ -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>(