feat(grip): multi-functional hover popup menu
Phase 2 of the grip overhaul: when the cursor dwells on a selected entity's grip the overlay opens a popup menu with entity-specific options (Stretch / Add Vertex / Remove Vertex / Convert to Arc-Line / …). Picking an item dispatches `apply_grip_menu`; the default `Stretch` entry is a no-op that lets the user click the grip to start the normal drag. - `GripMenuItem` + `GripMenuAction` (full vocabulary covering stretch, add/remove vertex, convert to arc/line, reverse arrows, text-position variants, hatch parameters, tangent direction). - `Grippable` trait gains `grip_menu` + `apply_grip_menu` with trait-default `Stretch`-only impls so every existing entity gets the popup for free. - `EntityTypeOps` dispatches both methods across the same entity list as the existing grip / property machinery. - `OpenCADStudio` carries `grip_hover` (dwell tracker) + `grip_popup` (open menu). `update_grip_hover` runs from `ViewportMove`: hit-tests grips, refreshes the dwell timer, and opens the popup after 600 ms. Cursor drift past 80 px or a grip click dismisses it. - `view.rs` paints the popup as an absolute-positioned column of buttons at the grip's screen anchor; each button publishes `Message::GripMenuPick(idx)`. - `LwPolyline` overrides `Grippable` manually (skips the standard macro) so its vertex grip exposes Add/Remove Vertex and its segment-midpoint grip exposes Add Vertex + Convert to Arc/Line. `apply_grip_menu` performs the edits: vertex insertion at the chord midpoint inheriting the previous bulge, vertex removal, and bulge toggle for the arc/line conversion.
This commit is contained in:
parent
5755c2e130
commit
6c1462932d
6 changed files with 443 additions and 2 deletions
|
|
@ -96,3 +96,44 @@ pub enum GripApply {
|
|||
/// Translate the whole object by this delta vector.
|
||||
Translate(Vec3),
|
||||
}
|
||||
|
||||
/// One entry in the hover-popup menu that opens when the cursor dwells
|
||||
/// on a grip. The `label` is the user-visible string; `action` is the
|
||||
/// operation the entity will perform when the item is committed.
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub struct GripMenuItem {
|
||||
pub label: &'static str,
|
||||
pub action: GripMenuAction,
|
||||
}
|
||||
|
||||
/// All operations a grip popup menu can dispatch. Entity-specific code
|
||||
/// in `apply_grip_menu` decodes these into edits. `Stretch` is the
|
||||
/// default no-op-equivalent — picking it just starts the regular
|
||||
/// stretch drag, identical to clicking the grip with no popup open.
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum GripMenuAction {
|
||||
Stretch,
|
||||
Lengthen,
|
||||
Radius,
|
||||
ArcLength,
|
||||
AddVertex,
|
||||
RemoveVertex,
|
||||
ConvertToArc,
|
||||
ConvertToLine,
|
||||
StretchVertex,
|
||||
AddLeader,
|
||||
RemoveLeader,
|
||||
ReverseArrows,
|
||||
MoveWithDimLine,
|
||||
MoveWithLeader,
|
||||
MoveIndependent,
|
||||
ResetText,
|
||||
RotateText,
|
||||
AboveDimLine,
|
||||
Center,
|
||||
OriginPoint,
|
||||
HatchAngle,
|
||||
HatchScale,
|
||||
HatchPattern,
|
||||
TangentDirection,
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue