Skip to content

Commit 8e5abf6

Browse files
0SlowPoke0Keavon
andauthored
Add star/polygon gizmos and refactor the separate shape drawing tools into a unified Shape tool (#2683)
* no trait ,not to fix line * add hints * line modification even when other shapes are selected * added transform and anchor overlays * removed old code * fixed transform added hints need to fix modifier keys use * refactored select-tool * add point-handle-gizmo * fix rotate bug * implement angle snapping gizmo , fix overlay and refactor the code * implement snapping for point-handle gizmo and implement no of point gizmo need to refactor * implemented the gizmo for polygon, added tests , brackets to increase sides * formatting-fix * small nit-picks * Make it compile * Code review --------- Co-authored-by: Keavon Chambers <[email protected]>
1 parent e520c21 commit 8e5abf6

34 files changed

+3231
-2137
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

editor/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ serde_json = { workspace = true }
4040
bezier-rs = { workspace = true }
4141
futures = { workspace = true }
4242
glam = { workspace = true }
43+
kurbo = { workspace = true }
4344
derivative = { workspace = true }
4445
specta = { workspace = true }
4546
dyn-any = { workspace = true }

editor/src/consts.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ pub const LINE_ROTATE_SNAP_ANGLE: f64 = 15.;
119119
pub const BRUSH_SIZE_CHANGE_KEYBOARD: f64 = 5.;
120120
pub const DEFAULT_BRUSH_SIZE: f64 = 20.;
121121

122+
// GIZMOS
123+
pub const POINT_RADIUS_HANDLE_SNAP_THRESHOLD: f64 = 8.;
124+
pub const POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD: f64 = 7.9;
125+
pub const NUMBER_OF_POINTS_HANDLE_SPOKE_EXTENSION: f64 = 1.2;
126+
pub const NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH: f64 = 10.;
127+
pub const GIZMO_HIDE_THRESHOLD: f64 = 20.;
128+
122129
// SCROLLBARS
123130
pub const SCROLLBAR_SPACING: f64 = 0.1;
124131
pub const ASYMPTOTIC_EFFECT: f64 = 0.5;

editor/src/messages/input_mapper/input_mappings.rs

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,40 @@ pub fn input_mappings() -> Mapping {
171171
entry!(KeyDown(MouseRight); action_dispatch=GradientToolMessage::Abort),
172172
entry!(KeyDown(Escape); action_dispatch=GradientToolMessage::Abort),
173173
//
174-
// RectangleToolMessage
175-
entry!(KeyDown(MouseLeft); action_dispatch=RectangleToolMessage::DragStart),
176-
entry!(KeyUp(MouseLeft); action_dispatch=RectangleToolMessage::DragStop),
177-
entry!(KeyDown(MouseRight); action_dispatch=RectangleToolMessage::Abort),
178-
entry!(KeyDown(Escape); action_dispatch=RectangleToolMessage::Abort),
179-
entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=RectangleToolMessage::PointerMove { center: Alt, lock_ratio: Shift }),
174+
// ShapeToolMessage
175+
entry!(KeyDown(MouseLeft); action_dispatch=ShapeToolMessage::DragStart),
176+
entry!(KeyUp(MouseLeft); action_dispatch=ShapeToolMessage::DragStop),
177+
entry!(KeyDown(MouseRight); action_dispatch=ShapeToolMessage::Abort),
178+
entry!(KeyDown(Escape); action_dispatch=ShapeToolMessage::Abort),
179+
entry!(KeyDown(BracketLeft); action_dispatch=ShapeToolMessage::DecreaseSides),
180+
entry!(KeyDown(BracketRight); action_dispatch=ShapeToolMessage::IncreaseSides),
181+
entry!(PointerMove; refresh_keys=[Alt, Shift, Control], action_dispatch=ShapeToolMessage::PointerMove([Alt, Shift, Control, Shift])),
182+
entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
183+
entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
184+
entry!(KeyDown(ArrowUp); modifiers=[Shift], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: 0., delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
185+
entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
186+
entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
187+
entry!(KeyDown(ArrowDown); modifiers=[Shift], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: 0., delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
188+
entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
189+
entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
190+
entry!(KeyDown(ArrowLeft); modifiers=[Shift], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }),
191+
entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
192+
entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
193+
entry!(KeyDown(ArrowRight); modifiers=[Shift], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }),
194+
entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
195+
entry!(KeyDown(ArrowUp); modifiers=[ArrowRight], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
196+
entry!(KeyDown(ArrowUp); action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: 0., delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
197+
entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
198+
entry!(KeyDown(ArrowDown); modifiers=[ArrowRight], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
199+
entry!(KeyDown(ArrowDown); action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: 0., delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
200+
entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
201+
entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
202+
entry!(KeyDown(ArrowLeft); action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }),
203+
entry!(KeyDown(ArrowRight); modifiers=[ArrowUp], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
204+
entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }),
205+
entry!(KeyDown(ArrowRight); action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }),
206+
entry!(KeyDown(ArrowUp); action_dispatch=ShapeToolMessage::IncreaseSides),
207+
entry!(KeyDown(ArrowDown); action_dispatch=ShapeToolMessage::DecreaseSides),
180208
//
181209
// ImaginateToolMessage
182210
// entry!(KeyDown(MouseLeft); action_dispatch=ImaginateToolMessage::DragStart),
@@ -185,27 +213,6 @@ pub fn input_mappings() -> Mapping {
185213
// entry!(KeyDown(Escape); action_dispatch=ImaginateToolMessage::Abort),
186214
// entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=ImaginateToolMessage::Resize { center: Alt, lock_ratio: Shift }),
187215
//
188-
// EllipseToolMessage
189-
entry!(KeyDown(MouseLeft); action_dispatch=EllipseToolMessage::DragStart),
190-
entry!(KeyUp(MouseLeft); action_dispatch=EllipseToolMessage::DragStop),
191-
entry!(KeyDown(MouseRight); action_dispatch=EllipseToolMessage::Abort),
192-
entry!(KeyDown(Escape); action_dispatch=EllipseToolMessage::Abort),
193-
entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=EllipseToolMessage::PointerMove { center: Alt, lock_ratio: Shift }),
194-
//
195-
// PolygonToolMessage
196-
entry!(KeyDown(MouseLeft); action_dispatch=PolygonToolMessage::DragStart),
197-
entry!(KeyUp(MouseLeft); action_dispatch=PolygonToolMessage::DragStop),
198-
entry!(KeyDown(MouseRight); action_dispatch=PolygonToolMessage::Abort),
199-
entry!(KeyDown(Escape); action_dispatch=PolygonToolMessage::Abort),
200-
entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=PolygonToolMessage::PointerMove { center: Alt, lock_ratio: Shift }),
201-
//
202-
// LineToolMessage
203-
entry!(KeyDown(MouseLeft); action_dispatch=LineToolMessage::DragStart),
204-
entry!(KeyUp(MouseLeft); action_dispatch=LineToolMessage::DragStop),
205-
entry!(KeyDown(MouseRight); action_dispatch=LineToolMessage::Abort),
206-
entry!(KeyDown(Escape); action_dispatch=LineToolMessage::Abort),
207-
entry!(PointerMove; refresh_keys=[Control, Alt, Shift], action_dispatch=LineToolMessage::PointerMove { center: Alt, lock_angle: Control, snap_angle: Shift }),
208-
//
209216
// PathToolMessage
210217
entry!(KeyDown(Delete); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath),
211218
entry!(KeyDown(Backspace); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath),
@@ -308,10 +315,10 @@ pub fn input_mappings() -> Mapping {
308315
entry!(KeyDown(KeyA); action_dispatch=ToolMessage::ActivateToolPath),
309316
entry!(KeyDown(KeyP); action_dispatch=ToolMessage::ActivateToolPen),
310317
entry!(KeyDown(KeyN); action_dispatch=ToolMessage::ActivateToolFreehand),
311-
entry!(KeyDown(KeyL); action_dispatch=ToolMessage::ActivateToolLine),
312-
entry!(KeyDown(KeyM); action_dispatch=ToolMessage::ActivateToolRectangle),
313-
entry!(KeyDown(KeyE); action_dispatch=ToolMessage::ActivateToolEllipse),
314-
entry!(KeyDown(KeyY); action_dispatch=ToolMessage::ActivateToolPolygon),
318+
entry!(KeyDown(KeyL); action_dispatch=ToolMessage::ActivateToolShapeLine),
319+
entry!(KeyDown(KeyM); action_dispatch=ToolMessage::ActivateToolShapeRectangle),
320+
entry!(KeyDown(KeyE); action_dispatch=ToolMessage::ActivateToolShapeEllipse),
321+
entry!(KeyDown(KeyY); action_dispatch=ToolMessage::ActivateToolShape),
315322
entry!(KeyDown(KeyB); action_dispatch=ToolMessage::ActivateToolBrush),
316323
entry!(KeyDown(KeyX); modifiers=[Accel, Shift], action_dispatch=ToolMessage::ResetColors),
317324
entry!(KeyDown(KeyX); modifiers=[Shift], action_dispatch=ToolMessage::SwapColors),

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1705,6 +1705,21 @@ impl DocumentMessageHandler {
17051705
self.click_list(ipp).last()
17061706
}
17071707

1708+
pub fn click_based_on_position(&self, mouse_snapped_positon: DVec2) -> Option<LayerNodeIdentifier> {
1709+
ClickXRayIter::new(&self.network_interface, XRayTarget::Point(mouse_snapped_positon))
1710+
.filter(move |&layer| !self.network_interface.is_artboard(&layer.to_node(), &[]))
1711+
.skip_while(|&layer| layer == LayerNodeIdentifier::ROOT_PARENT)
1712+
.scan(true, |last_had_children, layer| {
1713+
if *last_had_children {
1714+
*last_had_children = layer.has_children(self.network_interface.document_metadata());
1715+
Some(layer)
1716+
} else {
1717+
None
1718+
}
1719+
})
1720+
.last()
1721+
}
1722+
17081723
/// Get the combined bounding box of the click targets of the selected visible layers in viewport space
17091724
pub fn selected_visible_layers_bounding_box_viewport(&self) -> Option<[DVec2; 2]> {
17101725
self.network_interface

editor/src/messages/prelude.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,16 @@ pub use crate::messages::broadcast::broadcast_event::{BroadcastEvent, BroadcastE
3434
pub use crate::messages::message::{Message, MessageDiscriminant};
3535
pub use crate::messages::tool::tool_messages::artboard_tool::{ArtboardToolMessage, ArtboardToolMessageDiscriminant};
3636
pub use crate::messages::tool::tool_messages::brush_tool::{BrushToolMessage, BrushToolMessageDiscriminant};
37-
pub use crate::messages::tool::tool_messages::ellipse_tool::{EllipseToolMessage, EllipseToolMessageDiscriminant};
3837
pub use crate::messages::tool::tool_messages::eyedropper_tool::{EyedropperToolMessage, EyedropperToolMessageDiscriminant};
3938
pub use crate::messages::tool::tool_messages::fill_tool::{FillToolMessage, FillToolMessageDiscriminant};
4039
pub use crate::messages::tool::tool_messages::freehand_tool::{FreehandToolMessage, FreehandToolMessageDiscriminant};
4140
pub use crate::messages::tool::tool_messages::gradient_tool::{GradientToolMessage, GradientToolMessageDiscriminant};
4241
// pub use crate::messages::tool::tool_messages::imaginate_tool::{ImaginateToolMessage, ImaginateToolMessageDiscriminant};
43-
pub use crate::messages::tool::tool_messages::line_tool::{LineToolMessage, LineToolMessageDiscriminant};
4442
pub use crate::messages::tool::tool_messages::navigate_tool::{NavigateToolMessage, NavigateToolMessageDiscriminant};
4543
pub use crate::messages::tool::tool_messages::path_tool::{PathToolMessage, PathToolMessageDiscriminant};
4644
pub use crate::messages::tool::tool_messages::pen_tool::{PenToolMessage, PenToolMessageDiscriminant};
47-
pub use crate::messages::tool::tool_messages::polygon_tool::{PolygonToolMessage, PolygonToolMessageDiscriminant};
48-
pub use crate::messages::tool::tool_messages::rectangle_tool::{RectangleToolMessage, RectangleToolMessageDiscriminant};
4945
pub use crate::messages::tool::tool_messages::select_tool::{SelectToolMessage, SelectToolMessageDiscriminant};
46+
pub use crate::messages::tool::tool_messages::shape_tool::{ShapeToolMessage, ShapeToolMessageDiscriminant};
5047
pub use crate::messages::tool::tool_messages::spline_tool::{SplineToolMessage, SplineToolMessageDiscriminant};
5148
pub use crate::messages::tool::tool_messages::text_tool::{TextToolMessage, TextToolMessageDiscriminant};
5249

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ pub mod measure;
66
pub mod pivot;
77
pub mod resize;
88
pub mod shape_editor;
9+
pub mod shape_gizmos;
10+
pub mod shapes;
911
pub mod snapping;
1012
pub mod transformation_cage;
1113
pub mod utility_functions;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use glam::{DAffine2, DVec2, Vec2Swizzles};
88
#[derive(Clone, Debug, Default)]
99
pub struct Resize {
1010
/// Stored as a document position so the start doesn't move if the canvas is panned.
11-
drag_start: DVec2,
11+
pub drag_start: DVec2,
1212
pub layer: Option<LayerNodeIdentifier>,
1313
pub snap_manager: SnapManager,
1414
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pub mod number_of_points_handle;
2+
pub mod point_radius_handle;

0 commit comments

Comments
 (0)