Skip to content

Commit 99966d8

Browse files
committed
Fix text per-glyph instance overlays and click target issues
1 parent 112efe8 commit 99966d8

File tree

6 files changed

+24
-10
lines changed

6 files changed

+24
-10
lines changed

editor/src/messages/portfolio/document_migration.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -974,8 +974,11 @@ fn migrate_node(node_id: &NodeId, node: &DocumentNode, network_path: &[NodeId],
974974
let mut node_template = resolve_document_node_type(reference)?.default_node_template();
975975
document.network_interface.replace_implementation(node_id, network_path, &mut node_template);
976976

977-
document.network_interface.add_import(TaggedValue::None, false, 0, "Primary", "", &[*node_id]);
978-
document.network_interface.add_import(TaggedValue::U32(0), false, 1, "Loop Level", "TODO", &[*node_id]);
977+
let mut node_path = network_path.to_vec();
978+
node_path.push(*node_id);
979+
980+
document.network_interface.add_import(TaggedValue::None, false, 0, "Primary", "", &node_path);
981+
document.network_interface.add_import(TaggedValue::U32(0), false, 1, "Loop Level", "TODO", &node_path);
979982
}
980983

981984
// ==================================

editor/src/messages/tool/common_functionality/graph_modification_utils.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ pub fn get_text_id(layer: LayerNodeIdentifier, network_interface: &NodeNetworkIn
357357
}
358358

359359
/// Gets properties from the Text node
360-
pub fn get_text(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option<(&String, &Font, TypesettingConfig)> {
360+
pub fn get_text(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option<(&String, &Font, TypesettingConfig, bool)> {
361361
let inputs = NodeGraphLayer::new(layer, network_interface).find_node_inputs("Text")?;
362362

363363
let Some(TaggedValue::String(text)) = &inputs[1].as_value() else { return None };
@@ -368,6 +368,9 @@ pub fn get_text(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInter
368368
let Some(&TaggedValue::OptionalF64(max_width)) = inputs[6].as_value() else { return None };
369369
let Some(&TaggedValue::OptionalF64(max_height)) = inputs[7].as_value() else { return None };
370370
let Some(&TaggedValue::F64(tilt)) = inputs[8].as_value() else { return None };
371+
let Some(TaggedValue::Bool(per_glyph_instances)) = &inputs[9].as_value() else {
372+
return None;
373+
};
371374

372375
let typesetting = TypesettingConfig {
373376
font_size,
@@ -377,7 +380,7 @@ pub fn get_text(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInter
377380
max_height,
378381
tilt,
379382
};
380-
Some((text, font, typesetting))
383+
Some((text, font, typesetting, *per_glyph_instances))
381384
}
382385

383386
pub fn get_stroke_width(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option<f64> {

editor/src/messages/tool/common_functionality/utility_functions.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,22 @@ where
6666

6767
/// Calculates the bounding box of the layer's text, based on the settings for max width and height specified in the typesetting config.
6868
pub fn text_bounding_box(layer: LayerNodeIdentifier, document: &DocumentMessageHandler, font_cache: &FontCache) -> Quad {
69-
let Some((text, font, typesetting)) = get_text(layer, &document.network_interface) else {
69+
let Some((text, font, typesetting, per_glyph_instances)) = get_text(layer, &document.network_interface) else {
7070
return Quad::from_box([DVec2::ZERO, DVec2::ZERO]);
7171
};
7272

7373
let font_data = font_cache.get(font).map(|data| load_font(data));
7474
let far = graphene_std::text::bounding_box(text, font_data, typesetting, false);
7575

76-
Quad::from_box([DVec2::ZERO, far])
76+
// TODO: Once the instances refactor is complete and per_glyph_instances can be removed (since it'll be the default),
77+
// TODO: remove this because the top of the dashed bounding overlay should no longer be based on the first line's baseline.
78+
let vertical_offset = if per_glyph_instances {
79+
DVec2::NEG_Y * typesetting.font_size * (1. + (typesetting.line_height_ratio - 1.) / 2.)
80+
} else {
81+
DVec2::ZERO
82+
};
83+
84+
Quad::from_box([DVec2::ZERO + vertical_offset, far + vertical_offset])
7785
}
7886

7987
pub fn calculate_segment_angle(anchor: PointId, segment: SegmentId, vector_data: &VectorData, prefer_handle_direction: bool) -> Option<f64> {

editor/src/messages/tool/tool_messages/text_tool.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ impl TextToolData {
329329
fn load_layer_text_node(&mut self, document: &DocumentMessageHandler) -> Option<()> {
330330
let transform = document.metadata().transform_to_viewport(self.layer);
331331
let color = graph_modification_utils::get_fill_color(self.layer, &document.network_interface).unwrap_or(Color::BLACK);
332-
let (text, font, typesetting) = graph_modification_utils::get_text(self.layer, &document.network_interface)?;
332+
let (text, font, typesetting, _) = graph_modification_utils::get_text(self.layer, &document.network_interface)?;
333333
self.editing_text = Some(EditingText {
334334
text: text.clone(),
335335
font: font.clone(),
@@ -524,7 +524,7 @@ impl Fsm for TextToolFsmState {
524524
bounding_box_manager.render_quad(&mut overlay_context);
525525
// Draw red overlay if text is clipped
526526
let transformed_quad = layer_transform * bounds;
527-
if let Some((text, font, typesetting)) = graph_modification_utils::get_text(layer.unwrap(), &document.network_interface) {
527+
if let Some((text, font, typesetting, _)) = graph_modification_utils::get_text(layer.unwrap(), &document.network_interface) {
528528
let font_data = font_cache.get(font).map(|data| load_font(data));
529529
if lines_clipping(text.as_str(), font_data, typesetting) {
530530
overlay_context.line(transformed_quad.0[2], transformed_quad.0[3], Some(COLOR_OVERLAY_RED), Some(3.));

node-graph/gcore/src/text/to_path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ fn layout_text(str: &str, font_data: Option<Blob<u8>>, typesetting: TypesettingC
181181
})?;
182182

183183
const DISPLAY_SCALE: f32 = 1.;
184-
let mut builder = layout_cx.ranged_builder(&mut font_cx, str, DISPLAY_SCALE, true);
184+
let mut builder = layout_cx.ranged_builder(&mut font_cx, str, DISPLAY_SCALE, false);
185185

186186
builder.push_default(StyleProperty::FontSize(typesetting.font_size as f32));
187187
builder.push_default(StyleProperty::LetterSpacing(typesetting.character_spacing as f32));

node-graph/gsvg-renderer/src/renderer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ impl GraphicElementRendered for VectorDataTable {
756756
.chain(single_anchors_targets.into_iter())
757757
.collect::<Vec<ClickTarget>>();
758758

759-
metadata.click_targets.insert(element_id, click_targets);
759+
metadata.click_targets.entry(element_id).or_insert(click_targets);
760760
}
761761

762762
if let Some(upstream_graphic_group) = &instance.upstream_graphic_group {

0 commit comments

Comments
 (0)