feat(grip): complete standard grip-shape vocabulary
Existing entity grip definitions already followed the conventional CAD layout: square at vertices / endpoints, diamond at curve centres / midpoints, triangle for directional control. Round out the supported shape vocabulary with the two missing standards so future entities (polyline straight-segment stretch grips, dimension parameter grips, …) can pick the right marker without inventing ad-hoc visuals: - `GripShape::Rectangle` — direction-aware mid-segment stretch handle (wider-than-tall box). - `GripShape::Circle` — parametric control (radius / dimension value). New `rectangle_grip` / `circle_grip` helpers in `entities::common` mirror the existing `square_grip` / `diamond_grip` / `triangle_grip` constructors. `SelectionCanvas::draw` renders the two new variants; the previously-used Square / Diamond / Triangle paths are unchanged. Both new variants carry `#[allow(dead_code)]` until an entity adopts them.
This commit is contained in:
parent
0ec6d77cb1
commit
1e33a9049c
3 changed files with 43 additions and 1 deletions
|
|
@ -148,6 +148,26 @@ pub fn triangle_grip(id: usize, world: Vec3) -> GripDef {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn rectangle_grip(id: usize, world: Vec3) -> GripDef {
|
||||||
|
GripDef {
|
||||||
|
id,
|
||||||
|
world,
|
||||||
|
is_midpoint: true,
|
||||||
|
shape: GripShape::Rectangle,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn circle_grip(id: usize, world: Vec3) -> GripDef {
|
||||||
|
GripDef {
|
||||||
|
id,
|
||||||
|
world,
|
||||||
|
is_midpoint: false,
|
||||||
|
shape: GripShape::Circle,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn edit_prop(label: &'static str, field: &'static str, value: f64) -> Property {
|
pub fn edit_prop(label: &'static str, field: &'static str, value: f64) -> Property {
|
||||||
Property {
|
Property {
|
||||||
label: label.into(),
|
label: label.into(),
|
||||||
|
|
|
||||||
|
|
@ -51,12 +51,23 @@ pub struct PropSection {
|
||||||
|
|
||||||
// ── Grip types ─────────────────────────────────────────────────────────────
|
// ── Grip types ─────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
/// Describes one grip point for an entity.
|
/// Visual marker shape for a grip point. The complete vocabulary used
|
||||||
|
/// across entity types:
|
||||||
|
/// * `Square` — vertex / endpoint that moves a single point.
|
||||||
|
/// * `Rectangle` — direction-aware mid-segment stretch (polyline
|
||||||
|
/// straight segments, dimension extension lines).
|
||||||
|
/// * `Diamond` — midpoint of a curve / centre of a closed shape (drags
|
||||||
|
/// the whole shape or stretches the midpoint).
|
||||||
|
/// * `Triangle` — directional control (rotate / add vertex / continue).
|
||||||
|
/// * `Circle` — parametric control (radius / dimension value).
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
#[allow(dead_code)]
|
||||||
pub enum GripShape {
|
pub enum GripShape {
|
||||||
Square,
|
Square,
|
||||||
|
Rectangle,
|
||||||
Diamond,
|
Diamond,
|
||||||
Triangle,
|
Triangle,
|
||||||
|
Circle,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Describes one grip point for an entity.
|
/// Describes one grip point for an entity.
|
||||||
|
|
|
||||||
|
|
@ -423,6 +423,16 @@ impl canvas::Program<Message> for SelectionCanvas {
|
||||||
Point::new(sp.x - h, sp.y - h),
|
Point::new(sp.x - h, sp.y - h),
|
||||||
Size::new(h * 2.0, h * 2.0),
|
Size::new(h * 2.0, h * 2.0),
|
||||||
),
|
),
|
||||||
|
GripShape::Rectangle => {
|
||||||
|
// Wider-than-tall box — direction-aware mid-segment
|
||||||
|
// stretch handle.
|
||||||
|
let w = h * 1.4;
|
||||||
|
let t = h * 0.7;
|
||||||
|
canvas::Path::rectangle(
|
||||||
|
Point::new(sp.x - w, sp.y - t),
|
||||||
|
Size::new(w * 2.0, t * 2.0),
|
||||||
|
)
|
||||||
|
}
|
||||||
GripShape::Diamond => canvas::Path::new(|b| {
|
GripShape::Diamond => canvas::Path::new(|b| {
|
||||||
b.move_to(Point::new(sp.x, sp.y - h));
|
b.move_to(Point::new(sp.x, sp.y - h));
|
||||||
b.line_to(Point::new(sp.x + h, sp.y));
|
b.line_to(Point::new(sp.x + h, sp.y));
|
||||||
|
|
@ -436,6 +446,7 @@ impl canvas::Program<Message> for SelectionCanvas {
|
||||||
b.line_to(Point::new(sp.x - h, sp.y + h));
|
b.line_to(Point::new(sp.x - h, sp.y + h));
|
||||||
b.close();
|
b.close();
|
||||||
}),
|
}),
|
||||||
|
GripShape::Circle => canvas::Path::circle(sp, h),
|
||||||
};
|
};
|
||||||
|
|
||||||
if grip.is_hot {
|
if grip.is_hot {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue