From d0489021b5eee37f41233c9f87ee646fac87ac0c Mon Sep 17 00:00:00 2001 From: Nigel Ihza Firdausy <106657905+Ni-zav@users.noreply.github.com> Date: Sat, 10 Oct 2026 15:47:58 +0700 Subject: [PATCH] fix(script): make Item.selected=false deselect only that item (#544) --- crates/script/src/prelude.js | 13 ++++++++++++- crates/script/src/tests.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/crates/script/src/prelude.js b/crates/script/src/prelude.js index f52765e7..8a41e0a0 100644 --- a/crates/script/src/prelude.js +++ b/crates/script/src/prelude.js @@ -1335,7 +1335,18 @@ Item.prototype = { get parentFolder() { return __item(this.__info().parent); }, set parentFolder(f) { __call("project.move", { items: [this.__id], folder: f && f.__id ? f.__id : null }); }, get selected() { return this.__info().selected; }, - set selected(v) { if (v) __call("project.select", { items: [this.__id], add: true }); }, + set selected(v) { + var selection = __get("project").selection; + var selected = selection.indexOf(this.__id) !== -1; + if (!!v === selected) return; + if (v) { + __call("project.select", { items: [this.__id], add: true }); + } else { + var id = this.__id; + // Replace just this item, preserving the other Project panel selections and their order. + __call("project.select", { items: selection.filter(function (item) { return item !== id; }) }); + } + }, get usedIn() { return this.__info().usedIn.map(function (c) { return new CompItem(c); }); }, remove: function () { __call("project.delete", { items: [this.__id] }); }, }; diff --git a/crates/script/src/tests.rs b/crates/script/src/tests.rs index 10deb79b..34f971ec 100644 --- a/crates/script/src/tests.rs +++ b/crates/script/src/tests.rs @@ -524,3 +524,31 @@ fn comp_preserves_nested_frame_rate_and_resolution() { let (_, c) = comp_named(&s, "Nested"); assert!(c.preserve_frame_rate && c.preserve_resolution); } + +#[test] +fn setting_item_selected_false_preserves_other_project_items() { + let mut s = session(); + let o = ok( + &mut s, + r#" + var target = app.project.items.addFolder("Target"); + var keep = app.project.items.addFolder("Keep"); + app.run("project.select", {items: []}); + keep.selected = true; + target.selected = true; + var states = [[target.selected, keep.selected]]; + target.selected = false; + states.push([target.selected, keep.selected]); + target.selected = false; // idempotent: never remove Keep + states.push([target.selected, keep.selected]); + target.selected = true; + states.push([target.selected, keep.selected]); + app.project.selection.map(function (item) { return item.name; }).join(",") + + "|" + JSON.stringify(states); + "#, + ); + assert_eq!( + o.result, + json!("Keep,Target|[[true,true],[false,true],[false,true],[true,true]]") + ); +}