avm2: Add EventObject::focus_event
This method allows constructing FocusEvents.
This commit is contained in:
parent
021de2bf91
commit
f79ab195be
|
@ -307,6 +307,38 @@ impl<'gc> EventObject<'gc> {
|
||||||
)
|
)
|
||||||
.unwrap() // we don't expect to break here
|
.unwrap() // we don't expect to break here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn focus_event<S>(
|
||||||
|
activation: &mut Activation<'_, 'gc>,
|
||||||
|
event_type: S,
|
||||||
|
cancelable: bool,
|
||||||
|
related_object: Option<InteractiveObject<'gc>>,
|
||||||
|
key_code: u8,
|
||||||
|
) -> Object<'gc>
|
||||||
|
where
|
||||||
|
S: Into<AvmString<'gc>>,
|
||||||
|
{
|
||||||
|
let event_type: AvmString<'gc> = event_type.into();
|
||||||
|
let shift_key = activation.context.input.is_key_down(KeyCode::Shift);
|
||||||
|
|
||||||
|
let class = activation.avm2().classes().focusevent;
|
||||||
|
class
|
||||||
|
.construct(
|
||||||
|
activation,
|
||||||
|
&[
|
||||||
|
event_type.into(),
|
||||||
|
true.into(),
|
||||||
|
cancelable.into(),
|
||||||
|
related_object
|
||||||
|
.map(|o| o.as_displayobject().object2())
|
||||||
|
.unwrap_or(Value::Null),
|
||||||
|
shift_key.into(),
|
||||||
|
key_code.into(),
|
||||||
|
"none".into(), // TODO implement direction
|
||||||
|
],
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'gc> TObject<'gc> for EventObject<'gc> {
|
impl<'gc> TObject<'gc> for EventObject<'gc> {
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
use crate::avm1::Avm1;
|
use crate::avm1::Avm1;
|
||||||
use crate::avm1::Value as Avm1Value;
|
use crate::avm1::Value as Avm1Value;
|
||||||
use crate::avm2::activation::Activation as Avm2Activation;
|
use crate::avm2::activation::Activation as Avm2Activation;
|
||||||
use crate::avm2::{
|
use crate::avm2::{Avm2, EventObject as Avm2EventObject, EventObject, Value as Avm2Value};
|
||||||
Avm2, EventObject as Avm2EventObject, TObject as Avm2TObject, Value as Avm2Value,
|
|
||||||
};
|
|
||||||
use crate::backend::ui::MouseCursor;
|
use crate::backend::ui::MouseCursor;
|
||||||
use crate::context::UpdateContext;
|
use crate::context::UpdateContext;
|
||||||
use crate::display_object::avm1_button::Avm1Button;
|
use crate::display_object::avm1_button::Avm1Button;
|
||||||
|
@ -582,9 +580,10 @@ pub trait TInteractiveObject<'gc>:
|
||||||
other: Option<InteractiveObject<'gc>>,
|
other: Option<InteractiveObject<'gc>>,
|
||||||
) {
|
) {
|
||||||
let self_do = self.as_displayobject();
|
let self_do = self.as_displayobject();
|
||||||
let other = other.map(|d| d.as_displayobject());
|
|
||||||
if let Avm1Value::Object(object) = self_do.object() {
|
if let Avm1Value::Object(object) = self_do.object() {
|
||||||
let other = other.map(|d| d.object()).unwrap_or(Avm1Value::Null);
|
let other = other
|
||||||
|
.map(|d| d.as_displayobject().object())
|
||||||
|
.unwrap_or(Avm1Value::Null);
|
||||||
let method_name = if focused {
|
let method_name = if focused {
|
||||||
"onSetFocus".into()
|
"onSetFocus".into()
|
||||||
} else {
|
} else {
|
||||||
|
@ -594,29 +593,14 @@ pub trait TInteractiveObject<'gc>:
|
||||||
} else if let Avm2Value::Object(object) = self_do.object2() {
|
} else if let Avm2Value::Object(object) = self_do.object2() {
|
||||||
let mut activation = Avm2Activation::from_nothing(context.reborrow());
|
let mut activation = Avm2Activation::from_nothing(context.reborrow());
|
||||||
let event_name = if focused {
|
let event_name = if focused {
|
||||||
"focusIn".into()
|
"focusIn"
|
||||||
} else {
|
} else {
|
||||||
// `focusOut` is not this simple in FP,
|
// `focusOut` is not this simple in FP,
|
||||||
// firing it might break SWFs that rely
|
// firing it might break SWFs that rely
|
||||||
// on the specific behavior
|
// on the specific behavior
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let event = activation
|
let event = EventObject::focus_event(&mut activation, event_name, false, other, 0);
|
||||||
.avm2()
|
|
||||||
.classes()
|
|
||||||
.focusevent
|
|
||||||
.construct(
|
|
||||||
&mut activation,
|
|
||||||
&[
|
|
||||||
event_name,
|
|
||||||
true.into(),
|
|
||||||
false.into(),
|
|
||||||
other.map(|o| o.object2()).unwrap_or(Avm2Value::Null),
|
|
||||||
// Rest of the properties are not yet implemented
|
|
||||||
],
|
|
||||||
)
|
|
||||||
.expect("Event should construct!");
|
|
||||||
|
|
||||||
Avm2::dispatch_event(&mut activation.context, event, object);
|
Avm2::dispatch_event(&mut activation.context, event, object);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue