avm2: Implement TextField.getFirstCharInParagraph
This commit is contained in:
parent
e9b8cfae1a
commit
670e5f9ac2
|
@ -153,10 +153,7 @@ package flash.text {
|
|||
return new Rectangle(0, 0, 1, 1);
|
||||
}
|
||||
|
||||
public function getFirstCharInParagraph(charIndex:int):int {
|
||||
stub_method("flash.text.TextField", "getFirstCharInParagraph");
|
||||
return 0;
|
||||
}
|
||||
public native function getFirstCharInParagraph(charIndex:int):int;
|
||||
|
||||
public function getImageReference(id:String):DisplayObject {
|
||||
stub_method("flash.text.TextField", "getImageReference");
|
||||
|
|
|
@ -1602,3 +1602,27 @@ pub fn get_line_index_at_point<'gc>(
|
|||
Ok(Value::Number(-1f64))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_first_char_in_paragraph<'gc>(
|
||||
activation: &mut Activation<'_, 'gc>,
|
||||
this: Object<'gc>,
|
||||
args: &[Value<'gc>],
|
||||
) -> Result<Value<'gc>, Error<'gc>> {
|
||||
let Some(this) = this
|
||||
.as_display_object()
|
||||
.and_then(|this| this.as_edit_text())
|
||||
else {
|
||||
return Ok(Value::Undefined);
|
||||
};
|
||||
|
||||
let char_index = args.get_i32(activation, 0)?;
|
||||
if char_index < 0 {
|
||||
return Ok((-1).into());
|
||||
}
|
||||
|
||||
Ok(this
|
||||
.paragraph_start_index_at(char_index as usize)
|
||||
.map(|i| i as i32)
|
||||
.unwrap_or(-1)
|
||||
.into())
|
||||
}
|
||||
|
|
|
@ -1950,6 +1950,21 @@ impl<'gc> EditText<'gc> {
|
|||
self.0.read().layout.find_line_index_by_position(index)
|
||||
}
|
||||
|
||||
pub fn paragraph_start_index_at(self, mut index: usize) -> Option<usize> {
|
||||
let text = self.text();
|
||||
|
||||
// Note that the index may equal the text length
|
||||
if index > text.len() {
|
||||
return None;
|
||||
}
|
||||
|
||||
while index > 0 && !string_utils::swf_is_newline(text.at(index - 1)) {
|
||||
index -= 1;
|
||||
}
|
||||
|
||||
Some(index)
|
||||
}
|
||||
|
||||
fn execute_avm1_asfunction(
|
||||
self,
|
||||
context: &mut UpdateContext<'_, 'gc>,
|
||||
|
|
Loading…
Reference in New Issue