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

+20 -1
View File
@@ -1,6 +1,7 @@
use gpui::{AnyElement, App, Window, div, prelude::*};
mod plane;
mod tools;
use super::Page;
use crate::script::Step;
@@ -20,8 +21,26 @@ const SCRIPT: &[Step] = &[
Step::UpAt("canvas-plane", 300.0, 240.0),
Step::Wait(200),
Step::Shot("panned"),
Step::DownAt("canvas-tools", 150.0, 110.0),
Step::DragTo("canvas-tools", 170.0, 112.0),
Step::DragTo("canvas-tools", 187.0, 112.0),
Step::Wait(200),
Step::Shot("snapping"),
Step::UpAt("canvas-tools", 187.0, 112.0),
Step::Wait(200),
Step::DownAt("canvas-palette", 83.0, 16.0),
Step::UpAt("canvas-palette", 83.0, 16.0),
Step::Wait(150),
Step::DownAt("canvas-tools", 60.0, 230.0),
Step::DragTo("canvas-tools", 200.0, 300.0),
Step::UpAt("canvas-tools", 200.0, 300.0),
Step::Wait(250),
Step::Shot("drawn"),
];
fn render(window: &mut Window, cx: &mut App) -> AnyElement {
div().child(plane::plane(window, cx)).into_any_element()
div()
.child(plane::plane(window, cx))
.child(tools::tools(window, cx))
.into_any_element()
}