diff --git a/crates/script/src/prelude.js b/crates/script/src/prelude.js index 76155b82..f707daf7 100644 --- a/crates/script/src/prelude.js +++ b/crates/script/src/prelude.js @@ -1342,7 +1342,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 60f59ca3..45be6225 100644 --- a/crates/script/src/tests.rs +++ b/crates/script/src/tests.rs @@ -564,3 +564,31 @@ fn text_document_baseline_flags_reflect_pending_edits_and_applied_value() { ]) ); } + +#[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]]") + ); +}