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.
This commit is contained in:
ZacharyZhang-NY committed 2026-09-27 07:27:27 -04:00
1 parent 50259aff77
commit c474a3eb33
20 files changed
+1812 -34

No files matched your search

+14 -10
View File
@@ -1,6 +1,7 @@
use ely_gpui_component::{
canvas::{
Artboard, Frame, Guide, InfiniteCanvas, MiniMap, Shape, ShapeKind, Viewport, ZoomControls,
Artboard, Corner, Frame, Guide, InfiniteCanvas, MiniMap, Shape, ShapeKind, Viewport,
ZoomControls,
},
theme::{ActiveTheme, Radius},
};
@@ -57,27 +58,30 @@ fn shapes() -> Vec<Shape> {
Shape::new(
"rule",
"Rule",
ShapeKind::Line,
ShapeKind::Line(Corner::BottomRight),
Frame::new(24.0, 380.0, 342.0, 0.0),
)
.hue(4),
Shape::new(
"flow",
"Flow",
ShapeKind::Arrow,
ShapeKind::Arrow(Corner::BottomRight),
Frame::new(390.0, 120.0, 80.0, 0.0),
)
.hue(3),
Shape::new(
"sketch",
"Sketch",
ShapeKind::Path(vec![
(0.0, 40.0),
(40.0, 0.0),
(80.0, 30.0),
(120.0, 10.0),
(160.0, 50.0),
]),
ShapeKind::Path {
points: vec![
(0.0, 40.0),
(40.0, 0.0),
(80.0, 30.0),
(120.0, 10.0),
(160.0, 50.0),
],
width: 2.0,
},
Frame::new(494.0, 60.0, 160.0, 50.0),
)
.hue(1),