Rename DrawCraft → VectorCraft: crates (vectorcraft-*), apps, binaries, types, env vars, docs, examples (.vectorcraft); old .drawcraft files and preferences still load. Fix: text bounds exact after opening a file; selection no longer marks a document modified (dirty = content differs from the saved document). Screenshots and renders regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Brandon Thomas
2026-10-01 14:30:09 -04:00
co-authored by Claude Opus 5.5
parent deb9df299c
commit 4878f1c5dd
279 changed files with 2526 additions and 2410 deletions
+16 -16
View File
@@ -7,15 +7,15 @@
//! `object.pattern.cancel` restores the previous definition. Both remove the layer.
//!
//! **Repeat** objects are live nodes (`NodeKind::Repeat`) holding the source art and the
//! arrangement; `drawcraft_doc::pattern` evaluates the instances.
//! arrangement; `vectorcraft_doc::pattern` evaluates the instances.
use std::sync::Arc;
use drawcraft_color::Paint;
use drawcraft_doc::pattern::{self, Overlap, PATTERN_EDIT_LAYER, PatternDef, PatternEdit, RepeatKind, RepeatSpec, TileType, pattern_paint};
use drawcraft_doc::{Document, Node, NodeId, NodeKind, Selection};
use drawcraft_geom::Rect;
use serde_json::{Value, json};
use vectorcraft_color::Paint;
use vectorcraft_doc::pattern::{self, Overlap, PATTERN_EDIT_LAYER, PatternDef, PatternEdit, RepeatKind, RepeatSpec, TileType, pattern_paint};
use vectorcraft_doc::{Document, Node, NodeId, NodeKind, Selection};
use vectorcraft_geom::Rect;
use super::edit::selected_roots;
use super::*;
@@ -300,7 +300,7 @@ fn pattern_make(s: &mut Session, p: &Value) -> Result<Value> {
let c = def.tile.center();
def.tile = Rect::from_center_size(c, (w.unwrap_or(def.tile.width()).max(1e-3), h.unwrap_or(def.tile.height()).max(1e-3)));
d.patterns.push(def);
d.swatches.push(drawcraft_color::Swatch { name: name.clone(), paint: pattern_paint(&name), global: false, spot: false });
d.swatches.push(vectorcraft_color::Swatch { name: name.clone(), paint: pattern_paint(&name), global: false, spot: false });
if edit {
enter_edit(d, sel, &name, None)?;
}
@@ -326,8 +326,8 @@ fn pattern_edit(s: &mut Session, p: &Value) -> Result<Value> {
.filter_map(|id| st.doc.node(*id))
.find_map(|n| {
n.appearance.items.iter().find_map(|it| match it {
drawcraft_doc::AppearanceItem::Fill(f) => pattern_name(&f.paint),
drawcraft_doc::AppearanceItem::Stroke(sk) => pattern_name(&sk.paint),
vectorcraft_doc::AppearanceItem::Fill(f) => pattern_name(&f.paint),
vectorcraft_doc::AppearanceItem::Stroke(sk) => pattern_name(&sk.paint),
})
})
.ok_or_else(|| bad(C, "give a pattern name or select an object painted with a pattern"))?
@@ -394,7 +394,7 @@ fn pattern_save_copy(s: &mut Session, p: &Value) -> Result<Value> {
def.fit_tile_to_art();
}
d.patterns.push(def);
d.swatches.push(drawcraft_color::Swatch { name: name.clone(), paint: pattern_paint(&name), global: false, spot: false });
d.swatches.push(vectorcraft_color::Swatch { name: name.clone(), paint: pattern_paint(&name), global: false, spot: false });
Ok(name)
})?;
Ok(json!({ "name": name }))
@@ -496,8 +496,8 @@ fn rename_pattern_uses(d: &mut Document, old: &str, new: &str) {
if let Some(n) = d.node_mut(id) {
for it in n.appearance.items.iter_mut() {
match it {
drawcraft_doc::AppearanceItem::Fill(f) => fix(&mut f.paint),
drawcraft_doc::AppearanceItem::Stroke(s) => fix(&mut s.paint),
vectorcraft_doc::AppearanceItem::Fill(f) => fix(&mut f.paint),
vectorcraft_doc::AppearanceItem::Stroke(s) => fix(&mut s.paint),
}
}
}
@@ -525,7 +525,7 @@ fn pattern_delete(s: &mut Session, p: &Value) -> Result<Value> {
}
let n = s.edit("Delete Pattern", |d, _| {
d.patterns.retain(|p| p.name != name);
let is_it = |sw: &drawcraft_color::Swatch| matches!(&sw.paint, Paint::Pattern { pattern, .. } if *pattern == name);
let is_it = |sw: &vectorcraft_color::Swatch| matches!(&sw.paint, Paint::Pattern { pattern, .. } if *pattern == name);
d.swatches.retain(|sw| !is_it(sw));
for g in &mut d.swatch_groups {
g.swatches.retain(|sw| !is_it(sw));
@@ -535,8 +535,8 @@ fn pattern_delete(s: &mut Session, p: &Value) -> Result<Value> {
if let Some(n) = d.node_mut(*id) {
for it in n.appearance.items.iter_mut() {
let p = match it {
drawcraft_doc::AppearanceItem::Fill(f) => &mut f.paint,
drawcraft_doc::AppearanceItem::Stroke(s) => &mut s.paint,
vectorcraft_doc::AppearanceItem::Fill(f) => &mut f.paint,
vectorcraft_doc::AppearanceItem::Stroke(s) => &mut s.paint,
};
if matches!(p, Paint::Pattern { pattern, .. } if *pattern == name) {
*p = Paint::None;
@@ -657,7 +657,7 @@ fn repeat_grid(s: &mut Session, p: &Value) -> Result<Value> {
let rows = p.get("rows").and_then(Value::as_u64).map(|v| v.clamp(1, 500) as u32);
let cols = p.get("cols").and_then(Value::as_u64).map(|v| v.clamp(1, 500) as u32);
make_repeat(s, p, "Grid Repeat", |src| {
let b = drawcraft_doc::live::nodes_bounds(&src).unwrap_or(Rect::new(0.0, 0.0, 10.0, 10.0));
let b = vectorcraft_doc::live::nodes_bounds(&src).unwrap_or(Rect::new(0.0, 0.0, 10.0, 10.0));
let mut r = RepeatSpec::grid(src, hs.unwrap_or(b.width() / 4.0), vs.unwrap_or(b.height() / 4.0));
if let RepeatKind::Grid { rows: rr, cols: cc, .. } = &mut r.kind {
*rr = rows.unwrap_or(*rr);
@@ -709,7 +709,7 @@ fn repeat_expand(s: &mut Session, _: &Value) -> Result<Value> {
let mut out = vec![];
for r in &reps {
let Some(n) = d.node(*r).cloned() else { continue };
let mut g = drawcraft_doc::live::expanded_group(&n, None);
let mut g = vectorcraft_doc::live::expanded_group(&n, None);
// The group keeps the repeat's id; every generated instance node gets a fresh one.
if let Some(ch) = g.children_mut() {