From 9a9b1b87463a53f0ce330e5dc4666f0f15611f4b Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sun, 24 Oct 2021 15:19:53 +0200 Subject: [PATCH] On touch screens, prioritize drag-to-scroll over drag-to-select text On mobile, click first, then edit the text. Otherwise a lot of areas become difficult to scroll on mobile. --- egui/src/widgets/text_edit.rs | 38 ++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/egui/src/widgets/text_edit.rs b/egui/src/widgets/text_edit.rs index 35471c13..343c3b5e 100644 --- a/egui/src/widgets/text_edit.rs +++ b/egui/src/widgets/text_edit.rs @@ -591,8 +591,18 @@ impl<'t> TextEdit<'t> { }); let mut state = ui.memory().id_data.get_or_default::(id).clone(); + // On touch screens (e.g. mobile in egui_web), should + // dragging select text, or scroll the enclosing `ScrollArea` (if any)? + // Since currently copying selected text in not supported on `egui_web`, + // we prioritize touch-scrolling: + let allow_drag_to_select = !ui.input().any_touches() || ui.memory().has_focus(id); + let sense = if interactive { - Sense::click_and_drag() + if allow_drag_to_select { + Sense::click_and_drag() + } else { + Sense::click() + } } else { Sense::hover() }; @@ -630,20 +640,24 @@ impl<'t> TextEdit<'t> { primary: galley.from_ccursor(ccursorp.primary), secondary: galley.from_ccursor(ccursorp.secondary), }); - } else if response.hovered() && ui.input().pointer.any_pressed() { - ui.memory().request_focus(id); - if ui.input().modifiers.shift { - if let Some(cursorp) = &mut state.cursorp { - cursorp.primary = cursor_at_pointer; + } else if allow_drag_to_select { + if response.hovered() && ui.input().pointer.any_pressed() { + ui.memory().request_focus(id); + if ui.input().modifiers.shift { + if let Some(cursorp) = &mut state.cursorp { + cursorp.primary = cursor_at_pointer; + } else { + state.cursorp = Some(CursorPair::one(cursor_at_pointer)); + } } else { state.cursorp = Some(CursorPair::one(cursor_at_pointer)); } - } else { - state.cursorp = Some(CursorPair::one(cursor_at_pointer)); - } - } else if ui.input().pointer.any_down() && response.is_pointer_button_down_on() { - if let Some(cursorp) = &mut state.cursorp { - cursorp.primary = cursor_at_pointer; + } else if ui.input().pointer.any_down() && response.is_pointer_button_down_on() + { + // drag to select text: + if let Some(cursorp) = &mut state.cursorp { + cursorp.primary = cursor_at_pointer; + } } } }