use std::ops::Mul;
use freya_common::{
CachedParagraph,
CursorLayoutResponse,
TextGroupMeasurement,
};
use freya_native_core::real_dom::NodeImmutable;
use freya_node_state::CursorSettings;
use torin::prelude::*;
use crate::{
dom::DioxusNode,
layout::align_main_align_paragraph,
};
pub fn measure_paragraph(
node: &DioxusNode,
layout_node: &LayoutNode,
text_measurement: &TextGroupMeasurement,
scale_factor: f32,
) {
let paragraph = &layout_node
.data
.as_ref()
.unwrap()
.get::<CachedParagraph>()
.unwrap()
.0;
let cursor_settings = node.get::<CursorSettings>().unwrap();
let scale_factors = scale_factor as f64;
if cursor_settings.cursor_id != Some(text_measurement.cursor_id) {
return;
}
let y = align_main_align_paragraph(node, &layout_node.area, paragraph);
if let Some(cursor_reference) = &cursor_settings.cursor_ref {
if let Some(cursor_position) = text_measurement.cursor_position {
let position = CursorPoint::new(cursor_position.x, cursor_position.y - y as f64);
let char_position = paragraph
.get_glyph_position_at_coordinate(position.mul(scale_factors).to_i32().to_tuple());
cursor_reference
.cursor_sender
.send(CursorLayoutResponse::CursorPosition {
position: char_position.position as usize,
id: text_measurement.cursor_id,
})
.ok();
}
if let Some((origin, dist)) = text_measurement.cursor_selection {
let origin_position = CursorPoint::new(origin.x, origin.y - y as f64);
let dist_position = CursorPoint::new(dist.x, dist.y - y as f64);
let origin_char = paragraph.get_glyph_position_at_coordinate(
origin_position.mul(scale_factors).to_i32().to_tuple(),
);
let dist_char = paragraph.get_glyph_position_at_coordinate(
dist_position.mul(scale_factors).to_i32().to_tuple(),
);
cursor_reference
.cursor_sender
.send(CursorLayoutResponse::TextSelection {
from: origin_char.position as usize,
to: dist_char.position as usize,
id: text_measurement.cursor_id,
})
.ok();
}
}
}