Merge pull request #1160 from storytold/fix/1133-zigzag-dialog
#1133: Zig Zag's dialog has sliders and radio buttons, as in Illustrator
This commit is contained in:
commit
4eaa5f0b56
File diff suppressed because one or more lines are too long
|
|
@ -138,6 +138,7 @@ fn body(app: &mut VectorcraftApp, ui: &mut egui::Ui, d: &mut Dialog) -> bool {
|
|||
Some(plugin) => form::schema_fields(ui, d, &plugin.manifest().params),
|
||||
None if vectorcraft_effects::is_adjustment(&id) => adjust_fields(ui, d),
|
||||
None if id == TRANSFORM => transform_fields(ui, d, app.session.general_unit()),
|
||||
None if id == ZIG_ZAG => zig_zag_fields(ui, d, app.session.general_unit()),
|
||||
None => {
|
||||
let doc = vectorcraft_effects::effect_info(&id).map(|e| e.params).unwrap_or_default();
|
||||
let unit = app.session.general_unit();
|
||||
|
|
@ -313,6 +314,55 @@ fn transform_fields(ui: &mut egui::Ui, d: &mut Dialog, unit: vectorcraft_doc::Un
|
|||
values_changed(d)
|
||||
}
|
||||
|
||||
/// The Zig Zag effect (Effect › Distort & Transform › Zig Zag…).
|
||||
const ZIG_ZAG: &str = "distort.zigZag";
|
||||
|
||||
/// Zig Zag's dialog (#1133): Size and Ridges per segment as sliders with their fields, Relative or
|
||||
/// Absolute and the Points as radio buttons. Returns whether the values differ from those last
|
||||
/// previewed.
|
||||
fn zig_zag_fields(ui: &mut egui::Ui, d: &mut Dialog, unit: vectorcraft_doc::Unit) -> bool {
|
||||
const LABEL_W: f32 = 124.0;
|
||||
const FIELD_W: f32 = 70.0;
|
||||
let rail = Tokens::get(ui.ctx()).input_border;
|
||||
let track = move |_| rail;
|
||||
let relative = d.bool("relative");
|
||||
widgets::subheader(ui, tl!("Options"));
|
||||
// Size is a share of the object's size (Relative) or a distance (Absolute).
|
||||
widgets::label_row(ui, tl!("Size:"), LABEL_W, |ui| {
|
||||
form::slider_rail(ui, d, "size", 0.0..=100.0, &track);
|
||||
if !relative {
|
||||
form::length(ui, d, "size", unit, FIELD_W);
|
||||
} else if let Some(n) = widgets::range_field(ui, ("zz", "size"), d.f64("size", 10.0), 0.0..=100.0, "%", 0, FIELD_W) {
|
||||
d.fields.insert("size".into(), json!(n));
|
||||
}
|
||||
});
|
||||
ui.horizontal(|ui| {
|
||||
ui.add_space(LABEL_W + ui.spacing().item_spacing.x);
|
||||
for (label, on) in [(tl!("Relative"), true), (tl!("Absolute"), false)] {
|
||||
if widgets::radio(ui, label, relative == on, true) {
|
||||
d.fields.insert("relative".into(), json!(on));
|
||||
}
|
||||
}
|
||||
});
|
||||
widgets::label_row(ui, tl!("Ridges per segment:"), LABEL_W, |ui| {
|
||||
form::slider_rail(ui, d, "ridges", 0.0..=100.0, &track);
|
||||
if let Some(n) = widgets::range_field(ui, ("zz", "ridges"), d.f64("ridges", 4.0), 0.0..=100.0, "", 0, FIELD_W) {
|
||||
d.fields.insert("ridges".into(), json!(n));
|
||||
}
|
||||
});
|
||||
ui.add_space(4.0);
|
||||
widgets::subheader(ui, crate::i18n::tr_ctx(crate::i18n::current(), "effect", "Points"));
|
||||
let points = d.str("points");
|
||||
ui.horizontal(|ui| {
|
||||
for (label, value) in choices(ZIG_ZAG, "points").unwrap_or_default() {
|
||||
if widgets::radio(ui, crate::i18n::tr_ctx(crate::i18n::current(), "effect", label), points == *value, true) {
|
||||
d.fields.insert("points".into(), json!(value));
|
||||
}
|
||||
}
|
||||
});
|
||||
values_changed(d)
|
||||
}
|
||||
|
||||
/// Curves' graph of its `points` (input across, output up, 0..255): drag a point to move it
|
||||
/// between its neighbours, press on the graph away from the points to add one there, drag one
|
||||
/// off the graph to remove it (two always stay).
|
||||
|
|
|
|||
|
|
@ -540,3 +540,18 @@ fn artboard_options_position_moves_art_only_with_the_tool_option_on() {
|
|||
assert_eq!(*app.session.doc().unwrap().doc, *before);
|
||||
}
|
||||
}
|
||||
|
||||
/// Zig Zag's dialog has Size and Ridges per segment sliders, and Relative / Absolute and Smooth /
|
||||
/// Corner as radio buttons, not dropdowns (#1133).
|
||||
#[test]
|
||||
fn zig_zag_has_sliders_and_radio_buttons() {
|
||||
let mut app = app();
|
||||
app.run("shape.rectangle", json!({"x": 10, "y": 10, "width": 50, "height": 50})).unwrap();
|
||||
app.run("effect.dialog", json!({"effect": "distort.zigZag"})).unwrap();
|
||||
let text = crate::tests_labels::painted_text(&mut app, |app, ui| show(app, ui.ctx()));
|
||||
let lines: Vec<&str> = text.lines().map(str::trim).collect();
|
||||
for want in ["Size:", "Relative", "Absolute", "Ridges per segment:", "Points", "Smooth", "Corner"] {
|
||||
assert!(lines.contains(&want), "no {want:?} in {lines:?}");
|
||||
}
|
||||
assert!(!lines.contains(&"Ridges:"), "{lines:?}");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2583,6 +2583,8 @@
|
|||
Size Tile to Art Kachelgröße an Grafik anpassen
|
||||
Size/Leading Größe/Zeilenabstand
|
||||
Size: Größe:
|
||||
Ridges per segment: Zacken pro Segment:
|
||||
effect Points Punkte
|
||||
Size: {size} Tracking: {tracking} Größe: {size} Laufweite: {tracking}
|
||||
Skew Neigen
|
||||
Skin Tone Ramps Hauttonskalen
|
||||
|
|
|
|||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
|
|
@ -2634,6 +2634,7 @@
|
|||
Size Tile to Art Ajustar tamaño del mosaico a la ilustración
|
||||
Size/Leading Tamaño/interlineado
|
||||
Size: Tamaño:
|
||||
Ridges per segment: Crestas por segmento:
|
||||
Size: {size} Tracking: {tracking} Tamaño: {size} Espaciado: {tracking}
|
||||
Skew Sesgar
|
||||
Skin Tone Ramps Rampas de tonos de piel
|
||||
|
|
|
|||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
|
|
@ -2631,6 +2631,7 @@
|
|||
Size Tile to Art Ajuster le carreau à l’illustration
|
||||
Size/Leading Taille/interlignage
|
||||
Size: Taille :
|
||||
Ridges per segment: Crêtes par segment :
|
||||
Size: {size} Tracking: {tracking} Taille : {size} Approche : {tracking}
|
||||
Skew Inclinaison
|
||||
Skin Tone Ramps Gammes de tons chair
|
||||
|
|
|
|||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
|
|
@ -2634,6 +2634,7 @@
|
|||
Size Tile to Art Adatta tassello alla grafica
|
||||
Size/Leading Dimensione/interlinea
|
||||
Size: Dimensione:
|
||||
Ridges per segment: Creste per segmento:
|
||||
Size: {size} Tracking: {tracking} Dimensione: {size} Spaziatura caratteri: {tracking}
|
||||
Skew Inclinazione
|
||||
Skin Tone Ramps Scale di tonalità della pelle
|
||||
|
|
|
|||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
|
|
@ -2456,6 +2456,7 @@
|
|||
Size Tile to Art タイルをアートワークのサイズに合わせる
|
||||
Size/Leading サイズ/行送り
|
||||
Size: サイズ:
|
||||
Ridges per segment: セグメントごとの山数:
|
||||
Size: {size} Tracking: {tracking} サイズ:{size} トラッキング:{tracking}
|
||||
Skip Blank Artboards 空白のアートボードをスキップ
|
||||
Slice Options スライスオプション
|
||||
|
|
|
|||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
|
|
@ -2630,6 +2630,7 @@
|
|||
Size Tile to Art Подогнать плитку по рисунку
|
||||
Size/Leading Размер/интерлиньяж
|
||||
Size: Размер:
|
||||
Ridges per segment: Гребней на сегмент:
|
||||
Size: {size} Tracking: {tracking} Размер: {size} Трекинг: {tracking}
|
||||
Skew Скос
|
||||
Skin Tone Ramps Шкалы тонов кожи
|
||||
|
|
|
|||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
|
|
@ -2626,6 +2626,8 @@
|
|||
Size Tile to Art Підігнати плитку за малюнком
|
||||
Size/Leading Розмір/інтерліньяж
|
||||
Size: Розмір:
|
||||
Ridges per segment: Гребенів на сегмент:
|
||||
effect Points Точки
|
||||
Size: {size} Tracking: {tracking} Розмір: {size} Трекінг: {tracking}
|
||||
Skew Скіс
|
||||
Skin Tone Ramps Шкали тонів шкіри
|
||||
|
|
|
|||
|
Can't render this file because it has a wrong number of fields in line 13.
|
|
|
@ -2522,6 +2522,7 @@
|
|||
Size Tile to Art 使拼贴适合图稿
|
||||
Size/Leading 字号/行距
|
||||
Size: 尺寸:
|
||||
Ridges per segment: 每段起伏数:
|
||||
Size: {size} Tracking: {tracking} 大小:{size} 字距:{tracking}
|
||||
Skew 倾斜
|
||||
Skin Tone Ramps 肤色渐变
|
||||
|
|
|
|||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
|
|
@ -2612,6 +2612,7 @@
|
|||
Size Tile to Art 拼貼符合圖稿大小
|
||||
Size/Leading 大小/行距
|
||||
Size: 大小:
|
||||
Ridges per segment: 每段起伏數:
|
||||
Size: {size} Tracking: {tracking} 大小:{size} 字距:{tracking}
|
||||
Skew 傾斜
|
||||
Skin Tone Ramps 膚色漸階
|
||||
|
|
|
|||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
|
|
@ -1,6 +1,6 @@
|
|||
# Effects parity
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first checklist, counted from the effects catalogue) · **Target:** Adobe Illustrator 2026 (30.x)
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-11 · **Change:** minor (Zig Zag's dialog with sliders and radio buttons, #1133; earlier: Brush Strokes landed) · **Target:** Adobe Illustrator 2026 (30.x)
|
||||
|
||||
Every entry of Illustrator's Effect menu, by its public feature name, against VectorCraft's effects catalogue
|
||||
(`effect_catalog()` in `crates/effects/src/lib.rs`) and the Effect menu built from it
|
||||
|
|
@ -72,6 +72,7 @@ rendering, Turntable, 3D export) is 45–75 h, still the largest single gap.
|
|||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-11 | minor | Zig Zag's dialog: Size and Ridges per segment sliders, Points as Smooth / Corner radio buttons (#1133) |
|
||||
| 2026-10-11 | minor | Brush Strokes landed (8 filters): 28/57 Photoshop effects |
|
||||
| 2026-10-10 | minor | Initial Revolve landed (#846) |
|
||||
| 2026-10-10 | major | First checklist, counted from the effects catalogue (20/57 Photoshop effects, 44/50 Illustrator effects) |
|
||||
|
|
|
|||
Loading…
Reference in New Issue