Canvas · Tools: select, move and snap, resize, draw, pen, text, brush
ToolLayer lies over an InfiniteCanvas and carries its tools. Select takes the topmost shape a press reaches, Shift adds or drops one, a drag moves the selection and snaps its nearest edge or middle to another shape's within reach, a handle resizes it, Shift keeping a corner's shape, and a drag on empty space draws a SelectionBox that takes what lies wholly inside. The shape tools draw by a drag toward any corner, Shift keeping them square; the pen adds a point per press and a double press ends the path; text drops a line where pressed; the brush strokes a path its width. A drag may end in the layer or out of it; each gesture ends once and asks the owner. SelectionBox, TransformHandles and SnapIndicator draw the marks. ToolPalette picks a tool from icons named in tips; BrushSettings sets a brush's width and hue; HistoryPanel lists the steps done, the undone ones quiet, and takes the drawing to a step on Enter or a double press. The model changes: lines and arrows end at a named corner, so they run either way, and paths carry their width. Three Lucide icons: hexagon, slash and move-up-right. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ea99d30e3b
commit
49a205ea35
20 files changed
+1812
-34
No files matched your search
+6
-5
@@ -116,10 +116,10 @@ pub(crate) fn paint_shape(
|
||||
finish(solid(&corners, origin), wash, window);
|
||||
finish(outline(&corners, origin, stroke, true), ink, window);
|
||||
}
|
||||
ShapeKind::Line | ShapeKind::Arrow => {
|
||||
let (from, to) = ((frame.x, frame.y), (frame.right(), frame.bottom()));
|
||||
ShapeKind::Line(end) | ShapeKind::Arrow(end) => {
|
||||
let (from, to) = (end.opposite().of(&frame), end.of(&frame));
|
||||
finish(outline(&[from, to], origin, stroke, false), ink, window);
|
||||
if shape.kind == ShapeKind::Arrow {
|
||||
if matches!(shape.kind, ShapeKind::Arrow(_)) {
|
||||
let (dx, dy) = (to.0 - from.0, to.1 - from.1);
|
||||
let length = (dx * dx + dy * dy).sqrt().max(1.0);
|
||||
let (ux, uy) = (dx / length, dy / length);
|
||||
@@ -130,12 +130,13 @@ pub(crate) fn paint_shape(
|
||||
finish(solid(&[to, left, right], origin), ink, window);
|
||||
}
|
||||
}
|
||||
ShapeKind::Path(points) => {
|
||||
ShapeKind::Path { points, width } => {
|
||||
let points: Vec<(f32, f32)> = points
|
||||
.iter()
|
||||
.map(|(x, y)| view.to_view((shape.frame.x + x, shape.frame.y + y)))
|
||||
.collect();
|
||||
finish(outline(&points, origin, stroke, false), ink, window);
|
||||
let wide = Pixels::from(width * view.zoom).max(stroke);
|
||||
finish(outline(&points, origin, wide, false), ink, window);
|
||||
}
|
||||
ShapeKind::Text(_) | ShapeKind::Note(_) => {}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user