feat(leader): dynamic MLEADER text placement, grips, and consistent arrows
Reworks MLEADER text/leader geometry and grip editing, and aligns LEADER to MLEADER's conventions (kept as separate entities). Text & landing (render path): - Text is side-anchored on the leader-facing edge and reads outward; the side, alignment and the horizontal landing are recomputed every frame from the text grip's position relative to the leader, so moving the arrow or the text re-mirrors the whole layout and the landing stays attached to the text's near edge. - Fixes #49: text was centred on the leader endpoint regardless of side. Grips: - Text-location grip plus an MTEXT-style triangle wrap-width grip at the box's far edge; dragging it sets the MText wrap width. - Multifunction grip menu restored and made functional: leader-line vertices offer Add Leader / Remove Leader (Add grabs the new arrow so it follows the cursor — click places, Esc removes it); the text grip offers Move Independent (text only) and Move with Leader (translates the whole multileader via a move-all sentinel grip). Arrows: - LEADER and MLEADER arrowheads now render at the same size (text height), matching previews. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
6f64d8d0d9
commit
8b3d083789
6 changed files with 395 additions and 162 deletions
|
|
@ -44,7 +44,8 @@ fn to_truck(leader: &Leader) -> TruckEntity {
|
|||
let dy = next.y - tip.y;
|
||||
let len = (dx * dx + dy * dy).sqrt().max(1e-9);
|
||||
let (dx, dy) = (dx / len, dy / len);
|
||||
let sz = (leader.text_height).max(1.0) * 0.8;
|
||||
// Arrowhead sized to the text height, matching the MLEADER arrowhead.
|
||||
let sz = (leader.text_height).max(1.0);
|
||||
let a = std::f64::consts::PI / 6.0;
|
||||
let (s, c) = a.sin_cos();
|
||||
let tip_f = p3(tip);
|
||||
|
|
@ -627,7 +628,7 @@ impl LeaderTess for Leader {
|
|||
.unwrap_or(anno_scale as f64);
|
||||
let arrow_size = match style {
|
||||
Some(s) => (s.dimasz * dim_scale) as f32,
|
||||
None => (self.text_height as f32).max(1.0) * 0.8 * anno_scale,
|
||||
None => (self.text_height as f32).max(1.0) * anno_scale,
|
||||
};
|
||||
let arrow = match style {
|
||||
Some(s) => arrow_from_block(document, s.dimldrblk, arrow_size.max(0.001)),
|
||||
|
|
|
|||
Loading…
Reference in a new issue