Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 48 additions & 30 deletions core/src/display_object/edit_text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2314,7 +2314,9 @@ impl<'gc> TInteractiveObject<'gc> for EditText<'gc> {
event: ClipEvent,
) -> ClipEventResult {
match event {
ClipEvent::Press | ClipEvent::MouseWheel { .. } => ClipEventResult::Handled,
ClipEvent::Press | ClipEvent::MouseWheel { .. } | ClipEvent::MouseMove => {
ClipEventResult::Handled
}
_ => ClipEventResult::NotHandled,
}
}
Expand All @@ -2339,44 +2341,60 @@ impl<'gc> TInteractiveObject<'gc> for EditText<'gc> {
return ClipEventResult::Handled;
}

if self.is_editable() || self.is_selectable() {
let tracker = context.focus_tracker;
tracker.set(Some(self.into()), context);
}
if let ClipEvent::Press = event {
if self.is_editable() || self.is_selectable() {
let tracker = context.focus_tracker;
tracker.set(Some(self.into()), context);
}

// We can't hold self as any link may end up modifying this object, so pull the info out
let mut link_to_open = None;
// We can't hold self as any link may end up modifying this object, so pull the info out
let mut link_to_open = None;

if let Some(position) = self.screen_position_to_index(*context.mouse_position) {
self.set_selection(Some(TextSelection::for_position(position)), context.gc());
if let Some(position) = self.screen_position_to_index(*context.mouse_position) {
self.set_selection(Some(TextSelection::for_position(position)), context.gc());

if let Some((span_index, _)) =
self.0.read().text_spans.resolve_position_as_span(position)
{
link_to_open = self
.0
.read()
.text_spans
.span(span_index)
.map(|s| (s.url.clone(), s.target.clone()));
if let Some((span_index, _)) =
self.0.read().text_spans.resolve_position_as_span(position)
{
link_to_open = self
.0
.read()
.text_spans
.span(span_index)
.map(|s| (s.url.clone(), s.target.clone()));
}
} else {
self.set_selection(
Some(TextSelection::for_position(self.text_length())),
context.gc(),
);
}
} else {
self.set_selection(
Some(TextSelection::for_position(self.text_length())),
context.gc(),
);

if let Some((url, target)) = link_to_open {
if !url.is_empty() {
// TODO: This fires on mouse DOWN but it should be mouse UP...
// but only if it went down in the same span.
// Needs more advanced focus handling than we have at time of writing this comment.
self.open_url(context, &url, &target);
}
}

return ClipEventResult::Handled;
}

if let Some((url, target)) = link_to_open {
if !url.is_empty() {
// TODO: This fires on mouse DOWN but it should be mouse UP...
// but only if it went down in the same span.
// Needs more advanced focus handling than we have at time of writing this comment.
self.open_url(context, &url, &target);
if let ClipEvent::MouseMove = event {
// If a mouse has moved and this EditTest is pressed, we need to update the selection.
if InteractiveObject::option_ptr_eq(context.mouse_data.pressed, self.as_interactive()) {
if let Some(mut selection) = self.selection() {
if let Some(position) = self.screen_position_to_index(*context.mouse_position) {
selection.to = position;
self.set_selection(Some(selection), context.gc());
}
}
}
}

ClipEventResult::Handled
ClipEventResult::NotHandled
}

fn mouse_pick_avm1(
Expand Down
19 changes: 19 additions & 0 deletions tests/tests/swfs/avm1/edittext_drag_select/input.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[
{ "type": "MouseMove", "pos": [234,166] },
{ "type": "MouseDown", "pos": [234,166], "btn": "Left" },
{ "type": "MouseMove", "pos": [511,189] },
{ "type": "MouseMove", "pos": [511,189] },
{ "type": "MouseUp", "pos": [511,189], "btn": "Left" },

{ "type": "MouseMove", "pos": [343,166] },
{ "type": "MouseDown", "pos": [343,166], "btn": "Left" },
{ "type": "MouseMove", "pos": [764,523] },
{ "type": "MouseMove", "pos": [764,523] },
{ "type": "MouseUp", "pos": [764,523], "btn": "Left" },

{ "type": "MouseMove", "pos": [207,163] },
{ "type": "MouseDown", "pos": [207,163], "btn": "Left" },
{ "type": "MouseMove", "pos": [7,13] },
{ "type": "MouseMove", "pos": [7,13] },
{ "type": "MouseUp", "pos": [7,13], "btn": "Left" }
]
9 changes: 9 additions & 0 deletions tests/tests/swfs/avm1/edittext_drag_select/output.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Mouse down: 234,166
Mouse up: 511,189
Text: Lore<selection>etus.
Mouse down: 343,166
Mouse up: 764,523
Text: Lore<selection>etu<selection>
Mouse down: 207,163
Mouse up: 7,13
Text: <selection>ore<selection>etu<selection>
11 changes: 11 additions & 0 deletions tests/tests/swfs/avm1/edittext_drag_select/test.as
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
var listener = new Object();
listener.onMouseDown = function() {
trace("Mouse down: " + _root._xmouse + "," + _root._ymouse)
};
listener.onMouseUp = function() {
trace("Mouse up: " + _root._xmouse + "," + _root._ymouse)
text.replaceSel("<selection>");
trace("Text: " + text.text.split("\r").join("\\n").split("\n").join("\\n"));
};
Key.addListener(listener);
Mouse.addListener(listener);
Binary file not shown.
1 change: 1 addition & 0 deletions tests/tests/swfs/avm1/edittext_drag_select/test.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
num_ticks = 1