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>
47 lines
1.3 KiB
Rust
47 lines
1.3 KiB
Rust
use gpui::{AnyElement, App, Window, div, prelude::*};
|
|
|
|
mod plane;
|
|
mod tools;
|
|
|
|
use super::Page;
|
|
use crate::script::Step;
|
|
|
|
pub const PAGE: Page = Page {
|
|
number: 32,
|
|
slug: "canvas",
|
|
title: "Canvas & Design",
|
|
summary: "An endless plane to lay work on, the tools and panels around it, and graphs of nodes.",
|
|
render,
|
|
script: SCRIPT,
|
|
};
|
|
|
|
const SCRIPT: &[Step] = &[
|
|
Step::DownAt("canvas-plane", 420.0, 300.0),
|
|
Step::DragTo("canvas-plane", 300.0, 240.0),
|
|
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))
|
|
.child(tools::tools(window, cx))
|
|
.into_any_element()
|
|
}
|