diff --git a/ASSETS.md b/ASSETS.md
index 3233c99d0..15bf448ec 100644
--- a/ASSETS.md
+++ b/ASSETS.md
@@ -228,9 +228,12 @@ Generated-in-code art is original and has no file to list. This covers the defau
| `assets/icons/dc-transform-panel.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
| `assets/icons/dc-transparency.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
| `assets/icons/dc-twirl.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
+| `assets/icons/dc-type.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
| `assets/icons/dc-type-area.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
| `assets/icons/dc-type-path.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
| `assets/icons/dc-type-vertical.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
+| `assets/icons/dc-type-vertical-area.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
+| `assets/icons/dc-type-vertical-path.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
| `assets/icons/dc-width-profile.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
| `assets/icons/dc-width.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
| `assets/icons/dc-wrinkle.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | |
diff --git a/assets/icons/dc-touch-type.svg b/assets/icons/dc-touch-type.svg
index f5af072c9..24b305c87 100644
--- a/assets/icons/dc-touch-type.svg
+++ b/assets/icons/dc-touch-type.svg
@@ -1 +1 @@
-
+
diff --git a/assets/icons/dc-type-area.svg b/assets/icons/dc-type-area.svg
index f37960dae..31e53d2e0 100644
--- a/assets/icons/dc-type-area.svg
+++ b/assets/icons/dc-type-area.svg
@@ -1 +1 @@
-
+
diff --git a/assets/icons/dc-type-path.svg b/assets/icons/dc-type-path.svg
index 42584412c..6fc3fc0a6 100644
--- a/assets/icons/dc-type-path.svg
+++ b/assets/icons/dc-type-path.svg
@@ -1 +1 @@
-
+
diff --git a/assets/icons/dc-type-vertical-area.svg b/assets/icons/dc-type-vertical-area.svg
new file mode 100644
index 000000000..e5bd3c533
--- /dev/null
+++ b/assets/icons/dc-type-vertical-area.svg
@@ -0,0 +1 @@
+
diff --git a/assets/icons/dc-type-vertical-path.svg b/assets/icons/dc-type-vertical-path.svg
new file mode 100644
index 000000000..66a30346a
--- /dev/null
+++ b/assets/icons/dc-type-vertical-path.svg
@@ -0,0 +1 @@
+
diff --git a/assets/icons/dc-type-vertical.svg b/assets/icons/dc-type-vertical.svg
index d72855530..e7f157b44 100644
--- a/assets/icons/dc-type-vertical.svg
+++ b/assets/icons/dc-type-vertical.svg
@@ -1 +1 @@
-
+
diff --git a/assets/icons/dc-type.svg b/assets/icons/dc-type.svg
new file mode 100644
index 000000000..5ddf5a50e
--- /dev/null
+++ b/assets/icons/dc-type.svg
@@ -0,0 +1 @@
+
diff --git a/crates/tools/src/catalog.rs b/crates/tools/src/catalog.rs
index ac18d6beb..9bbd7cbdf 100644
--- a/crates/tools/src/catalog.rs
+++ b/crates/tools/src/catalog.rs
@@ -37,8 +37,8 @@ pub const TOOL_GROUPS: &[&[ToolInfo]] = &[
t("areaType", "Area Type Tool", None, "tool-type-area"),
t("typeOnPath", "Type on a Path Tool", None, "tool-type-path"),
t("verticalType", "Vertical Type Tool", None, "tool-type-vertical"),
- t("verticalAreaType", "Vertical Area Type Tool", None, "tool-type-vertical"),
- t("verticalTypeOnPath", "Vertical Type on a Path Tool", None, "tool-type-path"),
+ t("verticalAreaType", "Vertical Area Type Tool", None, "tool-type-vertical-area"),
+ t("verticalTypeOnPath", "Vertical Type on a Path Tool", None, "tool-type-vertical-path"),
t("touchType", "Touch Type Tool", Some("Shift+T"), "tool-touch-type"),
],
&[
diff --git a/crates/ui-egui/src/icon_data.rs b/crates/ui-egui/src/icon_data.rs
index 33ddde543..579df2187 100644
--- a/crates/ui-egui/src/icon_data.rs
+++ b/crates/ui-egui/src/icon_data.rs
@@ -174,9 +174,12 @@ pub static ICONS: &[(&str, &[u8])] = &[
("dc-transform-panel", include_bytes!("../../../assets/icons/dc-transform-panel.svg")),
("dc-transparency", include_bytes!("../../../assets/icons/dc-transparency.svg")),
("dc-twirl", include_bytes!("../../../assets/icons/dc-twirl.svg")),
+ ("dc-type", include_bytes!("../../../assets/icons/dc-type.svg")),
("dc-type-area", include_bytes!("../../../assets/icons/dc-type-area.svg")),
("dc-type-path", include_bytes!("../../../assets/icons/dc-type-path.svg")),
("dc-type-vertical", include_bytes!("../../../assets/icons/dc-type-vertical.svg")),
+ ("dc-type-vertical-area", include_bytes!("../../../assets/icons/dc-type-vertical-area.svg")),
+ ("dc-type-vertical-path", include_bytes!("../../../assets/icons/dc-type-vertical-path.svg")),
("dc-width", include_bytes!("../../../assets/icons/dc-width.svg")),
("dc-width-profile", include_bytes!("../../../assets/icons/dc-width-profile.svg")),
("dc-wrinkle", include_bytes!("../../../assets/icons/dc-wrinkle.svg")),
diff --git a/crates/ui-egui/src/icons.rs b/crates/ui-egui/src/icons.rs
index 8987cc64c..a3601af18 100644
--- a/crates/ui-egui/src/icons.rs
+++ b/crates/ui-egui/src/icons.rs
@@ -29,10 +29,12 @@ pub fn tool_icon(name: &str) -> &'static str {
"tool-pen-delete" => "pen-tool-delete",
"tool-anchor" => "dc-anchor",
"tool-curvature" => "spline",
- "tool-type" => "type",
+ "tool-type" => "dc-type",
"tool-type-area" => "dc-type-area",
"tool-type-path" => "dc-type-path",
"tool-type-vertical" => "dc-type-vertical",
+ "tool-type-vertical-area" => "dc-type-vertical-area",
+ "tool-type-vertical-path" => "dc-type-vertical-path",
"tool-touch-type" => "dc-touch-type",
"tool-line" => "dc-line",
"tool-arc" => "dc-arc",
@@ -212,6 +214,20 @@ mod tests {
assert_ne!(add, delete, "plus and minus differ");
}
+ /// The seven type tools each have an icon of their own, drawn for VectorCraft (the vertical
+ /// Area and Path tools used to borrow the horizontal ones' icons).
+ #[test]
+ fn every_type_tool_has_its_own_icon_with_the_same_t() {
+ let tools = ["type", "areaType", "typeOnPath", "verticalType", "verticalAreaType", "verticalTypeOnPath", "touchType"];
+ let names: Vec<&str> = tools.iter().map(|id| tool_icon(vectorcraft_tools::catalog::tool_info(id).unwrap().icon)).collect();
+ let unique: std::collections::BTreeSet<_> = names.iter().collect();
+ assert_eq!(unique.len(), tools.len(), "{names:?}");
+ for name in &names {
+ assert!(name.starts_with("dc-"), "{name} is drawn for VectorCraft");
+ assert!(exists(name), "{name}");
+ }
+ }
+
#[test]
fn shared_catalog_preserves_fallback_and_tool_aliases() {
let ImageSource::Bytes { uri, bytes } = source("missing-icon") else { panic!("expected SVG bytes") };