avm2: Implement TextField.getParagraphLength
This commit is contained in:
parent
670e5f9ac2
commit
fe82a23b61
|
@ -164,10 +164,7 @@ package flash.text {
|
|||
|
||||
public native function getLineIndexOfChar(charIndex:int):int;
|
||||
|
||||
public function getParagraphLength(charIndex:int):int {
|
||||
stub_method("flash.text.TextField", "getParagraphLength");
|
||||
return 0;
|
||||
}
|
||||
public native function getParagraphLength(charIndex:int):int;
|
||||
|
||||
public static function isFontCompatible(fontName:String, fontStyle:String):Boolean {
|
||||
stub_method("flash.text.TextField", "isFontCompatible");
|
||||
|
|
|
@ -1626,3 +1626,27 @@ pub fn get_first_char_in_paragraph<'gc>(
|
|||
.unwrap_or(-1)
|
||||
.into())
|
||||
}
|
||||
|
||||
pub fn get_paragraph_length<'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_length_at(char_index as usize)
|
||||
.map(|i| i as i32)
|
||||
.unwrap_or(-1)
|
||||
.into())
|
||||
}
|
||||
|
|
|
@ -1965,6 +1965,30 @@ impl<'gc> EditText<'gc> {
|
|||
Some(index)
|
||||
}
|
||||
|
||||
pub fn paragraph_length_at(self, mut index: usize) -> Option<usize> {
|
||||
let start_index = self.paragraph_start_index_at(index)?;
|
||||
let text = self.text();
|
||||
let length = text.len();
|
||||
|
||||
// When the index is equal to the text length,
|
||||
// FP simulates a character at that point and returns
|
||||
// the length of the last paragraph plus one.
|
||||
if index == length {
|
||||
return Some(1 + length - start_index);
|
||||
}
|
||||
|
||||
while index < length && !string_utils::swf_is_newline(text.at(index)) {
|
||||
index += 1;
|
||||
}
|
||||
|
||||
// The trailing newline also counts to the length
|
||||
if index < length && string_utils::swf_is_newline(text.at(index)) {
|
||||
index += 1;
|
||||
}
|
||||
|
||||
Some(index - start_index)
|
||||
}
|
||||
|
||||
fn execute_avm1_asfunction(
|
||||
self,
|
||||
context: &mut UpdateContext<'_, 'gc>,
|
||||
|
|
Loading…
Reference in New Issue